分享git的几个小技巧,后面会根据使用补充。目前包括git撤销本地修改、git回退到前n个版本、git多用户提交冲突解决、git 命令简化。欢迎大家补充^_*
1、git撤销本地修改
1 2 |
git reset --hard origin/master git pull |
2、git回退到前n个版本
如下为向前回退3个版本,git reset –hard HEAD~3
3、git多用户提交冲突一
场景:用户UserA修改了文件File1,用户UserB也修改了文件File1并成功merge到了服务器上,而UserA和UserB改动了同一个代码块,当UserA拉取代码时git无法merge此改动,就会出现如下错误提示,
error: Your local changes to the following files would be overwritten by merge: cn/trinea/appsearch/MainActivity.java
Please, commit your changes or stash them before you can merge.
这时
(1) 如果希望保存本地改动并拉下最新服务器代码,手动merge,使用命令如下:
1 2 3 4 |
git stash git pull git stash pop git diff -w cn/trinea/appsearch/MainActivity.java |
其中git stash表示备份当前工作区内容到git栈中,并使当前工作区内容与上次提交时一致,然后git pull拉取最新代码,git stash pop表示从Git栈中读取最近一次保存的内容,恢复工作区的相关内容,最后git diff表示手动merge你之前冲突的文件
(2) 如果希望服务器上版本完全覆盖本地修改,使用如下命令回退并更新:
1 2 |
git reset --hard git pull |
4、git多用户提交冲突二
场景:用户UserA提交了change A,没有merge,之后用户UserB提交了change B,merge成功。当merge change A时出错,会提示,
The change could not be merged due to a path conflict.
Please rebase the change locally and upload the rebased commit for review.
大多数人的解决方式都是拷贝改动代码,并重拉最新代码Beyond Compare,重新提交。其实几条命令就可以搞定,gerrit上先abandon原来的提交,后执行如下命令:
1 2 3 4 |
git reset --hard HEAD~2 git pull git fetch ssh://xxxx refs/changes/46/28146/1 && git cherry-pick FETCH_HEAD git push gerrit:xxxxxx HEAD:refs/for/xxxxxx |
其中git reset –hard HEAD~2表示本地代码后退两级,如果有问题可以多后退几次
git pull表示拉最新代码
git fetch 表示获取之前没merge成功的改动到本地,后面跟的具体地址为gerrit上该change review页面选择cherry-pick、ssh后的地址,如下图红线标识
git push 跟平时push一样
5、git命令简化
(1) 简化git push命令
通常git push命令为git push gerrit:aaa HEAD:refs/for/bbb,其实可简化为git push。
编辑git库下的.git/config文件,在[remote "remoteName"]下添加两行
1 2 |
pushurl=gerrit:aaa.git push=HEAD:refs/for/bbb |
以后提交只需要用git push即可。
(2) 简化git add *;git commit -a;git push命令,一步完成添加、commit、push
第(1)步配好后,你还可以将命令git add *;git commit -a;git push添加别名到系统path中,如下操作:
vim ~/.bash_profile,文件最后添加
1 2 |
# add by trinea.cn for git simplify alias gpush='git add *;git commit -a;git push' |
source ~/.bash_profile
这样以后只需要gpush即可完成添加、commit、push,当然你也可以取其他的别名如gp、gitpush、gitp。
1
1
在情况4中,合并时发生冲突的情况,不需要abandon,直接rebase然后手动解冲突就可以了。abandon会让log显得很乱啊。
情况4中的path conflict是gerrit的行为吧,我也遇到了这种情况,本地按照这种顺序merge没问题,提到gerrit上进行merge和rebase就conflict了
1
1l4TxBbD6
1*1
1*if(now()=sysdate(),sleep(15),0)
10′XOR(1*if(now()=sysdate(),sleep(15),0))XOR’Z
(select(0)from(select(sleep(15)))v)/*’+(select(0)from(select(sleep(15)))v)+’”+(select(0)from(select(sleep(15)))v)+”*/
1-1; waitfor delay ’0:0:15′ –
1-1); waitfor delay ’0:0:15′ –
1-1 waitfor delay ’0:0:15′ –
1L7RmMhZP’; waitfor delay ’0:0:15′ –
1-1 OR 499=(SELECT 499 FROM PG_SLEEP(15))–
1-1) OR 812=(SELECT 812 FROM PG_SLEEP(15))–
1-1)) OR 60=(SELECT 60 FROM PG_SLEEP(15))–
1hSkgu1dY’ OR 958=(SELECT 958 FROM PG_SLEEP(15))–
1HC0s9Ej1′) OR 904=(SELECT 904 FROM PG_SLEEP(15))–
1pN14xyQc’)) OR 169=(SELECT 169 FROM PG_SLEEP(15))–
1*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)
1′||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||’