git 假合并(将提交标记为已合并而没有真正的合并)

git fake merge (marking a commit as merged without a real merge)

假设我的存储库中有以下历史记录:

     E--F
    /
A--B--C---D

我想修改成这样:

     E--F
    /    \
A--B--C---D

我不想修改revisions的文件内容,我只想"draw a merge arrow"。我该怎么做?

我尝试通过以下命令执行此操作:

git checkout D
git merge F -s ours --no-ff --no-commit
git commit --amend

但我收到以下错误消息:

fatal: You are in the middle of a merge -- cannot amend.

我想保留提交信息不变(作者、日期、消息)。我唯一想改变的是将伪合并信息添加到提交中。

这对我有用:

git checkout D~1
git merge F -s ours --no-ff --no-commit
git cherry-pick D -n
git commit -C D
git branch -f D
git checkout D

包含答案:您不能修改现有提交 D。地球上没有任何力量可以修改现有的提交:git commit --amend 是一个谎言。 :-)

不过,您可以做几件事:

  • 您可以使用提交 D。这就是这个 two-command 序列:

    git checkout D
    git merge F -s ours --no-ff --no-commit
    

    准备执行(最终提交已被 --no-commit 抑制,但合并记录为正在进行中)。

    问题,如你所见,当你去使用git commit --amend时出现了:--amend意味着使用D的parent (s) 而不是 D 本身作为 parents,这与正在进行的 F.

  • 的记录合并冲突
  • 您可以进行合并提交,其中 C 作为其 parent 之一,F 作为另一个,并使用内容(树) 来自提交 D。这可能就是你想要的。请注意,没有用于此的前端命令,因此您必须手动构建新提交;结果就是许多人所说的邪恶合并.

  • 您可以使用 git replace 进行类似于 D 但具有不同 parent 的额外提交,Git 将使用 代替 D,但 根本没有实际删除 D。也就是说,原始图形保留在原位(并且可以使用 git --no-replace-objects 查看和使用),但是大多数命令,当它们即将使用 D 时,使用替换。

    此方法的优点是它不会影响任何现有的克隆。缺点是没有其他人会 看到 这个替换提交,除非他们明确要求将其复制到他们自己的存储库:对替换的引用存在于 refs/replace/ 下,这不是通常在 git fetchgit push.

  • 上传输

包含一个使用 parents CF 但使用 D 的树进行新提交的命令。