首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"git还原<commit_id - SHA code>将在2种情况下删除多少次提交?“

"git还原<commit_id - SHA code>将在2种情况下删除多少次提交?“
EN

Stack Overflow用户
提问于 2017-09-07 14:30:34
回答 1查看 156关注 0票数 0

我对"git还原“有疑问。

没有互联网连接。我已经做了4次提交时,互联网连接到。然后互联网连接就到了。我得先拉然后再推。因此,我拉,它会导致自动合并发生(没有任何冲突)。这个合并是作为另一个(第5次提交)创建的,最后,我在gitlab上推送所有的“5”提交。

如果我的经理做了"git还原<5提交SHA>“,那么所有从我的第一次提交到第5次提交的所有更改都会消失吗?如果是,为什么?如果没有,那么当其他人退出时,有多少次提交将不在gitlab上?

注意-所有事情都发生在主干道上。这里没有创建次级分支。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-07 16:06:29

您(或您的经理)需要了解一些关于revert的事情。

首先,它不删除提交。它创建了一个新提交,该提交取消了一个或多个旧提交的更改。

其次,如果要还原合并提交,还需要指定要还原到的合并父级中的哪个。这很重要,因为您的“第五次”提交是一个合并。

最后,如果您确实恢复了合并,那么很难在以后重新引入未完成的更改。文档指出,您正在告诉git,您将永远不希望合并的恢复部分。

所以在你的推动下你所拥有的是

代码语言:javascript
复制
x --- x --- x --- A --- B --- C --- D --- M
             \                          /
               o --- o --- o --- o --- O

x是在您开始工作之前提交给您(和远程)的。

oO是在“脱机”时出现在远程上的提交。

A通过D是您的提交。

M是git在pull编辑时创建的合并。此合并认为D是父级1,O是父级2。

现在如果你说

代码语言:javascript
复制
git revert -m 1 <SHA-of-M> 

上面写着“将M还原为D”。这将有效地撤销所有o提交以及O。另一方面,

代码语言:javascript
复制
git revert -m 2 <SHA-of-M>

上面写着“将M还原为O”。这将有效地撤销ABCD

但同样,这并不删除提交。它也不会从分支历史中删除提交。结果将是

代码语言:javascript
复制
x --- x --- x --- A --- B --- C --- D --- M --- W
             \                          /
               o --- o --- o --- o --- O

其中,TREE ( W )匹配TREE at DTREE at O (取决于您指定的-m选项)。

并且重申:不仅所有来自合并一方的提交都被有效地取消了,而且重新执行它们也不是那么容易,因为git认为它们被M“考虑”了。

如果您(或您的经理)试图从历史中删除“不必要的提交”,则必须进行历史记录重写。有几种方法可以做到这一点;revert不是其中之一。任何影响已被推送的提交的历史重写都有与其相关的成本。合并提交的观点是“丑陋的”或“不必要的”,这是一个意见问题;我怀疑在大多数情况下这种成本是否合理。但把社论放在一边:

一个可以工作的过程(假设您的本地master还在M上):

1)创建一个临时分支并将其移动到O

代码语言:javascript
复制
git checkout master
git checkout -b o_master
git reset --hard HEAD^2

2)将master移动到D

代码语言:javascript
复制
git checkout master
git reset --hard HEAD^

3)使用rebase创建线性历史记录

代码语言:javascript
复制
git rebase o_master master
git branch -d o_master

您可能必须在重基期间解决一些冲突;请参阅git重基文档。

这给出了移动提交的外观,所以

代码语言:javascript
复制
x --- x --- x -- o --- o --- o --- o --- O --- A' --- B' --- C' --- D'

您有一些新的提交(A'通过D');每个提交都是对原始提交(AD)的替换。A'B'C'的代码状态未经测试,可能无法编译或故障,这可能会影响未来的调试工作;因此,您可能应该对它们进行测试。D'上的代码状态应该与您以前在M上的状态相同(因此可能是经过测试的),但这并不是100%的保证(出于各种原因,特别是如果有冲突需要解决),所以最好进行验证(或者也测试D',或者至少根据原始M测试D' )。

接下来,你要做一个“用力推”。

代码语言:javascript
复制
git push -f

此时,您已经重写了远程历史。虽然仍然还没有删除任何提交,但是您已经从master ref中删除了一些旧的提交。这意味着您的所有同事都必须更新,他们所做的任何工作(基于M)都必须重新基于D'。有关此问题的详细信息,请参阅git rebase文档中的“从上游重基恢复”。

从技术上讲,所有旧的提交仍然存在,但它们在默认情况下是不可见的,因为您已经将它们从裁判的历史中删除。如果您需要物理删除它们,这是另一个多步骤的过程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46098979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档