在Git中,我如何在树上等于另一个提交的树的分支上进行新提交

时间:2019-06-15 20:32:57

标签: git

我有一个处境

...--x--y--z   master

...--a--b--c  someOtherBranch

我想在master分支上进行一次新提交,只需将文件树更改为类似于someOtherBranch的树即可。即,我想进入状态

...--x--y--z--c1 master

...--a--b--c  someOtherBranch

其中提交c1的文件树看起来像c的树。 (这大概意味着它是完全相同的文件树对象。)

我该怎么做?

我知道这会在z和c1之间产生潜在的大且不希望的不连续性。

1 个答案:

答案 0 :(得分:2)

您根本不知道为什么要这么做(git merge -s ours涵盖了通常的原因,git merge --squash -s ours使得 merge 提交而不是单个提交) -parent commit),但是很容易做到,使用git commit后跟git commit-tree,或者使用-s ours编辑:master的z会保留错误的树(c而不是master)。可以使用 ,但这就是您要进行 merge 提交的原因。请参阅以下部分。

(以下所有命令均假定您现在在git commit-tree上。)

要使用hash=$(git commit-tree -p HEAD -F /tmp/commit-msg someOtherBranch^{tree}) ,必须提供一些额外的参数,这需要更多的设置:

/tmp/commit-msg
例如,

,其中提交消息存储在文件git merge --ff-only $hash 中。产生的哈希ID是一个新的提交对象,该对象尚未在任何分支上,但是现在很容易“快速合并”到:

git reset

或到git reset --hard $hash 到:

git checkout

您也可以作为John Szakmeister commented,使用git rm将另一个提交的索引和工作树覆盖到当前的索引中。如果您有一个名为README的文件,但它们没有README,只有README.md,则应该首先git read-tree

或者您可以使用git read-tree -m -u someOtherBranch; git commit 来做到这一点,我认为这更简单:

^{tree}

(这里不需要git read-tree,因为git merge -s ours本身将完全解决对树的提交。)

如果您真的想要合并

在使用git merge -s ours someOtherBranch git read-tree -m -u someOtherBranch git commit 设置真正的合并之后,也可以使用读取树(或删除并检出)技巧。那就是:

z

将准备要保留c的合并,然后用c1中的索引和工作树替换索引和工作树,然后进行新的提交c,其树与{{1 }},而不是z

...--x--y--z--c1   <-- master
             /
...--a--b---c   <-- someOtherBranch