关于git:使分支等于另一个分支

Making a branch equal to another branch

我有两个git分支,一个是branch_,另一个是branch_,都是从branch master分支出来的。

我已经推了branch_a。但是,我想重置branch_a上的所有更改,并将它们替换为branch_b上的更改。

我可以使用reversion commits将branch_a恢复到分叉点,然后合并branch_b,或者在branch_b中重新设置branch_a。有更简单的方法吗?有没有办法说:"创建一个提交,使分支A中的文件完全等于分支B"?我不想解决冲突。分支机构A是错误的,分支机构B是正确的。但是我不能重置为分支,因为我已经推过分支了。


如果你不想从分支A中得到任何改变,那么我认为除了将分支A中的所有内容恢复到分叉点,然后将分支B合并到分支A中,没有其他方法。下面是一个简单的方法,摘自以下答案:

1
2
3
4
5
6
7
8
9
10
11
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

即使已经推过分支,仍然可以将分支"A"重置为与分支"B"相同的值,但有一些警告。基本上,如果这个分支只由你使用,那么做是相当安全的,但是如果其他人也在这个分支上工作,你需要与他们协调,步骤取决于你的具体情况,所以我不能在这里给出一个一般的答案。

如果你想走那条路,下面是怎么做的:

1
2
3
git checkout branch_a
git reset --hard branch_b
git push -f origin branch_a


回复:"有更简单的方法吗?"

这不会像这样重置。但是,您应该能够使用"我们的"合并策略,用这样的分支覆盖分支A:

1
2
3
4
git checkout branch_b
git merge -s ours branch_a
git checkout branch_a
git merge branch_b

结果应该是你的分支A现在基本上是分支B。

我是个新手,所以要注意空行者


Git俱乐部的第一条规则是,一旦历史被推送,就永远不会改变它(参见http://git scm.com/book/ch3-6.html重新平衡的危险)。如果删除公开的提交,则可能会使其他开发人员的状态混乱,因此它们是变更集,挂起孤立的提交,这是一个很难处理的问题。

不幸的是,如果有任何常见的更改,那么只应用恢复提交,然后合并您的分支_B就有问题了。根据您何时进行了分支操作,还原操作可能会撤消随后可能无法重新应用的更改。

Git分支实际上只是提交的指针,与标记的方式相同,因此如果您真的想使分支A完全是分支B(并且您没有其他人使用存储库),您可以使用git branch -D branch_a删除分支A,然后执行git branch -m branch_b branch_a。然后,最后剩余的任务是清理遥控器,您可以通过以下方式完成:

1
2
git push remote :branch_a  # removes branch_a
git push remote branch_a

上述方法的优点是您不会合并,并且保证不会发生冲突。只需确保没有其他人根据旧分支进行更改。