git reset --soft - 它会回到git checkout点还是最后一个git merge点?

问题描述 投票:2回答:2

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

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

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

我的问题是 - 如果我们从集成中检出一个功能分支并进行一些更改和一些提交,然后我们就会多次更新/合并集成。 Aka,提交提交,与集成合并,提交提交,与集成合并等。如果我们然后执行git reset --soft <integration>,那么当使用git checkout时,是否会将其重置为集成提交,或者只是将其重置为点哪个最后的git merge发生了整合?

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

git git-merge git-checkout git-reset
2个回答
1
投票

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

你需要在做integration分支和你的合并之前标记feature以便回到它。

一个可能的标记是origin/integration:上次你拿integration)。

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

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


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

但是,当您提交F4时,您的索引和工作树没有变化,因此您现在可以运行git commit将当前索引转换为新提交。名称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。)

© www.soinside.com 2019 - 2024. All rights reserved.