12

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

     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.

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

4

2 回答 2

11

这对我有用:

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
于 2018-04-16T14:38:29.083 回答
6

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

不过,您可以做几件事:

  • 您可以使用 commit的内容进行合并提交,D将其作为其父级之一,并将其​​作为另一个父级。这就是这两个命令序列:FD

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

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

    正如您所看到的,当您使用git commit --amend:时,问题就出现了,这--amend意味着使用D的父母而不是D自己作为父母,这与正在进行的记录合并冲突F

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

  • 您可以使用它git replace来创建一个类似于D但具有不同父级的附加提交,Git 将使用该提交来代替 D,但根本不会实际删除 D。也就是说,原始图形保留在原处(并且可以使用 来查看和使用git --no-replace-objects),但大多数命令在即将使用时D,会使用替换来代替。

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

Raymond Chen 的评论包含一个命令,该命令与父母一起进行新的提交,CF使用D's 树。

于 2018-04-16T14:45:22.867 回答