将Git分支合并到master中的最佳(也是最安全)方法是什么?

moe 1977 git git-merge branching-and-merging git-branch

master创建了一个新的分支,我们称之为test.

有几个开发人员要么提交master或创建其他分支,然后再合并master.

假设工作test需要几天时间,并且您希望不断test更新内部提交master.

我会做git pull origin mastertest.

问题1:这是正确的方法吗?其他开发人员可以轻松地处理相同的文件,就像我工作顺便说一句.


我的工作test已经完成,我准备把它合并回来master.以下是我能想到的两种方式:

A:

git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test 

B:

git checkout test
git pull origin master
git checkout master
git merge test

我没有使用,--rebase因为根据我的理解,rebase将从中获取更改master并将其叠加在其上,因此它可以覆盖其他人所做的更改.

问题2:这两种方法中哪一项是正确的?那有什么区别?

所有这一切的目标是让我的test分支更新所发生的事情,master然后我可以将它们合并回master希望保持时间线尽可能线性.

KingCrunch.. 2824

我该怎么做

git checkout master
git pull origin master
git merge test
git push origin master

如果我有一个远程本地分支,我觉得将其他分支与远程分支合并后感觉不舒服.此外,我不会推动我的更改,直到我对我想要推送的内容感到满意,而且我根本不会推送任何内容,这些内容仅适用于我和我的本地存储库.在您的描述中,似乎test只适合您?所以没有理由发表它.

git总是试图尊重你和他人的变化,所以也会如此--rebase.我不认为我能够恰当地解释它,所以看看Git书 - 重新定位git-ready:介绍变基础以获得一些描述.这是一个非常酷的功能

  • @shanyangqu从遥控器获取最新的更改.如果您单独工作并且只使用一个系统,则没有问题.但是当从不同的系统(可能来自不同的开发人员)推送更改时,只要您尝试推送合并(第4步),就会发现冲突.现在唯一的解决方案是将您的本地主服务器合并到远程主服务器中,这最终会形成一个非常难看的"合并主服务器到源/主服务器"合并提交.因此,在合并之前进行拉动总是一个好主意 (43认同)
  • @Duncanmoo当然,分支`test`必须存在.当然,您可以使用提交哈希,但通常更容易使用分支名称.在内部,它只检索分支的"HEAD"的哈希值. (16认同)
  • "在您的描述中似乎,该测试仅适用于您?因此没有理由发布它." 例如,如果该服务器提供针对本地驱动器的备份失败,或者您没有其他方法进行备份,则可能需要将本地分支推送到服务器. (7认同)
  • git merge test给了我致命的消息:test并不指向提交。我必须在“ git log”中查找测试分支上的提交点,然后切换回主分支,然后执行“ git merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234”。 (2认同)
  • __“ ......在我对要推送的内容感到满意之前,我也不会推送更改...” __为什么不备份以备份您的代码,以防您的本地计算机死机了努力了吗? (2认同)

John Yin.. 366

这是一个非常实际的问题,但上述所有答案都不切实际.

喜欢

git checkout master
git pull origin master
git merge test
git push origin master

这种方法有两个问题:

  1. 这是不安全的,因为我们不知道测试分支和主分支之间是否存在任何冲突.

  2. 它会将所有测试提交"挤压"到master上的一个合并提交中; 也就是说在master分支上,我们看不到测试分支的所有更改日志.

所以,当我们怀疑会有一些冲突时,我们可以进行以下git操作:

git checkout test
git pull 
git checkout master
git pull
git merge --no-ff --no-commit test

merge之前测试commit,避免快速提交--no-ff,

如果遇到冲突,我们可以运行git status以检查有关冲突的详细信息并尝试解决

git status

一旦我们解决了冲突,或者没有冲突,我们commitpush他们

git commit -m 'merge test branch'
git push

但是这种方式将丢失测试分支中记录的更改历史记录,这将使主分支很难让其他开发人员了解项目的历史记录.

所以最好的方法是我们必须使用rebase而不是merge(假设,在这个时候,我们已经解决了分支冲突).

以下是一个简单的示例,对于高级操作,请参阅http://git-scm.com/book/en/v2/Git-Branching-Rebasing

git checkout master
git pull
git checkout test
git pull
git rebase -i master
git checkout master
git merge test

是的,当你完成鞋面时,所有Test分支的提交都将转移到Master分支的头部.变基的主要好处是,您可以获得线性且更清晰的项目历史记录.

你唯一需要避免的是:永远不要rebase在公共分支上使用,比如master branch.

切勿执行以下操作:

git checkout master
git rebase -i test

https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing的详细信息

