git pull 从 master 到 development 分支

Posted

技术标签:

【中文标题】git pull 从 master 到 development 分支【英文标题】:How to "git pull" from master into the development branch 【发布时间】:2013-12-04 19:16:17 【问题描述】:

我有一个名为 dmgr2(开发)的分支,我想从主分支(实时站点)中提取所有更改并将所有更改合并到我的开发分支中。有一个更好的方法吗? 这是我在提交更改后计划做的事情:

git checkout dmgr2
git pull origin master

这应该将实时更改拉入我的开发分支,还是我错了?

【问题讨论】:

首先在 dmgr2 分支中提交所有更改。然后指向master 1.git checkout master 然后获取最新的变化 2.git pull 3.git merge dmgr2 4.git push -u origin master 然后回到你的dmgr2 5.git checkout dmgr2 我已经将所有更改提交到 dmgr2 分支,抱歉忘记添加了 如果我执行第 4 步,这不会将我的开发更改推到 master 中吗?我不想那样做 那么您的意思是要将更改从您的 master 分支带到您的 dev 分支? 使用git checkout dev 切换到dev 分支。然后git pull --rebase origin master。如果幸运的话,不会有冲突,并且 dev 将从 master 获得最新的更改。 【参考方案1】:

您列出的步骤将起作用,但还有更长的方法可以为您提供更多选择:

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 只是转到指定的远程(origin)并对它说:“给我你所有我没有的东西”,即所有分支上的所有提交。它们被复制到您的存储库中,但对于远程上名为 branch 的任何分支,它们都被命名为 origin/branch

此时,您可以使用任何查看器(git loggitk 等)查看您没有的“他们拥有什么”,反之亦然。有时这仅对 Warm Fuzzy Feelings 有用(“啊,是的,这实际上就是我想要的”),有时它对完全改变策略很有用(“哇,我还不想要那些东西”)。

最后,merge 命令接受给定的提交,您可以将其命名为 origin/master,并尽一切努力将该提交及其祖先引入到运行 @987654333 时所在的任何分支@。您可以插入 --no-ff--ff-only 以防止快进,或者仅在结果为快进时合并。

当你使用序列时:

git checkout dmgr2
git pull origin master

pull 命令指示 git 运行 git fetch,然后是 git merge origin/master 的道德等价物。因此,这几乎与手动执行这两个步骤相同,但存在一些您可能不太关心的细微差别。 (特别是 pull 运行的 fetch 步骤带来 only origin/master,并且它不会更新您的 repo 中的 ref:1 任何新的提交仅由特殊的 FETCH_HEAD 引用引用。)

如果您使用更明确的git fetch origin(然后可以选择环顾四周),然后使用git merge origin/master 序列,您还可以使用遥控器将您自己的本地master 更新到最新状态,只需运行一个fetch跨网络:

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 功能来查找上游变基。)

【讨论】:

我只是在找一个,呃,朋友 - 你将如何撤消你在这里的第一个代码块(结帐/提取/合并)? @RichBradshaw: git checkout 通常是非破坏性的,通常没有理由撤消git fetch,所以听起来你在问如何退出合并提交。答案与其他提交相同:git resetgit revert。对于未发布的更改,git reset 通常是最好的方法;对于其他人已经进行的更改,git revert 可能会更好,但请参阅 Linus Torvald 关于恢复合并的建议:kernel.org/pub/software/scm/git/docs/howto/… @WeDoTDD:我不明白这个问题。有许多用于查看提交图的命令(gitkgit log --graph,有或没有--oneline,等等),您可以git showgit show -m 合并提交,或使用git diff。在所有这些情况下,您都是在命令行输入命令时指定程序。 @torek:尝试了你的方式:git checkout branch 然后 git pull origin master,但是它将所有主更改作为一个单独的更改拉取,应该再次在本地提交,而不是通过提交拉取它们历史和消息,所以在更新本地主机并切换到分支后,“git rebase master”完成所有冲突的工作以解决,然后我添加到“git pull --rebase”并再次处理所有冲突,然后 git push原始分支以使所有对齐。我想应该有更好的方法 - 对吗? @torek:我同意我得到的结果是一个令人厌烦的过程,它迫使我处理重复的 rebase & merge &... 每次我想从 master 那里获得更新...但是,提议的方式,我承认这更容易,在本地分支的单个未提交更改下获得所有更改,而无需保留主提交顺序/历史记录。我很高兴了解如何使用“fetch”并跟踪 master 而无需使用“pull”等更好的建议。【参考方案2】:

