在这里寻找最佳实践。我们的过程是我们从master创建一个新的分支
master --> myBranch
进行我们的更新,然后推送到dev
myBranch --> dev
显然,有时我们在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
来更新我自己的分支以匹配开发?
使用此序列来提取远程数据并更新分支:
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更改推送到远程。
这也几乎是正确的:
我应该做一个
git pull origin dev
来更新我自己的分支以匹配开发?
所以,是的 - 当前的方法确实手动将myBranch
合并到dev
,然后将dev
推送到远程存储库。是的 - 最好先更新当地的dev
。
有一些假设是不正确的,你创建一个SO问题以验证它们是很好的。
首先 - git pull origin dev
不是一个普遍正确的命令来更新你的本地分支dev
。它的作用是拉动远程dev
changes,但它只更新你当地的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
中有一些更改,那么您实际上将无法将合并提交推送到远程存储库,并且您将需要首先解决更多冲突。
第三:
我需要进一步更新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