ant*_*_rh 4 git merge git-amend
假设我的存储库中有以下历史记录:
E--F
/
A--B--C---D
Run Code Online (Sandbox Code Playgroud)
我想将其修改为:
E--F
/ \
A--B--C---D
Run Code Online (Sandbox Code Playgroud)
我不想修改修订的文件内容,我只想“绘制一个合并箭头”。我怎样才能做到这一点?
我尝试通过以下命令执行此操作:
git checkout D
git merge F -s ours --no-ff --no-commit
git commit --amend
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误消息:
fatal: You are in the middle of a merge -- cannot amend.
Run Code Online (Sandbox Code Playgroud)
我想保持提交信息不变(作者,日期,消息)。我唯一要更改的是将伪merge-info添加到提交中。
这为我工作:
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
Run Code Online (Sandbox Code Playgroud)
raul.vila 的评论包含答案:您不能修改现有的 commit D。地球上没有任何力量可以修改现有的提交:git commit --amend是谎言。:-)
不过,您可以做几件事:
您可以使用 commit 中的内容进行合并提交,D其父项之一为父项,另一项F为父项D。这就是这两个命令序列:
git checkout D
git merge F -s ours --no-ff --no-commit
Run Code Online (Sandbox Code Playgroud)
准备做(最终提交已被抑制,--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 fetch和 上传输git push。
Raymond Chen 的评论包含一个命令,该命令与父级C和FusingD的树进行新的提交。