如何将主分支(master)的内容通过“git pull”命令合并到开发分支(development branch)?

872

我在开发中有一个名为“dmgr2”的分支,并且我想从主分支(现场)拉取并将所有更改合并到我的开发分支中。有没有更好的方法来做这件事?

以下是我计划在提交更改后要做的事情:

git checkout dmgr2
git pull origin master

这会将实时更改拉入我的开发分支,或者我理解有误吗?


2
首先,在dmgr2分支中提交所有更改。然后指向主分支
  1. git checkout master,获取最新更改
  2. git pull
  3. git merge dmgr2
  4. git push -u origin master 然后回到你的dmgr2分支
  5. git checkout dmgr2
- mat_vee
我已经将所有更改提交到dmgr2分支了,抱歉忘记添加。 - Matthew Colley
6
如果我执行第四步,那不会将我的开发更改推送到主分支吗?我不想这样做。 - Matthew Colley
那么你的意思是想把主分支的更改合并到开发分支中? - JcKelley
31
使用git checkout dev命令切换到dev分支,然后运行git pull --rebase origin master命令。如果幸运的话,就不会出现冲突,dev分支将会拥有来自master分支的最新更改。 - jww
显示剩余2条评论
10个回答

1228

你列出的步骤是可行的,但还有一种更长的方式可以给你更多的选项:

git checkout dmgr2      # gets you "on branch dmgr2"
git fetch origin        # gets you up to date with origin
git merge origin/master

fetch 命令可以在 merge 之前的任何时候执行,也就是说,你可以交换 fetch 和 checkout 的顺序,因为 fetch 只是到指定的远程仓库(origin)并对其说:“给我所有我没有的东西”,即所有分支上的提交。它们会被复制到你的仓库中,但对于远程仓库上名为 branch 的任何分支,都会以 origin/branch 的名称命名。

此时,你可以使用任何查看器(如 git loggitk 等)来查看“他们有什么”你没有的,反之亦然。有时这只是为了获得温暖的感觉(“啊,是的,那确实是我想要的”),有时则有助于完全改变策略(“哇,我还不想要那些东西”)。

最后,merge 命令会获取给定的提交,你可以将其命名为 origin/master,并采取任何必要的措施将该提交及其祖先合并到运行 merge 命令时所在的任何分支中。如果需要,你可以插入 --no-ff--ff-only 来防止快进或仅在结果是快进时才合并。

当你使用以下序列时:

git checkout dmgr2
git pull origin master

pull 命令指示 git 运行 git fetch,然后运行相当于 git merge origin/master 的命令。因此,这几乎与手动完成这两个步骤是相同的,但可能有一些微妙的差异,这可能对您不太重要。 (特别是由 pull 运行的 fetch 步骤仅传输 origin/master,并且它不会更新存储库中的引用:1 任何新提交都只能由特殊的 FETCH_HEAD 引用来引用。)

如果您使用更明确的 git fetch origin(然后可选地查看周围内容),然后是 git merge origin/master 序列,则还可以通过跨网络运行一次 fetch 将自己的本地 master 更新为远程。

git fetch origin
git checkout master
git merge --ff-only origin/master
git checkout dmgr2
git merge --no-ff origin/master

例如。

1这个第二部分已经在git 1.8.4中进行了更改,现在会机会主义地更新“远程分支”引用。(正如发布说明所说,跳过更新是一个有意的设计决策,但事实证明更多的人喜欢git进行更新。如果您想要旧的远程分支SHA-1,默认情况下保存在reflog中,因此可以从中恢复。这也启用了一个新的git 1.9/2.0功能,用于查找上游rebase。)


43
我只是代表一个“朋友”问一下 - 如果要撤销这里的第一个代码块(checkout/fetch/merge),你会怎么做? - Rich Bradshaw
11
通常来说,git checkout 命令是不会破坏数据的,因此通常不需要撤销 git fetch。所以,你可能想知道如何撤销合并提交,对吗?答案与其他提交撤销方法相同:要么使用 git reset,要么使用 git revert。对于未发布的更改,git reset 通常是最好的方法;对于已经有其他人使用的更改,则可能更适合使用 git revert,但请参考 Linus Torvald 关于撤销合并提交的建议:https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt。 - torek
2
@WeDoTDD:我不理解这个问题。有许多命令可以查看提交图(如gitkgit log --graph带或不带--oneline等),您可以使用git showgit show -m来查看合并提交,或者使用git diff。在所有这些情况下,您都需要在命令行中输入指定的程序。 - torek
1
@torek:我试了你的方法:git checkout branch,然后git pull origin master,但它将所有master更改作为单个更改拉取,应该在本地再次提交,而不是使用它们的提交历史和消息进行拉取,因此在更新本地master并切换到分支后,“git rebase master”可以解决所有冲突,然后我添加到“git pull --rebase”并再次处理所有冲突,然后git push origin branch以使所有内容对齐。我想可能有更好的方法-我是对的吗? - GM1
1
@torek: 我同意我得到的结果是一个繁琐的过程,每次我想从主分支获取更新时都强制我处理重复的变基、合并等问题......但是,所提出的方式,我承认要容易得多,在本地分支下将所有更改都放在单个未提交的更改下,而不保留主分支提交顺序/历史记录。我很乐意了解如何使用“fetch”并跟踪主分支而无需使用“pull”等的更好建议。 - GM1
显示剩余11条评论

