我有一个最初从master1分支出来的git分支,但是现在需要将其重新建立基础(如果这是正确的术语?)。
换句话说,我现在想将“分支”设置为与“ master2”相同的状态-即,与master2拥有完全相同的文件。
我有什么办法吗?
谢谢!
答案 0 :(得分:2)
在本地运行git checkout foo && git reset master2 --hard
是正确的。但是,由于无法执行强制推送,因此无法更新远程存储库中的foo
。我们可以使用另一种方式使foo
与master2
具有相同的目录/文件,而无需重写历史记录。
git checkout foo
git merge $(git commit-tree -p HEAD -m "blah blah" master2^{tree})
git commit-tree
创建一个提交对象,其父对象为foo
的当前头,并且其树与master2
的头的树相同。当2个提交具有相同的树时,它们将具有相同的目录和具有相同内容的文件。 git commit-tree
还返回提交对象的哈希。这样,foo
通过快进合并被更新为新提交。如有必要,请先更新本地master2
。
答案 1 :(得分:1)
如果您不需要保留分支的历史记录,只需将其强制放在您选择的ref上即可:
git branch -f your-branch master2
但是,为了保留分支的历史记录,无论出于何种原因(在这里特别是因为服务器规则均禁止强行推送),您都可以使用ours
策略进行合并:
# create a copy of master2 and merge your-branch in it, BUT taking nothing from it
git checkout -b master2-copy master2
git merge -s ours your-branch
# at this point we have to reflect the operation on your-branch
# (the second merge is just a fast-forward)
git checkout your-branch
git merge master2-copy
# delete the temp branch
git branch -d master2-copy
然后,your-branch
与master2
完全相同,但是您可以不用强行将your-branch
推到远程位置。