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

时间:2018-04-16 13:47:25

标签: git merge amend

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

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

我想将其修改为:

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

我不想修改修订版的文件内容,我只想“绘制合并箭头”。我怎么能这样做?

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

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.

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

2 个答案:

答案 0 :(得分:2)

这对我有用:

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

答案 1 :(得分:1)

raul.vila's comment包含答案:您无法修改现有提交D。地球上没有能够修改现有提交的权力:git commit --amend是谎言。 : - )

可以做几件事:

  • 您可以使用commit D中的内容进行合并提交,其中F作为其父项之一,D作为另一项。这就是这个双命令序列:

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

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

    正如您所见,当您使用git commit --amend时,问题会出现:--amend表示使用D的父级代替{{1} }}本身作为父母,这与正在进行的D合并记录冲突。

  • 您可以进行合并提交,其中F作为其父项之一,C作为另一项,并使用提交F中的内容(树)。这可能就是你想要的。请注意,没有前端命令,因此您必须手动构建新的提交;结果是许多人称之为邪恶的合并

  • 您可以使用D进行类似git replace但具有不同父级的其他提交,Git将使用代替 D ,但根本没有实际删除 D。也就是说,原始图形保持不变(可以使用D查看和使用),但是大多数命令在使用git --no-replace-objects时会使用替换。

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

Raymond Chen's comment包含一个命令,该命令使用父git pushC进行新的提交,但使用F的树。