我对"git还原“有疑问。
没有互联网连接。我已经做了4次提交时,互联网连接到。然后互联网连接就到了。我得先拉然后再推。因此,我拉,它会导致自动合并发生(没有任何冲突)。这个合并是作为另一个(第5次提交)创建的,最后,我在gitlab上推送所有的“5”提交。
如果我的经理做了"git还原<5提交SHA>“,那么所有从我的第一次提交到第5次提交的所有更改都会消失吗?如果是,为什么?如果没有,那么当其他人退出时,有多少次提交将不在gitlab上?
注意-所有事情都发生在主干道上。这里没有创建次级分支。
发布于 2017-09-07 16:06:29
您(或您的经理)需要了解一些关于revert的事情。
首先,它不删除提交。它创建了一个新提交,该提交取消了一个或多个旧提交的更改。
其次,如果要还原合并提交,还需要指定要还原到的合并父级中的哪个。这很重要,因为您的“第五次”提交是一个合并。
最后,如果您确实恢复了合并,那么很难在以后重新引入未完成的更改。文档指出,您正在告诉git,您将永远不希望合并的恢复部分。
所以在你的推动下你所拥有的是
x --- x --- x --- A --- B --- C --- D --- M
\ /
o --- o --- o --- o --- Ox是在您开始工作之前提交给您(和远程)的。
o和O是在“脱机”时出现在远程上的提交。
A通过D是您的提交。
M是git在pull编辑时创建的合并。此合并认为D是父级1,O是父级2。
现在如果你说
git revert -m 1 <SHA-of-M> 上面写着“将M还原为D”。这将有效地撤销所有o提交以及O。另一方面,
git revert -m 2 <SHA-of-M>上面写着“将M还原为O”。这将有效地撤销A、B、C和D。
但同样,这并不删除提交。它也不会从分支历史中删除提交。结果将是
x --- x --- x --- A --- B --- C --- D --- M --- W
\ /
o --- o --- o --- o --- O其中,TREE ( W )匹配TREE at D或TREE at O (取决于您指定的-m选项)。
并且重申:不仅所有来自合并一方的提交都被有效地取消了,而且重新执行它们也不是那么容易,因为git认为它们被M“考虑”了。
如果您(或您的经理)试图从历史中删除“不必要的提交”,则必须进行历史记录重写。有几种方法可以做到这一点;revert不是其中之一。任何影响已被推送的提交的历史重写都有与其相关的成本。合并提交的观点是“丑陋的”或“不必要的”,这是一个意见问题;我怀疑在大多数情况下这种成本是否合理。但把社论放在一边:
一个可以工作的过程(假设您的本地master还在M上):
1)创建一个临时分支并将其移动到O
git checkout master
git checkout -b o_master
git reset --hard HEAD^22)将master移动到D
git checkout master
git reset --hard HEAD^3)使用rebase创建线性历史记录
git rebase o_master master
git branch -d o_master您可能必须在重基期间解决一些冲突;请参阅git重基文档。
这给出了移动提交的外观,所以
x --- x --- x -- o --- o --- o --- o --- O --- A' --- B' --- C' --- D'您有一些新的提交(A'通过D');每个提交都是对原始提交(A到D)的替换。A'、B'和C'的代码状态未经测试,可能无法编译或故障,这可能会影响未来的调试工作;因此,您可能应该对它们进行测试。D'上的代码状态应该与您以前在M上的状态相同(因此可能是经过测试的),但这并不是100%的保证(出于各种原因,特别是如果有冲突需要解决),所以最好进行验证(或者也测试D',或者至少根据原始M测试D' )。
接下来,你要做一个“用力推”。
git push -f此时,您已经重写了远程历史。虽然仍然还没有删除任何提交,但是您已经从master ref中删除了一些旧的提交。这意味着您的所有同事都必须更新,他们所做的任何工作(基于M)都必须重新基于D'。有关此问题的详细信息,请参阅git rebase文档中的“从上游重基恢复”。
从技术上讲,所有旧的提交仍然存在,但它们在默认情况下是不可见的,因为您已经将它们从裁判的历史中删除。如果您需要物理删除它们,这是另一个多步骤的过程。
https://stackoverflow.com/questions/46098979
复制相似问题