当前位置:   article > 正文

git 回退操作

git 回退

git在版本管理方面非常优秀,提供了一个分布式管理结构,在提交和撤销回退方面也很方便。

在git的概念里,在本地有一个工作区,本地还有一个仓库,远程也有一个仓库。通常来说在工作区进行工作,工作完成后,将需要保存的内容交给git管理:

git add file

git是直接对整个文件进行管理,将文件交给git后,需要提交到本地仓库中:

git commit -m "message"

提交到本地仓库,git便建立起了一个追踪变化的树,其中一个分支会有自己的记录,当前所在的变化会有一个HEAD来标识,每提交一次,HEAD都会指向最新的变化,此时若想后退,只需要将HEAD指针回退到相应版本即可。

git 提供了三个撤销回退的概念:

  • reset:git reset 能将当前工作区加入git管理的文件全部清空:

此时git已经追踪到test.txt的变化,等待提交本地仓库,如果发现出错了,可以进行撤销:

撤销后,不删除文件本身的变化,只是将它从git管理中去除。

  • revert:git revert 纸面意思就是反转,即将提交到本地仓库的内容进行反转,它会自动产生一次新的提交,可以用-n参数来指定不产生新的提交。

假如提交到本地仓库是错误的,此时需要将错误改正过来,可以使用revert,进行反转。

反转即是将添加的删除掉,删除的添加回来。

  • rebase:git rebase 对每次的提交进行处理,例如将多次提交合并为一次提交,在git revert时,将会产生一个提交,可以用rebase将这两次提交合并为一次提交:

使用-i进入交互式界面,rebase时,可以指定版本号,注意,如果指定的是版本号,那么rebase是不包括这个版本的,也可以用head指针来指定,例如指向前两次提交:HEAD~2,此时进入交互式界面,从上向下列着每次的提交记录,由旧到新的顺序排列。下面有很多选项:p(pick) 挑选哪一个作为基础提交,s(squash)将选中的提交合并到pick的提交上。所以,我可以pick最早的一个提交,即第一行的提交,squash其他提交,合并为一个提交。保存退出,然后再执行git rebase --continue,将提交的信息进行修改。若不修改,rebase将会保存之前所有的提交信息,并按由新到旧的顺序排列。保存后 退出,查看记录,已经成功合并。


但某些情况下,事实比上面的情况要复杂,例如与同事合作,git记录信息如下:

可以看到文件的改变和每一次的提交是对应的,方便显示效果。

第一次和第四次是要保留的提交,中间的二三次是需要撤回的提交。

  • 如果不需要保存原始的提交记录,那么直接进行rebase + revert操作。

由于第四次提交不在我要操作的范围内,所有rebase的时候保持pick就好,这样rebase还是会保留这一次提交,将第三次合并到第二次上,所以要squash第三次提交,也可以用fixup,直接去除第三次的提交信息。

有一点需要注意的是,如果第四次改动与要反转的提交改动冲突,需要手动解决冲突。示例如下:

将需要撤回的提交利用rebase合并为一次提交,然后对这个提交进行revert即可。

  • 若需要保存完整的原始提交记录,可以采用下面的办法:

先在当前分支基础上切出一个分支test-bak来操作,对bak分支进行rebase操作,然后将原分支test合并到当前分支,由于git识别修改相同自动合并,所以实际文件内容并没有变化,只是test-bak分支多了test分支上的提交记录,即完整的四次提交记录。示意图如下:

然后将原分支test删除,将test-bak分支改名为test,然后和远程的test分支建立联系即可。如果觉得合并后的分支提交记录仍然不整齐,可以将不需要的rebase掉。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/706496
推荐阅读
相关标签
  

闽ICP备14008679号