我想我要找的是两个分支的最古老的共享祖先,或者类似的东西,这个问题似乎涉及到它: Finding a branch point with Git?
但我正在查看的不是 OP 中的图表,而是更多:
-- I -- I -- I -- I -- I -- I -- I (integration branch)
\ \ /
\ \ /
F -- F -- F -- F (feature branch)
我的问题是 - 如果我们从集成中 check out 一个功能分支并进行一些更改和一些提交,然后我们随着集成进行几次更新/merge 。又名,提交提交,与集成 merge ,提交提交,与集成 merge ,等等。如果我们然后做 git reset --soft <integration>
, 是在 git checkout
时将其重置为集成提交吗?被使用过,或者它只是将它重置为最后一个 git merge
所在的位置发生整合?
我的目标是让我的功能成为一个大的提交。如果git reset --soft
只追溯到最后一次 git merge with integration,那么我的功能可能有 100 次提交,这不是 bueno,我将需要另一种技术。
最佳答案
您可以使用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
的提交不是问题,即使它 是 merge 提交。 标记为 IM
的提交是一个问题。这是因为可以从集成
的尖端访问此提交。有关一般可达性概念的(更多)更多信息,请参阅 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 功能
并运行git reset --soft integration
,结果如下:
-- o -- A -- B -- C -- D -- E <-- feature (HEAD), integration
\ \
\ \
F1 -- F2 - FM - F4 [abandoned, but remembered as feature@{1}]
你的 index 和 work-tree 与你提交 F4
checkout 时没有变化,所以你现在可以运行 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
的 parent 是现有提交 E
。 (提交 F
也有一个新的作者和提交者以及相应的“现在”时间戳,这也将它与 F4
区分开来。)
关于git reset --soft - 它返回到 git checkout 点还是最后一个 git merge 点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52133407/