git-将分支准确地*同步到新master的文件吗?

时间:2019-04-17 08:52:37

标签: git

我有一个最初从master1分支出来的git分支,但是现在需要将其重新建立基础(如果这是正确的术语?)。

换句话说,我现在想将“分支”设置为与“ master2”相同的状态-即,与master2拥有完全相同的文件。

  • 我尝试将master2合并到分支中,此方法有效。但是,分支仍然包含master1中的旧文件,而master2则不包含-在从分支到master2创建PR时,它会尝试添加这些现在已过时的文件。
  • 我尝试了git checkout分支,然后git reset --hard master2。但是现在提交时,它失败了,说我当前分支的尖端在其远程对应的后面
  • 我认为也许git push --force可以帮助规避最后一个错误,但是我不能使用它,因为在服务器上已将其禁用

我有什么办法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

在本地运行git checkout foo && git reset master2 --hard是正确的。但是,由于无法执行强制推送,因此无法更新远程存储库中的foo。我们可以使用另一种方式使foomaster2具有相同的目录/文件,而无需重写历史记录。

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-branchmaster2完全相同,但是您可以不用强行将your-branch推到远程位置。