情况:在我的本地分支工作,但我喜欢在名为 dev 的开发分支中保持更新。

解决方案:通常,我更喜欢这样做:

git fetch
git rebase origin/dev

【讨论】:

通常的免责声明只有在本地分支是本地分支时才应该执行 rebase,也就是说,在重写历史时没有被推送到任何地方。 @Locus 会有什么问题? 我不知道我在写这篇评论时在想什么,因为答案中非常清楚地表明他正在当地唯一的分支机构工作。当您重新设置分支时,您会更改所有提交的哈希值。其他有权访问或克隆您的分支的人将无法知道您刚刚做了什么,并且将使用您的旧分支。我可能没有资格回答你的问题,你可以了解更多关于重写历史here。 如果一个分支不是本地的并且你使用rebase会发生什么?【参考方案3】:

这对我有用。 从 master 获取最新代码到我的分支

git rebase origin/master

【讨论】:

别忘了先git fetch origin【参考方案4】:

git pull origin master --allow-unrelated-histories

如果您的历史记录不匹配并且无论如何想要合并它,您可能想要使用它..

参考here

【讨论】:

【参考方案5】:

场景

我有 master 更新和我的分支更新,我希望我的分支通过 rebase 跟踪 master,以正确跟踪所有历史记录,让我们将我的分支称为 Mybranch

解决方案

git checkout master
git pull --rebase
git checkout Mybranch
git rebase master
git push -f origin Mybranch
需要解决所有冲突与 git mergetool &、git rebase --continue、git rebase --skip、git add -u,根据情况和 git 提示,直到全部解决

(对最后阶段的更正,由 Tzachi Cohen 提供,使用“-f”强制 git 在服务器上“更新历史记录”)

现在分支应该与master对齐并重新定位,也与远程更新,所以在git log中没有“后面”或“前面”,只需要删除所有本地冲突* .orig文件以保持文件夹“干净”

【讨论】:

这个答案要简单得多,而且做得很好。 master 有 3 个分支缺少 master 中所做的更改。完全按照这些步骤操作,它起作用了。谢谢【参考方案6】:

如果你在 feature-1 分支上并且你想拉 master --(也许是为了获得最新的合并更新/减少合并冲突的机会),做:

git pull
git merge origin/master

ma​​ster 拉入您的分支 - 不影响 master!

这会将自从你们两个分道扬镳之后进入 master 的任何东西都拉到你的分支中。

如果您的分支已经被公开,这样做很好,因为它不会重写历史记录。

【讨论】:

【参考方案7】:

这是我的解决方案

git checkout mybranch
git rebase master mybranch
git add .
git rebase --continue
git commit -a -m "test"
git pull
git push

混帐添加。用于暂存文件

还有另一个解决方案可以让你的主更改到你的分支

git checkout mybranch
git fetch origin
git merge origin/master

使用 rebase 时你的 git 历史很清楚,但使用 merge origin/master 更容易

【讨论】:

以上是关于git pull 从 master 到 development 分支的主要内容,如果未能解决你的问题,请参考以下文章

Git 代码更新:git fetch 和 git pull 的区别

git之fetch和 pull的区别

Git中checkout、fetch和pull的区别

git fetch 和git pull 的差别

git pull后为啥分支没有更新

git pull origin master,在没有pull的情况下检查是不是有冲突