我已完成合并,并且已创建新的合并提交。然后我软重置分支一提交回来保留所有分辨率的文件,恢复一个分辨率,现在我想再次使用所有这些文件创建合并提交。我有两个来自原始合并提交的父哈希,并且想要在创建新提交以模拟合并提交时以某种方式指定这些父项。有可能吗?
答案 0 :(得分:2)
你可以做你想做的事,但有两件事:
首先,这可能不是一个好主意。如果合并包含更改(相对于默认合并结果),则这些更改会稍微隐藏。它可能会混淆您将来可能运行的某些git命令(特别是rebase将无法正确处理合并),并且使查看历史记录的人更难以了解项目是如何演变的。
其次,无论如何你要做到这一点,可能比你正在尝试的方式更简单。如果合并发生冲突,您可以在提交冲突解决方案之前进行更改。如果没有冲突,您可以使用--no-commit
选项重新运行合并,以便您可以进行手动更改然后提交。
但是,如果出于任何组合原因,您已完成合并并且不想重新运行合并操作,那么您执行软重置,现在您想要使用当前内容状态重新创建合并提交:
首先你需要一棵干净的工作树,所以
git stash
现在您可以开始创建合并提交的过程。使用ours
策略可以避免任何实际的更改合并;这将保持您的内容状态不变。使用--no-commit
以便您可以从藏匿处重新应用更改。
git merge -s ours --no-commit branch
git stash pop
git add .
git commit
现在你按照自己的意愿完成了邪恶的合并,准备好在你最不期望的时候弄乱你的历史。
答案 1 :(得分:2)
除了Mark Adelsberger's answer之外,还有一种直接的方法可以使用两个管道命令:
tree=$(git write-tree) # write updated index to new tree
commit=$(git commit-tree -p $firstparent -p $secondparent -F /tmp/msgfile)
(其中/tmp/msgfile
包含提交消息;请注意,您可以使用-m
指定消息文本,或-F -
从stdin读取消息,在这种情况下您可以{{ 1}}提取原始提交消息并将其传递给git log --pretty=%B $hash
)。
完成提交后,您可以git commit-tree
或git merge --ff-only
提交,例如:
git reset --hard
我想知道你的意思是什么:
还原了一项决议
并且在所有情况下结果都是通常称为“邪恶合并”的:合并,其结果不是基于其输入。这种合并是否真的是邪恶,甚至只是一个坏主意,是一个意见问题,但它后来很难重现,似乎需要一个良好的提交信息。