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 log
、gitk
等)查看您没有的“他们拥有什么”,反之亦然。有时这仅对 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 reset
或 git revert
。对于未发布的更改,git reset
通常是最好的方法;对于其他人已经进行的更改,git revert
可能会更好,但请参阅 Linus Torvald 关于恢复合并的建议:kernel.org/pub/software/scm/git/docs/howto/…
@WeDoTDD:我不明白这个问题。有许多用于查看提交图的命令(gitk
、git log --graph
,有或没有--oneline
,等等),您可以git show
或git 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
将 master 拉入您的分支 - 不影响 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 分支的主要内容,如果未能解决你的问题,请参考以下文章