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}]
您的 index 和 work-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
的 parent 是现有提交 E
。 (提交 F
也有一个新的作者和提交者以及相应的 "now" 时间戳,这也将它与 F4
区分开来。)
我想我要找的是两个分支的最古老的共享祖先,或者类似的东西,这个问题似乎涉及到它: 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}]
您的 index 和 work-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
的 parent 是现有提交 E
。 (提交 F
也有一个新的作者和提交者以及相应的 "now" 时间戳,这也将它与 F4
区分开来。)