赞
踩
git在版本管理方面非常优秀,提供了一个分布式管理结构,在提交和撤销回退方面也很方便。
在git的概念里,在本地有一个工作区,本地还有一个仓库,远程也有一个仓库。通常来说在工作区进行工作,工作完成后,将需要保存的内容交给git管理:
git add file
git是直接对整个文件进行管理,将文件交给git后,需要提交到本地仓库中:
git commit -m "message"
提交到本地仓库,git便建立起了一个追踪变化的树,其中一个分支会有自己的记录,当前所在的变化会有一个HEAD来标识,每提交一次,HEAD都会指向最新的变化,此时若想后退,只需要将HEAD指针回退到相应版本即可。
git 提供了三个撤销回退的概念:
此时git已经追踪到test.txt的变化,等待提交本地仓库,如果发现出错了,可以进行撤销:
撤销后,不删除文件本身的变化,只是将它从git管理中去除。
假如提交到本地仓库是错误的,此时需要将错误改正过来,可以使用revert,进行反转。
反转即是将添加的删除掉,删除的添加回来。
使用-i进入交互式界面,rebase时,可以指定版本号,注意,如果指定的是版本号,那么rebase是不包括这个版本的,也可以用head指针来指定,例如指向前两次提交:HEAD~2,此时进入交互式界面,从上向下列着每次的提交记录,由旧到新的顺序排列。下面有很多选项:p(pick) 挑选哪一个作为基础提交,s(squash)将选中的提交合并到pick的提交上。所以,我可以pick最早的一个提交,即第一行的提交,squash其他提交,合并为一个提交。保存退出,然后再执行git rebase --continue,将提交的信息进行修改。若不修改,rebase将会保存之前所有的提交信息,并按由新到旧的顺序排列。保存后 退出,查看记录,已经成功合并。
但某些情况下,事实比上面的情况要复杂,例如与同事合作,git记录信息如下:
可以看到文件的改变和每一次的提交是对应的,方便显示效果。
第一次和第四次是要保留的提交,中间的二三次是需要撤回的提交。
由于第四次提交不在我要操作的范围内,所有rebase的时候保持pick就好,这样rebase还是会保留这一次提交,将第三次合并到第二次上,所以要squash第三次提交,也可以用fixup,直接去除第三次的提交信息。
有一点需要注意的是,如果第四次改动与要反转的提交改动冲突,需要手动解决冲突。示例如下:
将需要撤回的提交利用rebase合并为一次提交,然后对这个提交进行revert即可。
先在当前分支基础上切出一个分支test-bak来操作,对bak分支进行rebase操作,然后将原分支test合并到当前分支,由于git识别修改相同自动合并,所以实际文件内容并没有变化,只是test-bak分支多了test分支上的提交记录,即完整的四次提交记录。示意图如下:
然后将原分支test删除,将test-bak分支改名为test,然后和远程的test分支建立联系即可。如果觉得合并后的分支提交记录仍然不整齐,可以将不需要的rebase掉。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。