场景如下:
- 某项目下有很多开发中的分支,比如分支a,b,c,d都归并到了一个test分支上;
- 某次误操纵将test分支内容合到了分支e上,然后紧接着又revert了这次归并,试图撤销归并;
- 接着将分支e归并master上线;
- 过了若干天,将master再归并到a,b,c,d分支上时,发现之前修改的代码被归并丢掉了。
这时候你会纳闷,为什么代码会丢掉,关于git revert的操纵表明如下:
- 创建一个新的提交:当你对某个提交(或一系列提交)实行 git revert 时,Git 会创建一个新的提交,这个新提交包含了对指定提交所做更改的“逆操纵”。换句话说,它尝试将指定提交中的所有更改都“撤销”掉。
- 保存原始提交:与 git reset 或 git rebase 不同,git revert 不会修改或删除原始提交。原始提交仍然保存在 Git 汗青中,但新提交的更改会撤销它的效果。
- 保持汗青的线性(如果可能):默认情况下,git revert 会尝试在当前分支的顶部创建一个新的提交来撤销指定提交。这有助于保持汗青记载的线性,尤其是在与远程仓库共享代码时。然而,如果指定的提交不是当前分支汗青的一部门(例如,如果你试图从一个分支上撤销另一个不相干分支的提交),你可能需要利用额外的选项(如 --mainline)来确保正确的行为。
- 处理归并辩论:如果撤销的提交与当前分支的更改有辩论,git revert 会停止并让你手动解决这些辩论。解决辩论后,你需要像处理任何其他归并辩论一样提交效果。
- 影响将来的归并:由于 git revert 创建了一个新的提交来撤销原始提交的效果,这会影响将来的归并操纵。如果将来某个分支(如 master)再次归并包含原始提交的分支(如 a, b, c, d),那么归并将包括原始提交和新的撤销提交。然而,由于撤销提交的存在,原始提交的效果将被抵消,因此在归并后的效果中不会看到这些更改。
- 对公共仓库的影响:如果你已经将包含原始提交的更改推送到了公共仓库,而且想要撤销这些更改,你需要起首在你的本地仓库中实行 git revert,然后将包含新撤销提交的更改推送到远程仓库。这将确保所有与你有共享汗青的协作者都能看到并接收到你的撤销操纵。
总结:git revert确实可以撤销归并,但是会保存撤销的记载,再去归并相干分支时,就会出当代码丢失的情况!
解决方案:
- 最笨的办法,记取你分支的每次修改记载,手动补上这些代码,慢而且可能漏代码
- git reset到上述误操纵2之前的一次提交记载,将这几天的归并master操纵再重新操纵一次,实用于后续归并master操纵不多的情况
- 另辟蹊径将a、b、c、d、e的撤销的代码以简单快速而且完备的方式保存。
以a分支举例,当前在a分支,归并master后发现部门代码丢失,操纵如下:
(1)先撤销归并master
找到merge或者rebase的前一个节点
- git reset --hard <commit_hash>
复制代码 (2) 找到你分支a创建前的一次提交点,并以此提交点创建新分支,
- git log
- # 找到提交hash,以此提交点新建分支
- git branch 新分支名 提交哈希值
复制代码 比较分支a,将a分支原本的全部修改记载,利用git cherry-pick操纵拉到【新分支】上
(3)将master分支merge到新分支上
如许操纵快速方便也不怕代码丢失,如果不放心可以最后再比较下master分支,看看差异化的是否为原分支a的修改记载
如果您对技术有兴趣,友爱交流,可以加v进技术群一起沟通,v:zzs1067632338,备注csdn即可
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |