【问题标题】:git reset --soft - does it go back to git checkout point or to the last git merge point?git reset --soft - 是回到 git checkout 点还是最后一个 git 合并点?
【发布时间】:2019-02-07 13:06:24
【问题描述】:

我认为我正在寻找的是两个分支的最古老的共享祖先,或者类似的东西,这个问题似乎涉及到它: Finding a branch point with Git?

但不是 OP 中的图表,而是我正在查看的更多内容:

-- I -- I -- I -- I -- I -- I -- I  (integration branch) 
          \         \          /
           \         \        /
             F -- F -- F -- F  (feature branch)

我的问题是 - 如果我们从集成中签出功能分支并进行一些更改和一些提交,然后我们会随着集成进行几次更新/合并。又名,提交提交,与集成合并,提交提交,与集成合并等。如果我们然后执行git reset --soft <integration>,是在使用git checkout 时将其重置为集成提交,还是会简单地重置它到了最后一个 git merge 与集成发生的地步?

目标是让我可以将我的功能变成一个大提交。如果git reset --soft 只能追溯到最后一个 git 与集成的合并,那么我的功能可能有 100 次提交,这不是 bueno,我将需要另一种技术。

【问题讨论】:

标签: git git-merge git-checkout git-reset


【解决方案1】:

可以使用git reset --soft,但是你必须先做一些别的事情——或者更确切地说,做——首先。

目标是我可以将我的功能变成一个大提交。

在这种情况下,请确保您不要以:

开头
-- o -- A -- B -- C -- D -- E -- IM   <-- integration
          \         \          /
           \         \        /
            F1 -- F2 - FM - F4   <-- feature

请注意,我在这里替换了单个字母,以便我可以讨论特定的提交。就 Git 本身而言,两个最有趣的提交是 F4,这是名为 feature 的分支的提示提交,以及 IM,这是名为 integration 的分支的提示提交。

标记为FM 的提交不是问题,即使它 合并提交。 标记为IM 的提交 一个问题。 这是因为可以从integration 的尖端访问此提交。有关一般可达性概念的(更多)信息,请参阅Think Like (a) Git。每当提交IM 本身可以通过从integration 指向的提交开始并向后(向左)工作时到达,提交IM 本身到达的所有提交也是如此。提交 IM 会返回到提交 E(不是问题)和 F4(问题!)。

如果你消除提交IM,那么你有:

-- o -- A -- B -- C -- D -- E   <-- integration
          \         \
           \         \
            F1 -- F2 - FM - F4   <-- feature

您现在可以git checkout feature 并运行git reset --soft integration,结果如下:

-- o -- A -- B -- C -- D -- E   <-- feature (HEAD), integration
          \         \
           \         \
            F1 -- F2 - FM - F4   [abandoned, but remembered as feature@{1}]

您的 indexwork-tree 与您签出提交 F4 时相比没有变化,因此您现在可以运行 git commit 以打开当前索引到 new 提交。名称 feature 现在将指向新的提交:

                              F   <-- feature (HEAD)
                             /
-- o -- A -- B -- C -- D -- E   <-- integration
          \         \
           \         \
            F1 -- F2 - FM - F4   [feature@{1}]

新提交F快照 将匹配提交F4 的快照:

git diff feature@{1} feature

什么都不打印。但是新提交F父级 是现有提交E。 (提交F 也有一个新的作者和提交者以及相应的“现在”时间戳,这也将它与F4 区分开来。)

【讨论】:

  • 谢谢你 - 我将不得不阅读可达性,但我想从表面上看我不太明白为什么提交 IM 是一个问题?
  • 如果你在提交IM之上添加一个新提交,新提交将指向IM,因此git log将首先显示提交F,然后是IM,然后——按某种顺序——所有A-B-C-DF1-F2-FM-F4。原因是 Git 会遍历 两个 链(按倒序,否则同时)。
【解决方案2】:

每次您将功能合并回integration 时,您都在移动integration HEAD(现在引用新的合并提交)

您需要标记integration 执行您的feature 分支和合并后才能返回它。

一个可能的标记是origin/integration:你最后一次获取integration)。

另一个是git merge-base --fork-point(基于reflog,所以不可靠)或两个分支的git rev-list --first-parent 之间存在一些差异。

无论如何,您的git reset --soft 必须使用该标记,而不是本地集成分支。

【讨论】:

  • 是的,我猜git reset --soft &lt;thing&gt; 是有道理的,在当前分支中找到 并撤消所有提交直到该点。因此,只需找到正确的 即可返回。
  • @OlegzandrDenman 是的,就是这个想法。 git reset --soft 删除提交,但保持最终内容完整(工作树和索引)。但你仍然需要去哪里
  • @OlegzandrDenman 我知道的唯一方法列在您在问题中引用的帖子中,并且我在回答中提到:rev-list 的合并基础。
  • @OlegzandrDenman 不完全是:见stackoverflow.com/a/20966716/6309。等等……这个答案没有被选中?
  • @OlegzandrDenman 哪个答案对您来说似乎更清楚是正确的。我只是忘记了这个问题,没想到自从我回答了它之后,torek就出现了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2020-06-22
  • 1970-01-01
  • 2011-01-02
相关资源
最近更新 更多