附录:

  • 声明"它不是一种安全方式,因为我们不知道测试分支和主分支之间是否存在任何冲突"是不正确的:一个人总是可以中止合并.即使没有冲突,只要没有推送,你总是可以撤消上一次本地提交.如果没有正确理解git,有些事情可能看起来有些可怕或不清楚,但"不安全"在任何方面都是错误的.请注意不要将其他人的信息混淆. (13认同)
  • 重新定位本质上比合并更不安全.提议将变基作为一种更安全的合并选择是错误的.重新定位是一种有效的策略,但需要注意用户应注意的更多警告. (6认同)
  • 我同意重新定位测试分支,以便以后合并到master中是可行的方法.即使其他答案都是正确的,这将保留分支机构测试的变化历史,作为版本控制系统的目的,提到"你得到一个班轮和更清洁的项目". (3认同)
  • 同意@PaulvanLeeuwen,当您将测试分支合并到主服务器时,您将收到有关冲突的通知,以及您将介入并合并更改的通知.一旦完成,您将提交合并并推回.如果您后悔或似乎无法正确合并,您可以随时丢弃您的工作并再次从主人那里取出.所以它绝对不是不安全的.. (3认同)
  • 为什么rebase -i? (3认同)

raylu.. 89

无论是rebase还是合并都不应该覆盖任何人的更改(除非您在解决冲突时选择这样做).

开发过程中的常用方法是

git checkout master
git pull
git checkout test
git log master.. # if you're curious
git merge origin/test # to update your local test from the fetch in the pull earlier

当你准备合并回主人,

git checkout master
git log ..test # if you're curious
git merge test
git push

如果你担心在合并git merge --abort上有什么破坏,那就适合你.

使用push然后pull作为合并的手段是愚蠢的.我也不确定你为什么要把测试推向原点.

  • 你不这样做:那是(git stash)的用途之一. (11认同)
  • 什么?你是说它每次切换分支时都会增加提交次数?或者你是说每次切换分支时,都必须"提交你的分支"?第一个是不真实的,我不确定第二个意味着什么. (2认同)

Martin Thoma.. 40

我会首先使待合并的分支尽可能干净.运行测试,确保状态符合您的要求.通过git squash清理新的提交.

除了KingCrunches的回答,我建议使用

git checkout master
git pull origin master
git merge --squash test
git commit
git push origin master

您可能在另一个分支中进行了许多提交,这应该只是主分支中的一个提交.为了使提交历史尽可能干净,您可能希望将所有提交从测试分支压缩到主分支中的一个提交中(另请参阅:Git:压缩或不压缩?).然后,您还可以将提交消息重写为非常富有表现力的内容.一些易于阅读和理解的东西,无需深入研究代码.

编辑:你可能会感兴趣

所以在GitHub上,我最终为功能分支做了以下事情mybranch:

从原点获取最新信息

$ git checkout master
$ git pull origin master

找到合并基础哈希:

$ git merge-base mybranch master
c193ea5e11f5699ae1f58b5b7029d1097395196f

$ git checkout mybranch
$ git rebase -i c193ea5e11f5699ae1f58b5b7029d1097395196f

现在确保只有第一个pick,其余的是s:

pick 00f1e76 Add first draft of the Pflichtenheft
s d1c84b6 Update to two class problem
s 7486cd8 Explain steps better

接下来选择一个非常好的提交消息并推送到GitHub.然后发出拉取请求.

合并拉取请求后,您可以在本地删除它:

$ git branch -d mybranch

并在GitHub上

$ git push origin :mybranch


djheru.. 7

这是我在团队工作中使用的工作流程.场景如您所述.首先,当我完成工作时,test我会与主人一起工作,以便在我在test分支机构工作期间拉入已添加到主人的任何内容.

git pull -r upstream master

这将把更改拉到master,因为你分叉test并应用它们,然后应用你所做的更改来"测试"当前master的状态.如果其他人对您在测试中编辑的相同文件进行了更改,则此处可能存在冲突.如果有,您将必须手动修复它们并提交.完成后,您可以切换到主分支并合并test而不会出现任何问题.


Robin Wieruc.. 6

旧线程,但是我还没有找到解决方法。这对于使用rebase并希望将master分支(功能)中的所有提交合并的某人来说可能是有价值的。如果途中有冲突,则可以为每次提交解决它们。在此过程中,您可以完全控制,并且可以随时中止。

获得最新的Master和Branch:

git checkout master
git pull --rebase origin master
git checkout <branch_name>
git pull --rebase origin <branch_name>

合并分支到Master之上:

git checkout <branch_name>
git rebase master

可选:如果在重新设置基准期间遇到冲突:

首先,解决文件冲突。然后:

git add .
git rebase --continue

推送您的基础分支:

git push origin <branch_name>

现在,您有两个选择:

  • A)创建一个PR(例如在GitHub上)并通过UI将其合并
  • B)返回命令行并将分支合并到master
git checkout master
git merge --no-ff <branch_name>
git push origin master

做完了