Git: reset --hard 对未来合并的影响

Git: Effect of reset --hard on future merging

我们不小心将 sha XXX 提交到分支 A 而不是 B。

A: VVV-WWW-XXX
B: VVV-WWW

所以我们将按照 guidance on SO 将提交从 A 移动到 B:

git checkout B
git merge A
git checkout A
git reset --hard HEAD~1
git push --force

这将使我们达到:

A: VVV-WWW
B: VVV-WWW-XXX

如果我们然后在分支 A 上提交 YYY 给我们:

A: VVV-WWW-YYY
B: VVV-WWW-XXX

并将其合并到 B 中是否会干净地将 YYY 合并到 B 而 不会 恢复 B 上的 XXX 因为 XXX 之前是 reset --hard 在 A 上?合并后我们想要的是:

A: VVV-WWW-YYY
B: VVV-WWW-XXX-YYY

我正在努力应对 reset --hard 对合并行为的影响。我认为重置会清除提交的所有历史记录,因此合并会在不尝试从 B 中删除 XXX 的情况下正常工作。

合并的结果将是

                (A)
VVV --- WWW --- YYY
          \         \   (B)
            --- XXX --- ZZZ

其中 ZZZ 是父级为 XXX 和 YYY 的合并提交。括号中的单个字母代表 refs 或分支名称,它们只是历史图中沿途的路标。

使用 git lola 渲染(git log --graph --decorate --pretty=oneline --abbrev-commit --all 的别名)

*   78d2930 (HEAD -> B) ZZZ
|\
| * 549c09e (A) YYY
* | f585976 XXX
|/
* 537d898 WWW
* 875611c VVV

我使用上面的提交消息来关联你问题中的历史记录。您的 SHA-1 对象名称将与上述名称不同。

别想太多了。请记住 git 存储树状态的快照,历史谱系来自提交对象。使用利器 git reset --hard 删除历史,就好像它从未发生过一样,没有留下任何痕迹。

就像任何锋利的工具一样,git reset --hard 如果您不小心,可能会割伤您。想一想 rm -rf.

reset 只是将 HEAD/branch 指针移动到另一个提交。它不会对存储库或任何未来的操作产生任何影响。

你是正确的,无论你是否提交了重置,未来的合并将完全相同。