git

161 阅读2分钟

1. 合并后发现有冲突

此时,没有冲突的文件,add到了暂存区,冲突文件在工作区。
这时候,不想处理冲突了,想取消此次合并,可以使用:

git merge --abort

结果:相当于没有合并过

2. 合并后没有冲突

此时,会产生一个提交;提交会重置合并状态。这个时候如果使用git merge --abort,会提示:没有要取消的合并
如果这时候,你发现合错分支了,想要取消合并,可以使用:

git reset --soft HEAD~1

结果:会在暂存区看到合并过来的改动
如果使用:

git reset --hard HEAD~1

结果:相当于没有合并过

由此可知:reset相当于重置commit,回到commit前;如果想要reset最近的3个commit,那就使用git reset --hard HEAD~3

3. 合并后没有冲突,并且手动push到了远程仓库

此时,发现合并错了,想要取消合并,那就不止要修改本地仓库,还得修改远程仓库,可以使用:

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>强制推送本地仓库,覆盖远程仓库。本地仓库的版本落后远程仓库,只能强制推送。

适用于这个分支,没有其他人提交新内容的情况。

还可以使用:

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三连。

5. 把不该发的代码发到了生产

1. 正常情况下,直接找运维回滚

2. 从某次提交拉一个新分支,重新发布

git checkout -b <new_branch_name> <commit_hash>
// 或
git switch -c <new_branch_name> <commit_hash>