从master到Git中的分支获取更改


687

在我的存储库中,有一个aq正在使用的分支。

然后,我在中进行了新工作和错误master

使那些提交进入aq分支的最佳方法是什么?创建另一个新分支master并将其合并aq


3
将来,您还可以从需要修复的master和其他分支的共同祖先启动bugfix分支,这样您就可以将其合并到所有这些分支中,而无需进行任何其他修复。
卡斯卡贝尔2011年

2
@Jefromi,但是如果他不是唯一从事该项目的人,那将是他无法控制的。其他人更新主人。地狱,您自己可能会从第三个分支更新主服务器,这种情况将不可避免,需要一个通用的解决方案。
ahnbizcad 2015年

@ahnbizcad我很确定他可以控制自己开设分支机构的位置。如果他的分支是他要合并的分支的共同祖先,而人们随后又添加到这些分支中,那么它仍将是一个共同的祖先。
卡斯卡贝尔2015年

伙计们的问题,这条命令是这样做的吗git pull origin my_branch_name
Basheer AL-MOMANI 17-10-16

Answers:


792

检出aq分支,然后从进行基准调整master

git checkout aq
git rebase master

可以从任何其他分支机构改头换面吗?就是 git rebase otherbranch?看来我的问题还差一点,我从一个分支分支,然后更改了原始分支。
斯利

2
如果即时消息正确,则基于pull请求,它将显示所有主提交。如果您使用合并/起源母版,则所有母版提交将显示为1个提交,这使代码检查更加容易。
Foo Bar用户

4
有时候,git merge会更好。如果两个分支都随着时间而发展,那么您应该考虑哪个最适合您。
erick2red 2015年

70
迟到了,但是这是什么时候变基VS合并了很好的概述:atlassian.com/git/tutorials/merging-vs-rebasing/...
ebuat3989

7
如果您先前在分支aq上的提交是公开的,则不要重新设置基准。 atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant

300

您应该只git merge origin/master在aq分支上就可以。

git checkout aq
git merge origin/master

55
改组是否“更好”完全取决于具体情况。
孟买

13
您为什么不只叫“ git merge master”而不是“ git merge origin / master”?
MichaelKüller2013年

144
使用rebase,如果你的分支是本地的,并没有被推倒originmerge如果您的分支已经被推送,请使用。rebase将重写历史记录。
垃圾收集器2014年

17
@Toskan,您可能会遇到本地主机与遥控器不兼容的问题。这样可以确保您合并到代码的远程副本中。
克里斯·库肯

8
@garbagecollector我反对重新设定基准(我可以,但不会重新设定基准)我认为没有理由押底。它只是使事情变得不必要地复杂。您总是有一个问题:“我是否将其推送到远程?” 思考,向新来者解释是一件痛苦的事情。有人说它避免合并提交。但是我想要合并提交。它们不杂乱无章,它们记录分支合并时的情况。因此,对于最后一次,我们是否可以最终停止像我们都致力于掌握的那样行动?如果您非常不喜欢日志中的合并提交,请使用--no-merges过滤它们。
nurettin

92

首先签出要掌握:

git checkout master

完成所有更改,修复程序和提交,然后推送您的主服务器。

返回到分支“ aq”,并在其中合并主节点:

git checkout aq
git merge master

您的分支机构将是最新的。合并的一个很好的基本示例是3.2 Git分支-基本分支和合并


25

不能保证主要错误修复不在其他提交中,因此您不能简单地合并。做

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

假设这些提交代表错误修复。

从现在开始,将错误修复保留在单独的分支中。您将能够

git merge hotfixes

当您想将它们全部放入常规dev分支中时。



13

与它合并 aq

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

8

简单的方法

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

7

对我来说,我已经进行了更改,我希望从基础分支获得最新消息。我无法做rebase,并且cherry-pick会永远坚持下去,所以我做了以下事情:

git fetch origin <base branch name>  
git merge FETCH_HEAD

所以在这种情况下:

git fetch origin master  
git merge FETCH_HEAD

7

这(从这里开始)对我有用:

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

报价:

git pull origin master获取master分支的内容并将其与您的分支合并,并创建合并提交。如果有任何合并冲突,您会在此阶段收到通知,您必须在解决合并提交之前进行处理。准备好将本地提交(包括新的合并提交)推送到远程服务器时,请运行git push


需要特别注意的是,如果特别需要合并(即,由于某些原因而无法重新建立master分支),则此解决方案是完美的。
cudacoder '19

3

您有两种选择。git rebase master aq到将保留提交名称的分支上,但是如果这是一个远程分支,则不要重新设置。你可以git merge master aq,如果你不关心保持提交的名称。如果要保留提交名称,并且它是一个远程分支,git cherry-pick <commit hash>则将提交提交到您的分支。


0

您也可以通过运行一行来做到这一点。
git merge aq master

这相当于

git checkout aq
git merge master

这没有按照您认为的去做。git merge a b合并分支a并合并b到当前分支。但是git merge a当您在分支机构a时什么也做不了(这就是为什么它看起来有点像您认为的那样做的原因)。(见git-scm.com/docs/git-merge#Documentation/...
MikeBeaton

0

编辑:

我的回答以下文件的方式合并masteraq,在那里,如果你认为它列出了所做的更改合并的细节aq之前合并,而不是修改的内容上master。我已经意识到那可能不是您想要的,即使您认为是!

只是:

git checkout aq
git merge master

很好

是的,此简单的合并将显示从masteraq那时所做的更改,而不是相反。但这没关系–因为那是发生了!稍后,当您最终将分支合并到中时master,即合并将最终显示您对所做的所有更改master(这正是您想要的,这也是人们期望无论如何都要找到该信息的提交)。

我检查了一下,当您最终将所有内容合并回时,下面的方法也显示与上面的普通方法完全相同的更改(aq自从原来的aq和之间进行的所有更改mastermaster。因此,我认为它的唯一真正的缺点(除了过于复杂和非标准...:-/)是,如果回退了最近的更改,git reset --hard HEAD~<n>并且超出了合并范围,则下面的版本将回滚“错误”分支,您必须手工修复(例如,使用git refloggit reset --hard [sha])。


[所以,我以前认为是:]

出现问题:

git checkout aq
git merge master

因为合并提交中显示的更改(例如,如果您现在或以后在Github,Bitbucket或您最喜欢的本地git历史记录查看器中查看)是对master所做的更改,而这可能不是您想要的。

另一方面

git checkout master
git merge aq

显示在aq中所做的更改,这可能就是您想要的。(或者,至少,这通常是我想要的!)但是显示正确更改的合并在错误的分支上!

怎么应付?

整个过程以合并提交显示出来,该更改显示了对aq所做的更改(根据上述第二次合并),但是合并影响了aq分支,因此,整个过程是:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

这:将aq合并到主节点上,将相同的合并快速合并到aq,在主节点上撤消它,然后再次将您放回aq!

我觉得我缺少了一些东西-这似乎是您显然想要的东西,而这是很难做到的。

同样,rebase不是等效的。它丢失了时间戳和在aq上进行的提交的标识,这也不是我想要的。


0

场景:

  • 我从master say branch-1创建了一个分支,并将其拉到我的本地。
  • 我的朋友创建了一个分支,从主人说分支2。
  • 他对母版进行了一些代码更改。
  • 现在,我想将这些更改从master分支转移到我的本地分支。

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”后,您可以在文件上找到冲突。您需要手动修复它,现在可以开始推送了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.