在这里寻找最佳实践。我们的过程是从master那里创建一个新分支
master --> myBranch
进行更新,然后推送至开发人员
myBranch --> dev
很明显,有时我们在开发人员上存在合并冲突。在这种情况下,我们通过以下方式结帐我们的分支机构:
git fetch origin myBranch
git checkout dev
git merge FETCH_HEAD
然后我们解决冲突并...
git push origin HEAD
我对上述内容的理解是,我将myBranch手动合并到dev中,然后将本地dev更改推送到remote。
通常到此为止。
但是现在我需要对myBranch进行进一步的更新,并推送到dev,这就是我的困扰。我现在是否(可能)会遇到与以前相同的冲突?这里的最佳做法是什么?我应该做git pull origin dev
来更新自己的分支以匹配dev吗?
答案 0 :(得分:2)
按照以下顺序提取远程数据并更新分支:
git checkout myBranch
git pull
git checkout dev
git pull
git merge myBranch
... resolve conflicts ...
git push HEAD
如果myBranch
将再次编辑文件的相同部分,将来有可能再次发生相似冲突。但是,冲突永远不会完全相同。
如果仍要避免这种情况-您需要将合并提交推送到myBranch
(但请注意,它将所有dev
更改都带到myBranch
):
git checkout myBranch
git merge dev
... this is a Fast-Forward merge ...
git push HEAD
您的理解是正确的:
...我正在将myBranch手动合并到dev中,然后将本地dev更改推送到remote。
这几乎也是正确的:
我应该做一个
git pull origin dev
来更新自己的分支以匹配dev吗?
所以,是的-当前方法确实将myBranch
手动合并到dev
中,然后将dev
推送到远程存储库中。是的-最好先更新本地dev
。
有两个不正确的假设,很高兴您创建了一个SO问题来验证它们。
首先-git pull origin dev
不是更新您本地分支机构dev
的通用命令。它的作用是拉动远程dev
的更改,但是仅当您已经在本地dev
上时,它才会更新。似乎您不是-因为在提供的示例中,您在合并FETCH_HEAD之前先检查了该分支。因此,建议要么在拉出更改之前先检查分支:
git checkout dev
git pull origin dev
git fetch origin myBranch
git merge FETCH_HEAD
git push HEAD
或使用其他命令来获取更改并更新您的本地分支(您当前不能在该分支上):
git fetch origin dev:dev
git checkout dev
git fetch origin myBranch
git merge FETCH_HEAD
git push HEAD
但是可能更简单的是仅提取所有更新,然后合并所需的分支:
git checkout dev
git pull
git merge origin/myBranch
git push HEAD
但是,以上所有代码段均未将本地myBranch
更新为在远程存储库中所做的更改,因此不便进行进一步的工作。因此,最佳做法是在合并两个本地分支之前先对其进行更新:
git checkout myBranch
git pull
git checkout dev
git pull
git merge myBranch
git push HEAD
第二:
我应该做一个
git pull origin dev
来更新自己的分支以匹配dev吗?
这不仅是合并所必需的,而且还具有将更改推回的能力。如果您不会更新本地dev
,而远程dev
中有一些更改,那么您将无法将合并提交推送到远程存储库,因此您需要解决首先是更多冲突。
第三:
我需要对myBranch进行进一步的更新...我现在(可能)不会像以前一样遇到相同的冲突吗?
这是可能的,尽管这些冲突不会完全相同。为了获得它们,myBranch
将需要修改在dev
中更改的代码部分(包括该合并提交中的内容)。修改其他文件甚至同一文件其他部分中的代码不会产生冲突。为避免冲突,您最好也将myBranch
与dev
同步(如果您可以看到其他dev
的更改已移至myBranch
):
... do all the pull-merge-push stuff as suggested above ...
git checkout myBranch
git merge dev
... this is a Fast-Forward merge ...
git push HEAD