我有两个git分支,branch_a和branch_b,两者都与分支主机分开。
我推了branch_a。但是,我想重置branch_a上的所有更改并将它们交换为branch_b上的更改。
我可以使用reversion提交将branch_a恢复到分歧点,然后在branch_b中合并branch_b或rebase branch_a。有更简单的方法吗?有没有办法说:“创建一个提交,使branch_a中的文件变得完全等于branch_b”?我不想解决冲突。 branch_a是错误的,branch_b是对的。但是我无法重置为branch_b,因为我已经推送了branch_a。
答案 0 :(得分:6)
如果您不希望来自branch_a的任何更改,那么我认为除了将branch_a中的所有内容恢复到分歧点然后将branch_b合并到branch_a之外,还有其他方法。这是一个简单的方法,取自answer:
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
答案 1 :(得分:3)
回复:“有更简单的方式”
这不会重置。但你应该能够使用“我们的”合并策略用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新手,所以 caveat emptor
答案 2 :(得分:0)
Git俱乐部的第一条规则就是你永远不会改变历史(参见http://git-scm.com/book/ch3-6.html#The-Perils-of-Rebasing)。如果删除公开的提交,你可能会搞乱其他开发人员状态,因此他们的变更集会挂起孤立的提交,这很难处理。
不幸的是,如果有任何常见的更改,只需应用reversion提交然后合并你的branch_b就会出现问题。恢复可以撤消更改,然后可能不会重新应用,具体取决于您何时进行分支。
Git分支实际上只是指向提交的指针,就像标记一样,所以如果你真的想让branch_a完全是branch_b(并且你还没有其他人使用该存储库)你可以删除branch_a git branch -D branch_a
然后执行git branch -m branch_b branch_a
。您最后剩下的任务是清理遥控器,您可以通过以下方式完成:
git push remote :branch_a # removes branch_a
git push remote branch_a
上述方法的优点是您没有合并,并且保证不会发生冲突。请确保没有其他人根据旧的branch_a进行更改。