假设我的存储库中有以下历史记录:
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.
我想保持提交信息不变(作者,日期,消息)。我唯一想要改变的是将伪合并信息添加到提交中。
答案 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 push
和C
进行新的提交,但使用F
的树。