同事使用我不熟悉的git合并策略,看起来很不寻常,我正在努力确保我理解合并是如何工作的。我的理解是正常的流程是:
master
git merge <work-branch-name>
如果您的工作分支已运行一段时间,我也会知道,您可以定期将master
合并到该分支中,以使其与其他更改保持同步。
我的同事所做的最后合并是git checkout master; git merge <work-branch-name>
。这导致如下所示的网络。黑色分支通常是主要的,在这个图像中,它实际上是同事在工作分支上所做的工作,而蓝色是在主人身上完成的工作。
所以问题是:这个流程有任何缺点吗?团队的其他成员执行更传统的“合并到master
”或重新定位。我的想法是,如果团队中的其他人在同事在其分支中编辑的相同位置对master
分支进行更改,则同事的工作可能会被覆盖。还有什么我可能会遗失的吗?
答案 0 :(得分:1)
所以我开始在reddit.com/r/git上回复这篇文章,但如果我在这里发布我的回复,它可能是更好的资源。
所以
git checkout workbranch
做工作 保存工作
git commit -a -m "message"
“现在'掌握'已经从它的位置开始了”
这是因为有人合并了更改并将其推送到掌握。 [OP在reddit帖子中回答了我的问题]
git checkout master
git pull
git checkout workbranch
git merge master
因此将主人合并到你的工作分支的目的是拉动别人可能推高的任何变化。这通常在您的工作分支需要与您的工作分支中可能需要相关更改的代码保持同步时使用。
执行这些步骤的更好方法是不结帐主人。如果有人在完成合并之前将更改推送到master,该怎么办?而是执行以下操作
git checkout workbranch
git fetch origin
git merge origin/master
通过运行git merge origin / master,你可以告诉它只是将master的远程分支合并到你当前的分支中 注意:这与您通过运行
签出的分支相同git checkout master
git pull
所以到目前为止,一切都是有意义的,这是做事的漫长道路,但它不是'错误的'
这是真正有关的部分。
git checkout master
git reset --hard workbranch
git push
快速浏览git reset的文档会产生以下内容,
git reset [] []
此表单将当前分支头重置为并可能更新索引(将其重置为树)和工作树取决于。如果省略,则默认为“--mixed”.....- 硬
重置索引和工作树。对工作树中跟踪文件的任何更改都将被丢弃 资料来源:https://git-scm.com/docs/git-reset
因此,它听起来像是重置了workbranch的提交并删除了所有其他更改。然后推送将更改发送到存储库。
通常,存储库应该拒绝或创建合并冲突,因为提交ID不对齐。这可能意味着git push -f正在发生,如果您不知道自己在做什么而其他人正在使用该存储库,则可能会导致一些令人头疼的问题。
答案 1 :(得分:0)
而不是
git checkout master;
git merge <work-branch-name>
DO
git rebase master
git checkout master;
git merge <work-branch-name>
rebase会产生明确的提交历史记录
也
`我也明白,如果你的工作分支已经运行一段时间,你可以 rebase 定期进入该分支,以使其与其他更改保持同步。&#39;
您可以在此tutorial
中找到详细说明 My thought is that the coworker's work might get overwritten, if someone else on the team makes changes on the master branch in the same places that the coworker has edited in their branch. Anything else I might be missing?
我和你在一起,解决合并冲突有时会导致失败的变化,工作会被覆盖。我们使用的做法是,在推送到掌握之前,我们从master获取和rebase,在本地解决冲突(如果有的话),运行所有单元测试。如果单元测试涵盖了更改,则将检测到任何合并错误。还有一个CI服务器,每次将更改推送到主服务器时都会运行集成测试。
答案 2 :(得分:0)
您应该在这里阅读完整且完整的答案:Local branch behind remote branch (pull, rebase, fetch, merge)
Summary
强> 而不是合并分支使用git pull --rebase
它会将所有提交放在分支的顶部。
从git 2.7
开始,你也可以设置开启/关闭自动加注功能。
git rebase --no-autostash