将一个分支设置为另一个分支的副本

9

我有两个git分支,branch_a和branch_b,两个分支都与主分支(master)不同。

我已经推送了branch_a。然而,我想要重置branch_a上的所有更改,并将其替换为branch_b上的更改。

我可以使用还原提交(reversion commits)将branch_a还原到分叉点,然后合并branch_b,或者在branch_b中对branch_a进行变基(rebase)。是否有更简单的方法?是否有一种方法可以说:“创建一个提交,使得branch_a中的文件完全等于branch_b”?我不想解决冲突。branch_a是错误的,branch_b是正确的。但是我不能重置到branch_b,因为我已经推送了branch_a。

3个回答

10

如果你不希望从branch_a中进行任何更改,那么我认为除了回滚到分歧点并将branch_b合并到branch_a之外,没有其他方式。以下是一个简单的方法,摘自这个答案

git checkout branch_b

git reset <the common ancestor commit>

# Move the branch pointer back to the previous HEAD.
git reset --soft HEAD@{1}

git commit -m "Revert to <the common ancestor commit>"

# Update working copy to reflect the new commit.
git reset --hard

即使分支已经被推送,仍然有可能将 branch_a 重置为与 branch_b 相同,但需要注意一些问题。如果该分支只由您使用,则这样做是相当安全的,但如果其他人也在该分支上工作,您需要与他们协调,具体步骤取决于您的特定情况,因此我无法在此提供通用答案。

如果您想采用此方法,请按照以下步骤操作:

git checkout branch_a
git reset --hard branch_b
git push -f origin branch_a

8

关于“是否有更简单的方法”的回复

这并不是真正意义上的重置。但您可以使用“ours”合并策略来将branch_b覆盖掉branch_a,像这样:

git checkout branch_b
git merge -s ours branch_a
git checkout branch_a
git merge branch_b

结果应该是你的branch_a现在基本上就是branch_b。

我是一名Git初学者,所以请注意。


0

Git俱乐部的第一条规则是,一旦提交了历史记录,就不要更改它(请参见http://git-scm.com/book/ch3-6.html#The-Perils-of-Rebasing)。如果您删除了公共提交,可能会破坏其他开发人员的状态,使他们的变更集挂在一个孤立的提交上,这很麻烦。

不幸的是,如果有任何共同的更改,仅应用反转提交然后合并branch_b存在问题。反转可能会撤消更改,然后可能无法重新应用,这取决于分支创建的时间。

Git分支实际上只是指向提交的指针,与标签的方式相同,因此,如果您确实希望使branch_a完全等于branch_b(并且没有其他人使用该存储库),则可以使用git branch -D branch_a删除branch_a,然后使用git branch -m branch_b branch_a。您最后剩下的任务是清理远程,可以通过以下方式完成:

git push remote :branch_a  # removes branch_a
git push remote branch_a

以上方法的优点是您不需要合并,且保证不会出现冲突。只需确保没有其他人基于旧的 branch_a 进行了更改即可。

如果您有生产系统,这不是解决方案。 - Nikolai Ehrhardt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接