作者:matrix
发布时间:2022-04-01
分类:Linux
撤销本地修改
本地代码仅是修改,还未做任何提交(add/commit操作)
$ git checkout file_name_path_1 file_name_path_2 file_name_path_3... #撤销指定文件的修改
$ git checkout . #撤销所有文件的修改
git checkout会直接还原修改的文件到仓库版本
撤销add
$ git reset HEAD file_name_path1 #指定还原文件的add操作
$ git reset HEAD #还原所有文件
撤销commit
已经commit提交,没有push到远端
#修改(替换)掉上次的commit
$ git commit --amend -m "Fix bug #42"
#撤销commit操作(保留修改)
$ git reset HEAD^ #回到上一提交版本
#撤销commit操作(放弃修改)
$ git reset --hard HEAD^
#手动reset 版本id
$ git reset [--soft|--mixed|--hard] COMMIT_ID #COMMIT_ID为需要还原到的正确版本(正确要保留的版本)
--mixed
会保留源码,只是将git commit和index 信息回退到了某个版本.
--soft
保留源码,只回退到commit信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.
--hard
源码也会回退到某个版本,commit和index 都会回退到某个版本.(注意,这种方式是改变本地代码仓库源码)
撤销push
还原已提交push的修改,本质是新增commit提交
方法1 还原指定版本的修改:
$ git revert COMMIT_ID #COMMIT_ID为需要撤销的版本(丢弃不要的版本)
$ git push #再执行推送
方法2 硬删除之后的所有提交:
$ git reset --hard COMMID_ID #最近提交需要的版本(删除之后的所有提交)
$ git push -f
http://www.ruanyifeng.com/blog/2019/12/git-undo.html
http://blog.csdn.net/zhangkongzhongyun/article/details/8025288
https://www.cnblogs.com/wuyun-blog/p/10026363.html
https://www.jianshu.com/p/37f3a7e4a193
作者:matrix
发布时间:2021-09-03
分类:零零星星
现在我需要svn或者git的提交同步到其他远程仓库(svn或git),也就是同步操作。这里的同步最小单位为单次的提交commit。
配合之前的「使用git-svn管理svn仓库」可以完美解决这个问题,利用git来中转管理我们手上的仓库代码。
场景:
有多个相同代码的SVN仓库,我不想全部迁移到git。然而每次修改一个功能的代码就必须手动复制到其他的远程svn/git仓库上,代码相似但又不能直接替换。。。
之前使用git cherry-pick可以解决这个问题,但是要单独给svn用就会很麻烦。尝试用git svn
中转试试!
1. 本地添加远程仓库
如果是svn仓库,先使用git svn clone svn://xxx.com/xxx
克隆svn仓库到本地
2. 本地添加远程仓库
没有找到命令行的方式添加远程仓库分支,但是可以修改 .git/config
文件达到目的。
项目/.git/config
文件中新增svn-remote
配置:
[core]
...
[svn-remote "svn"]
...
[svn-remote "qingsui"]
url = svn://xxxx/qingsui
fetch = :refs/remotes/git-svn-qingsui
- 添加远程git仓库:
可以直接使用git命令添加:
$ git remote add remote-repository-name https://git.weixin.qq.com/xxx.git
注意:remote-repository-name 为自定义的分支名
3. 拉取远程代码
$ git svn fetch qingsui
如果需要pull操作来自动更新合并执行命令git svn rebase
$ git fetch remote-repository-name
4.新建对应的本地分支
$ git checkout -b qingsui remotes/git-svn-qingsui
$ git branch -a # 查看本地分支情况
$ git checkout -b remote-repository-name remotes/remote-repository-name/master
5. 将commit提交合并到新分支
commit_id
是需要同步到其他远程分支的commit id。
$ git cherry-pick {commit_id}
6. 推送修改到远程仓库
$ git svn dcommit
$ git push
完美解决,实际上就是使用git来操作。
同步到远程svn仓库操作脚本
#!/bin/bash
#同步commit到其他远程仓库
#example: shell.sh dade,qingsui commitID1,commitID2
# dade,qingsui 为`git branch`本地分支名字
if [ ! $1 -o ! $2 ]; then
echo -e "usage example: \n $ shell.sh dade,qingsui commitID1,commitID2"
exit
fi
repo_arr=(`echo $1 | tr ',' ' '`)
commit_arr=(`echo $2 | tr ',' ' '`)
for repo in ${repo_arr[@]};do
for commit_id in ${commit_arr[@]};do
git checkout $repo
git svn rebase #git pull操作
git cherry-pick $commit_id
git svn dcommit
git checkout master
echo -e "\n"
done
done
说明:
如果自动合并有冲突会操作会失败,需要手动修改再提交&推送。
如果需要git-svn自动输入密码>> https://www.hhtjim.com/git-svn-save-password-credentials-from-input.html
参考:
https://coderwall.com/p/vfop7g/add-an-svn-remote-to-your-git-repo
https://superuser.com/questions/354819/git-svn-pass-password-on-command-line
作者:matrix
发布时间:2021-08-24
分类:兼容并蓄
git-svn工具是git对比较老的svn的兼容性支持,可以直接对svn仓库进行管理。git-svn内部其实是使用perl脚本处理svn命令,没有的话要重新安装git。之后就可以任意使用git的功能了,比如stash。
mac环境下直接输入命令git svn --version
检查是否可用。
出现问题最好是重新安装svn和git:
$ brew reinstall subversion
$ brew reinstall git
clone项目
$ git svn clone svn://username@svn.hhtjim.com/repos
修改&提交
这里和git仓库操作一致
$ git add .
$ git commit -m "first commmit"
推送到远程仓库
使用git svn dcommit
代替git push
命令
$ git svn dcommit
查看本地仓库的svn地址信息
$ git svn info
参考:
https://www.jianshu.com/p/6a3afcb59fa9
作者:matrix
发布时间:2021-08-12
分类:兼容并蓄
使用git-svn管理svn项目每次操作都要输入密码 😳
之前尝试过 echo password | git svn rebase
来自动输入,还有删除~/.subversion/auth
目录的方法都还是失败,不能达到免输入密码的效果。
办法
以mac为例,打开应用钥匙串访问
,删除掉对应svn项目地址的钥匙串<svn://svn.XXXX:3690>
密码。
之后马上使用git svn
命令操作,系统会自动保存新的密钥在钥匙串中。
这样在任何程序操作之前去保存密码就可行。git-svn是读取系统保存的密钥,之所以有问题因为密钥是之前的程序授权的,现在使用git-svn也就无法读取。
这样操作之后我这里其他程序没有影响,如果有问题的话可以自行到svn项目目录执行缓存密码凭证操作。
$ svn update --username 'user' --password 'password'
参考:
https://newbedev.com/does-git-svn-store-svn-passwords
作者:matrix
发布时间:2021-07-31
分类:零零星星
不同的仓库可以互相同步其中任意提交的commit吗?可以的~
现有仓库enc,qsui,dada。三个的代码基本相同但是没有新建分支来区别。
本地会经常修改enc代码来提交到其远程仓库,但是其他仓库咋办?我不想每个再修改提交。
办法
大致思路就是本地仓库添加其他remote远程分支,本地抓取之后新建本地分支进行关联,再git cherry-pick
合并提交到本地新的分支,之后push即可。
步骤
$ git remote add dada https://git.weixin.qq.com/wx_wx8fffaa009d109aa1/dada.git
$ git remote -v # 查看远程仓库分支
$ git fetch dada
$ git checkout -b dada dada/master #远程dada/master分支新建为本地分支「dada」,且当前分支切换到dada
$ git branch -a # 查看本地分支情况
* dada
master
remotes/dada/master
remotes/origin/master
$ git cherry-pick d4df33b962910XXXX
$ git push dada dada:master
一句话同步操作
$ git checkout qsui && git cherry-pick dad6432037fcadcd35405aaa331dd367e58b1e2e && git push qsui qsui:master
多分支多commit操作脚本
#!/bin/bash
#example: shell.sh dada,qsui commitID1,commitID2
# 同步commit到其他远程仓库
if [ ! $1 -o ! $2 ]; then
echo -e "usage example: \n $ shell.sh dada,qsui commitID1,commitID2"
exit
fi
repo_arr=(`echo $1 | tr ',' ' '`)
commit_arr=(`echo $2 | tr ',' ' '`)
for repo in ${repo_arr[@]};do
for commit_id in ${commit_arr[@]};do
git checkout $repo
git pull
git cherry-pick $commit_id
git push $repo $repo:master
echo -e "\n"
done
done
git checkout master
参考:
https://www.bestyii.com/topic/40
https://blog.zengrong.net/post/bash_array/
https://blog.csdn.net/Jerry_1126/article/details/83930956
作者:matrix
发布时间:2019-06-18
分类:Linux
测试环境:ubuntu
客户端连接远程ssh/git服务的时候可以在本地配置SSH config
,用于简化多参数使用操作或者修改默认的ssh命令使用的配置。
我这里需要使用gitee的ssh密钥来管理远程仓库代码,方便以后可以免密码提交/更新代码。然而本地已经存在一个~/.ssh/id_rsa
私钥,且还设置了用来保护私钥的passphrase密码。如果用之前的私钥连接gitee会造成每次都要求输入passphrase密码,亦或不能单独区分使用。
这个问题可以使用配置文件~/.ssh/config
来解决
新建新的密钥对
$ ssh-keygen -t rsa -C "user"
新建的时候设置新密钥的保存路径,避免把之前的覆盖掉
配置
config文件默认是不存在的,直接新建即可
$ vi ~/.ssh/config
使用下面配置:
# gitee账户
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rrsa_gitee
说明:
Host类型昵称,可以简化登录的输入地址,比如Host ccl
,则可以用ssh ccl
直接连接
HostName表示连接的远程主机地址
IdentityFile表示指定私钥文件路径
还有其他参数
Port指定端口
User指定用户名
这种配置可以让ssh来根据远程host地址来使用不同的私钥,设置了User还可以让ssh工具不同用户名来读取配置,也可以使用相同host地址哟~
比如都是github的不同账户,类似配置:
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/user1_rsa
User user1
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/user2_rsa
User user2
参考:
https://gitee.com/help/articles/4229
http://vra.github.io/2017/07/09/ssh-config/
https://gitee.com/help/articles/4181
https://daemon369.github.io/ssh/2015/03/21/using-ssh-config-file
PEACE~
作者:matrix
发布时间:2018-12-01
分类:零零星星
git仓库之前可以简单的实现包含所有提交信息数据完全搬迁操作。在之前link站的git仓库使用的csdn,后来没有维护就转移到了gitee。最近发现墙外的环境无法正常连接到gitee,也就想试试git仓库的迁移。
新建空白仓库
在新仓库建立git项目,我这里用的腾讯开发者云 https://dev.tencent.com/
获取git地址 如:https://git.dev.tencent.com/plola/link.git
克隆旧库到本地
git clone https://gitee.com/rollio/link.git --bare
说明:
--bare 参数用于复制裸仓库也就是只是复制一个类似软连接的东西.git信息 不会把仓库中的代码文件copy下来
这个裸仓库只会保存git提交的历史版本信息,上面不能进行各种git操作
推送到新库
cd link.git/ #进入刚刚克隆时生成的git目录
git push https://git.dev.tencent.com/plola/link.git --all #推送数据
git push https://git.dev.tencent.com/plola/link.git --tags #推送标签
最终完成。 操作就几步,真的很简单方便。以后再也不用担心git数据搬家问题了,以后我的所有commit都在 哈哈。
参考:
https://coding.net/help/doc/git/import.html
https://blog.csdn.net/feizxiang3/article/details/8065506
PEACH~
作者:matrix
发布时间:2014-08-31
分类:零零星星
放在jae的代码修改的时候使用git方便很多,由于没有接触过GIT,这里记录一些。
以win8-64bit为例:
安装工具
msysGit[Git-1.9.4-preview20140611]
TortoiseGit-64bit
TortoiseGit-64bit中文语言包
汉化步骤
安装完这仨文件后重启。
右击资源管理器任意空白位置,选择 TortoiseGit -> Settings
从右侧语言设置中,选择简体中文。
参考:http://www.freehao123.com/jae-git/