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

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

我想我要找的是两个分支的最古老的共享祖先,或者类似的东西,这个问题似乎涉及到它: 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}]

你的 indexwork-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

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

关于git reset --soft - 它返回到 git checkout 点还是最后一个 git merge 点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52133407/

相关文章:

git - 有人可以解释这个有趣的 git merge 行为吗

git - "-X theirs"选项似乎不适用于某些 Git 冲突

git merge 覆盖更改

git - 从私有(private) GitHub 存储库 checkout 标签

混帐 pull : replace local version with the remote version

Git 恢复本地已删除但尚未提交的文件

linux - 服务器上的 Git 没有 SSH 访问权限

git - 为什么我不能从 Git 的工作目录中丢弃文件?

git - 为什么在提交和 checkout 后文件夹留在我的本地 git 工作目录中

git branch -d <分支> : Fatal - Couldn't look up commit object for HEAD