在Git中将主分支的更改合并到分支中

979
在我的代码仓库中,我有一个名为 aq 的分支正在进行中。
然后我在 master 分支上提交了新的工作和错误。
如何最好地将这些提交合并到 aq 分支中呢?是创建另一个从 master 分支创建的新分支,然后将其与 aq 合并?

3
将来,您还可以从主分支和需要修复的其他分支的共同祖先开始bugfix分支,以便将其合并到所有这些分支中,而无需选择其他内容。 - Cascabel
13
如果他不是唯一参与项目的人,那么这超出了他的控制范围。其他人会更新主分支。甚至您自己可能会从第三分支更新主分支,情况将是不可避免的,并且需要一个通用解决方案。@Jefromi - ahnbizcad
@ahnbizcad 我相信他可以控制自己分支的起点。如果他的分支是他想要合并的分支的共同祖先,并且其他人随后添加到这些分支中,它仍将是一个共同的祖先。 - Cascabel
各位,这个命令 git pull origin my_branch_name 是做什么用的? - Basheer AL-MOMANI
14个回答

1104

请查看aq分支,并从master进行变基操作。

git checkout aq
git rebase master

2
重定基可以来自任何其他分支吗?例如,git rebase otherbranch?看起来我的问题有点偏离了,我从一个分支分支,然后对原始分支进行了更改。 - Slee
4
如果我没错的话,基于拉取请求进行变基将显示所有主分支提交记录。如果您使用合并/源主分支,所有主分支提交将显示为1个提交记录,这将更容易进行代码审查。 - Foo Bar User
4
有时候,使用 git merge 会更好。如果两个分支随着时间的推移都发生了变化,你应该考虑哪个对你来说更好。 - erick2red
101
虽然来晚了,但这是一个非常好的关于何时使用rebase和merge的概述: https://www.atlassian.com/git/tutorials/merging-vs-rebasing/workflow-walkthrough - bogeylicious
9
如果你在分支 aq 上之前的提交是公开的,那么不要进行变基操作。 - Hanmant
显示剩余4条评论

428

当你在aq分支上时,只需执行git merge origin/master即可。

git checkout aq
git merge origin/master

63
“rebase是否更好”完全取决于具体情况。 - Bombe
19
为什么不直接调用“git merge master”而是要用“git merge origin/master”? - Michael Küller
213
如果您的分支是本地的且尚未推送到origin,请使用rebase命令。如果您的分支已经被推送了,请使用merge命令。rebase命令将重写提交历史记录。 - garbagecollector
22
@Toskan,你可能会遇到这样的问题,即你的本地主分支与远程分支不是最新的。通过这种方式,确保你正在合并远程代码的副本。 - Chris Kooken
15
@garbagecollector 我反对使用变基(我可以变基,但不会变基)。我认为没有必要冒险使用变基,这只会使事情变得更加复杂。你总是需要思考:“我是否已经将这个推送到远程了?”这很烦人,也很难解释给新手。有些人说它可以避免合并提交,但我想要有合并提交。它们不是杂乱无章的东西,而是记录分支合并的时间。所以最后一次,我们能不能停止像我们都在提交到主分支一样的行为?如果你非常不喜欢日志中的合并提交,只需使用 --no-merges 过滤它们。 - nurettin
显示剩余6条评论

134

首先检出主分支:

git checkout master

完成所有更改、热修复和提交,然后将它们推送到你的主分支(master)。

回到你的分支(aq),并将主分支(master)合并到它中:

git checkout aq
git merge master

你的分支将与主分支保持最新状态。合并的一个好而基本的示例是3.2 Git分支 - 基本分支和合并


37

不能保证主要的bug修复不会包含在其他提交中,因此你不能简单地合并。

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

假设那些提交代表了缺陷修复。

从现在开始,将缺陷修复分开放在一个单独的分支中。这样你就可以仅仅 …

git merge hotfixes

当您想将它们全部合并到常规开发分支时。


谢谢,我会借鉴你的建议,并从现在开始使用。我喜欢将错误修复放在单独的分支中的想法。不过,如果可能的话,我可能会将任何已知会导致更多错误的错误修复分离出来。 - Harsh

30

这个(来自于这里)对我有用:

git checkout aq
git pull origin master
...
git push

git pull origin master 命令会获取并合并主分支(master)的内容到你的分支,并创建一个合并提交。如果在此过程中出现任何合并冲突,你会被通知并必须在继续之前解决这些合并提交。当你准备好将本地提交,包括新的合并提交,推送到远程服务器时,请运行git push命令。


1
需要注意的是,如果特别需要合并,即如果由于某些原因无法对主分支进行变基,则此解决方案非常完美。 - guychouk

22

将其与aq合并

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push

8
为什么不能快进? - RedYeti

21

场景:

  • 我从主分支创建了一个名为branch-1的分支,并将它拉到了本地。
  • 我的朋友从主分支创建了一个名为branch-2的分支。
  • 他向主分支提交了一些代码更改。
  • 现在我想将这些更改从主分支合并到我的本地分支。

解决方案:

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 
执行 "git stash apply" 后,您可能会在文件中发现冲突。您需要手动修复它,然后就可以推送了。

值得注意的是,如果有其他人从你的分支中创建了一个分支(或者对你现有历史记录进行了更改),那么变基将会是一场噩梦。如果你的分支仅在本地存在,那么这没问题,但要小心重写已经发布的历史记录! - Will Eccles

16

可以通过 cherry-pick 将相关的提交合并到分支 aq 中,或者将分支 master 合并到分支 aq 中。


6
@Slee,你回答了自己……这不是解决这种情况的方法。 - mtet88

9

简单的方法

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A

8

对于我来说,我已经做出了更改,并且希望从基础分支中获取最新的更改。我无法进行 rebase,而 cherry-pick 将需要很长时间,因此我采取了以下措施:

git fetch origin <base branch name>  
git merge FETCH_HEAD

所以在这种情况下:
git fetch origin master  
git merge FETCH_HEAD

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