前言
虽然工作了很多年,但对于git的指令总是搞不清,所以以前用了好几年的sourceTree,只要点点点就好了。后来是用的vscode中的源代码管理器,也是点点点就行了。
之前最怕遇到的情况就是,远端有更新(其他人提交了代码),自己也改了代码要提交。正常情况下,需要先pull
,再commit+push
自己的代码。但sourceTree和vscode太方便了,远端有更新了,会提示你有要拉取的内容,但这玩意有延迟。这时候看到没有提示远端有更新,直接commit+push
,然后就会提示你远端有更新了,你要先拉取 。然后拉取的时候,又提示你本地有更改,需要先commit。
sourceTree是这样提示的,可能是自己用的有问题,因为自己对git实在说不上多熟😂。拉又拉不下来,提又提不上去,然后就崩了。对这种情况一直非常担心,因为自己不会搞,也搜了一些讲git的文章,看的时候总是感觉,这次终于搞懂了,等又遇到问题,又不会了。
记录一下,以后又不会了,有个地方参考(主要给自己看)。写的不对的轻喷。
1. 合并后发现有冲突
此时,没有冲突的文件,add
到了暂存区,冲突文件在工作区。
这时候,不想处理冲突了,想取消此次合并,可以使用:
bash
git merge --abort
结果:相当于没有合并过
2. 合并后没有冲突
此时,会产生一个提交;提交会重置合并状态。这个时候如果使用git merge --abort
,会提示:没有要取消的合并 。
如果这时候,你发现合错分支了,想要取消合并,可以使用:
bash
git reset --soft HEAD~1
结果:会在暂存区看到合并过来的改动
如果使用:
bash
git reset --hard HEAD~1
结果:相当于没有合并过
由此可知:reset
相当于重置commit
,回到commit
前;如果想要reset
最近的3个commit
,那就使用git reset --hard HEAD~3
。
3. 合并后没有冲突,并且手动push到了远程仓库
此时,发现合并错了,想要取消合并,那就不止要修改本地仓库,还得修改远程仓库,可以使用:
bash
git reset --hard HEAD~1
git push -f origin <branch>
git reset --hard HEAD~1
,由上可知,reset
会重置提交,相当于取消本地仓库的合并,本次仓库和工作区,会回到合并前的状态;这时候,会提示有可更新的内容,毕竟此时本地仓库落后远程仓库。当然,如果已经push
好几次了,才发现错了,只要把HEAD~1
改成HEAD~<对应的次数>
git push -f origin <branch>
强制推送本地仓库,覆盖远程仓库。本地仓库的版本落后远程仓库,只能强制推送。
适用于这个分支,没有其他人提交新内容的情况。
还可以使用:
bash
git revert <最新提交> <次新提交> <最旧提交>
git push origin <branch>
git revert
会生产一个对应commit
的反commit
,相当于把此次commit
的内容,手动改回去,然后再次commit
。这样的话,不会影响到其他人提交的改动。
git push origin <branch>
不需要强制覆盖。
4. 远端有了新的改动,没有注意到,先进行了commit
一般情况下,远端有了改动,我们需要先pull
,把远程仓库的最新代码,同步到本地仓库和工作区。
直接git pull
,如果没有冲突的话,会正常pull
下来,这时候正常push
即可;
如果有冲突,你会发现pull
下来后,工作区会出现冲突文件,解决冲突,add
+commit
+push
。
这个我怎么感觉在sourceTree上,会提示需要本地先提交还是什么 ,终究还是自己不会用。直接通过指令
的话,是可以pull
下来的,即使有冲突。
说明
这只是一个个人的记录,自己也不是真的要搞懂git原理是啥,某条指令真实的过程是啥,能解决自己的问题就好。