49

在我的本地分支工作时,我喜欢关注名为 dev 的开发分支的更新。

通常,我更喜欢使用:

git fetch
git rebase origin/dev

43
通常情况下,重新设置基础分支(rebase)应该仅在本地分支中进行,也就是说,该分支尚未被推送到任何地方,因为此操作会重写历史记录。请注意,这只是一般性声明。 - Locus
@Locus,有什么问题吗? - Veronica
3
我不知道当我写下这个评论时在想什么,因为答案已经很清楚地说明他正在处理一个本地分支。当你变基一个分支时,你会改变所有提交的哈希值。其他有权访问或克隆你的分支的人将无法知道你刚刚做了什么,并且将继续使用你的旧分支。我可能没有资格回答你的问题,你可以在这里了解更多关于重写历史的信息(https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History)。 - Locus
如果一个分支不是本地的,而你使用 rebase,会发生什么? - vitaliis
3
通常情况下,开发团队或大型开发公司不允许您重写远程分支的任何历史记录。 例如,在我工作的地方,我被允许重写我自己的远程分支,也就是我创建并推送为新分支的那个。 但是,如果我尝试检出同事的远程分支(非dev或main/master),我可能没有权限进行强制推送(rebase - 重写历史记录)。 这只是公司/团队政策或法规(金融机构)的问题。 - Xao

31

我成功地使用以下方法将最新的代码从主分支合并到我的分支:

git rebase origin/master

33
不要忘记先执行 git fetch origin - lenooh

27
如果您正在feature-1分支上,想要获取最新的已合并更新或减少合并冲突的可能性,那么可以执行以下操作拉取master分支:

git pull origin master
git pull
git merge origin/master

master 分支合并到你的分支中 - 不会影响 master 分支!

这样做会将自从你们两个分支分叉后进入 master 分支中的所有更改合并到你的分支中。

如果你的分支已经被公开,那么这样做是可以的,因为它不会重写历史记录。


13

我已经进行了主分支的更新和我的分支的更新,我希望我的分支通过变基(rebase)来跟踪主分支,以正确地跟踪所有历史记录。让我们将我的分支称为Mybranch:

git checkout master
git pull --rebase
git checkout Mybranch
git rebase master
git push -f origin Mybranch

根据情况和git提示,我需要使用 git mergetool, git rebase --continue, git rebase --skipgit add -u 来解决所有冲突,直到一切都解决为止。

注意:在Tzachi Cohen的帮助下,对上一个阶段进行更正,使用 "-f" 强制git在服务器上"更新历史记录" 。

现在,分支应与主分支对齐并完成变基,并且远程也已更新,因此在 git log 中不会出现"behind"或"ahead",我只需删除所有本地冲突的*.orig文件以保持文件夹"干净"。


2
这个答案简单易懂且有效。在主分支上有3个分支没有包含在主分支所做的更改。按照这些步骤一步一步执行就可以了。谢谢。 - Michael

7

如果dev干净并且只想用mainmaster的更改更新

  • git checkout dev
  • git pull origin <main or master>
  • git push origin dev

1
这个完美地起作用了,谢谢! - SkyFlyer

5

请使用比“这里”更有用的链接文本。请参阅“不要使用“点击此处”和其他常见的超链接错误”和“6.1链接文本”获取更多信息。 - the Tin Man

1
这是我的解决方案:
git checkout mybranch
git rebase master mybranch
git add .
git rebase --continue
git commit -a -m "test"
git pull
git push

使用git add .将您的文件暂存。

这里有另一种解决方案,可以将主分支的更改合并到您的分支中:

git checkout mybranch
git fetch origin
git merge origin/master

当你使用 rebase 时,你的git历史记录会更加清晰,但是使用merge origin/master 更加容易。


1
使用rebase的意义在于什么?当使用合并origin/master更容易且保留历史记录时,为什么要使用rebase呢? - Kravitz

1
  1. First, fetch the code using:

    git fetch
    
  2. Then use:

    git rebase origin/dev
    

1
欢迎来到SO!请阅读[答案]及其链接页面,以及"如何格式化我的帖子..."和"如何格式化我的代码块?"。 - the Tin Man

0

最好的方法是

首先进入主/原始分支

git checkout master/origin

First run " git branch temp"
then "git checkout temp"
& then "git merge development"

if any conflicts come, please resolve & commit 
and then 
1. git checkout development
2. git merge temp

完成以上操作后,请运行检查。

git branch 

如果结果是开发

否则运行

git checkout development

现在您正处于开发分支上

您可以运行

git merge temp

现在你可以将你的主分支代码合并到开发分支中。

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