我有一个处境
...--x--y--z master
...--a--b--c someOtherBranch
我想在master分支上进行一次新提交,只需将文件树更改为类似于someOtherBranch的树即可。即,我想进入状态
...--x--y--z--c1 master
...--a--b--c someOtherBranch
其中提交c1
的文件树看起来像c
的树。 (这大概意味着它是完全相同的文件树对象。)
我该怎么做?
我知道这会在z和c1之间产生潜在的大且不希望的不连续性。
答案 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