git reset --soft - 它返回到 git 结帐点还是最后一个 git 合并点?

git reset --soft - does it go back to git checkout point or to the last git merge point?

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

但我看的不是 OP 中的图表,而是更多:

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

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

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

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

您需要在 执行您的 feature 分支和合并之前标记 integration 以便返回它。

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

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

在任何情况下,您的 git reset --soft 都必须使用该标记,而不是 本地集成分支。

可以使用git reset --soft,但您必须先做一些其他事情——或者更确切地说,先做。

The goal is so that I can make my feature into one big commit.

在那种情况下,请确保您不要从以下内容开始:

-- 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

将不打印任何内容。但是新提交 Fparent 是现有提交 E。 (提交 F 也有一个新的作者和提交者以及相应的 "now" 时间戳,这也将它与 F4 区分开来。)