gpt4 book ai didi

执行 rebase 后,Git 提交在同一分支中重复

转载 作者:IT王子 更新时间:2023-10-29 01:23:30 27 4
gpt4 key购买 nike

我了解 Pro Git 中呈现的关于 The Perils of Rebasing 的场景.作者基本上告诉你如何避免重复提交:

Do not rebase commits that you have pushed to a public repository.



我将告诉你我的特殊情况,因为我认为它并不完全适合 Pro Git 场景,而且我仍然以重复提交告终。

假设我有两个远程分支与本地分支:
origin/master    origin/dev
| |
master dev

所有四个分支都包含相同的提交,我将在 dev 开始开发:
origin/master : C1 C2 C3 C4
master : C1 C2 C3 C4

origin/dev : C1 C2 C3 C4
dev : C1 C2 C3 C4

几次提交后,我将更改推送到 origin/dev :
origin/master : C1 C2 C3 C4
master : C1 C2 C3 C4

origin/dev : C1 C2 C3 C4 C5 C6 # (2) git push
dev : C1 C2 C3 C4 C5 C6 # (1) git checkout dev, git commit

我得回 master快速修复:
origin/master : C1 C2 C3 C4 C7  # (2) git push
master : C1 C2 C3 C4 C7 # (1) git checkout master, git commit

origin/dev : C1 C2 C3 C4 C5 C6
dev : C1 C2 C3 C4 C5 C6

并返回 dev我重新调整更改以在我的实际开发中包含快速修复:
origin/master : C1 C2 C3 C4 C7
master : C1 C2 C3 C4 C7

origin/dev : C1 C2 C3 C4 C5 C6
dev : C1 C2 C3 C4 C7 C5' C6' # git checkout dev, git rebase master

如果我使用 GitX/gitk 显示提交历史,我会注意到 origin/dev现在包含两个相同的提交 C5'C6'这与 Git 不同。现在,如果我将更改推送到 origin/dev这是结果:
origin/master : C1 C2 C3 C4 C7
master : C1 C2 C3 C4 C7

origin/dev : C1 C2 C3 C4 C5 C6 C7 C5' C6' # git push
dev : C1 C2 C3 C4 C7 C5' C6'

可能我没有完全理解Pro Git中的解释,所以我想知道两件事:
  • 为什么 Git 在 rebase 时会重复这些提交?是否有特别的理由这样做而不是仅仅申请 C5C6之后 C7 ?
  • 我怎样才能避免这种情况?这样做是否明智?
  • 最佳答案

    你不应该在这里使用 rebase,一个简单的 merge 就足够了。您链接的 Pro Git 书基本上解释了这种确切情况。内部工作原理可能略有不同,但这是我的可视化方式:

  • C5C6暂时撤出dev
  • C7适用于dev
  • C5C6C7 之上回放,创建新的差异,从而创建新的提交

  • 因此,在您的 dev 中分公司, C5C6实际上不再存在:它们现在是 C5'C6' .当您推送到 origin/dev , git 看到 C5'C6'随着新的提交并将它们添加到历史的尽头。确实,如果您查看 C5 之间的差异和 C5'origin/dev ,你会注意到虽然内容相同,但行号可能不同——这使得提交的哈希不同。

    我将重申 Pro Git 规则: 永远不要对除了本地存储库以外的任何地方都存在过的提交进行 rebase .改用 merge 。

    关于执行 rebase 后,Git 提交在同一分支中重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9264314/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com