git从master拉到开发分支


493

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

git checkout dmgr2
git pull origin master

这应该将实时更改引入我的开发部门,还是我有这个错误?


1
首先在dmgr2分支中提交所有更改。然后指向master 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

1
如果我执行步骤4,会不会将我的开发更改推向高潮?我不想这么做
Matthew Colley,

所以,您要说的是要将变更从您的master分支带入您的dev分支吗?
JcKelley

9
用切换到dev分支git checkout dev。然后git pull --rebase origin master。如果幸运的话,将不会有冲突,而开发人员将拥有master的最新更改。
jww '16

Answers:


722

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

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只需转到命名的remote(origin)并对它说:“给我所有我没有的东西”,即所有分支上的所有提交。它们被复制到您的存储库中,但以在远程上命名origin/branch的任何分支命名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。因此,这几乎与手动执行两个步骤相同,但是有一些细微的差异可能对您而言不太重要。(特别是fetchby所执行的步骤只会pull带来,并且不会更新您的存储库中的ref:1任何新的提交只会被特殊引用引用。) origin/masterFETCH_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功能,用于查找上游基准。


28
我只是问一个,呃,朋友-您将如何撤消此处的第一个代码块(签出/提取/合并)?
Rich Bradshaw 2014年

10
@RichBradshaw:git checkout通常是非破坏性的,并且通常没有理由撤消a git fetch,因此听起来您正在询问如何撤消合并提交。答案与其他提交的答案相同:git resetgit revert。对于未发布的更改git reset通常是最好的方法。更改其他公司已经有了,git revert可能会更好,但看到林纳斯·托瓦兹的建议对恢复合并:kernel.org/pub/software/scm/git/docs/howto/...
托雷克

2
@WeDoTDD:我不明白这个问题。有观看的许多命令提交图(gitkgit log --graph有或没有--oneline,等等),你可以git showgit show -m合并提交,或使用git diff。在所有这些情况下,都是在命令行上输入命令时指定程序。
torek

1
@torek:尝试了以下方式:git checkout分支,然后git pull origin master,但是它将所有master更改作为单个更改拉出,应将其重新提交到本地,而不是使用提交历史记录和消息来拉动它们,因此在更新本地之后master并切换到分支,“ git rebase master”可以解决所有冲突,然后添加到“ git pull --rebase”并再次处理所有冲突,然后git push origin分支以使所有对齐。我想应该有更好的方法-是吗?
user10556443 '19

1
@torek:我同意我得到的结果是一个令人厌烦的过程,每次我想从主服务器获取更新时,都会迫使我处理重复的rebase&merge和...但是,我承认的建议方法很多更容易,将所有更改置于本地分支的一个未提交更改下,而无需保留主提交顺序/历史记录。我将很高兴得知更好的建议,即如何使用“获取”并掌握母带而不需要使用“拉”等
。– user10556443

14

现状:在我的本地分支机构工作,但是我喜欢在名为的开发分支机构中保持更新dev

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

git fetch
git rebase origin/dev

15
使用通常的免责声明,仅当本地分支仅是本地分支,即在重写历史记录时未将其推送到任何地方时,才应执行rebase。
轨迹


3

场景

我有master更新和我的分支更新,我希望我的分支通过重新部署来跟踪master,以便正确跟踪所有历史记录,我们称我的分支为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 --skip,git add -u,直到一切解决

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

现在分支应该与主节点对齐并重新设置基础,并与远程更新对齐,因此在git log上没有“ behind”或“ ahead”,只需要删除所有本地冲突* .orig文件即可保持文件夹“ clean”

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.