我们有三个人正在使用git处理Django项目。
我比其他2人有更多的经验,所以在他们进入“主人”之前,所有的变化都来自我。
我们都在运行Windows,而且我们不是基于磁盘的共享工作的地方所以我们在linux盒子上的个人帐户中都有单独的“origin”回购。这些是我们彼此分享变更的一种方式,也是我们存储库的“异地”备份。
另外两个人之一创建了一个分支,让我们称之为BugA,然后他们进行修复。然后他们将它从他们的工作机器推送到我们都有权访问的linux机器,以便我可以查看更改并将它们合并到我的帐户上的“主”(这被认为是生产代码的副本)。
一旦他们完成BugA,他们将以新分支开始BugB。当我正在审查他们的工作时,我发现了一些问题(代码过多,注释丢失等等)。所以我对他们的代码进行了更改,测试并将其提交给掌握。
然后他们向我发送BugB的修复程序,我发现他们的更改存在各种冲突。这些冲突与我在提交中更改的代码有关。
当他们试图与我合并时,他们也报告了他们的冲突。
在写这篇文章时,我想我已经开始明白可能出现的问题了。我正在将他们的代码合并到我的主人,进行编辑和提交。我真的需要在我的仓库中对我的分支进行更改,推回它们以便合并,然后将它们合并到我的主人。
我不确定的是,该怎么做。一旦他们从我的仓库与他们的分支合并,那么他们必须与我的主人合并? 2合并而不是1?
由于我们在linux盒子上有一个外部托管的repo,这意味着两次推送,两次合并等等....
这真的应该如何运作吗?
答案 0 :(得分:2)
据我了解你的问题,你有三个远程回购(“起源”),一切都在进行:
repo_mark
repo_user1
repo_user2
情况如下:
BugA
)并执行一些修复repo_user1
(他的来源)
git push origin BugA:BugA
的更改,并将分支git fetch repo_user1
(包括您必须执行的一些更改)合并到您的的BugA
中master
(被认为是全球主要回购协议)为了使事情保持一致,您不必处理三个回购;只使用一个。指南是只有你才能推送到origin
,同时您的同事可能会推送到该回购邮件中的Bugfix分支。
因此,repo_mark/master
不会将user1
分支推送到其原点(不存在),而是推送到BugA
。
将repo_mark/BugA
的更改添加到BugA
(被视为 THE repo)后,您会告诉您的两位同事更新其工作副本(即执行repo_mark/master
其中git fetch origin
为origin
)后跟
repo_mark
现在,你们三个人共享同一个git checkout master
git rebase origin/master
分支。并且 - 您在问题中提到了备份 - master
ed的所有用户现在都拥有fetch
的完整备份。
这是通过告诉git
删除repo_mark
中BugA
的正确时间
repo_mark
以及git push origin :BugA
删除其本地user1
分支。
如果BugA
的工作同时启动,则BugB
的用户会执行
BugB
你告诉他更新后。可能会出现一些冲突,但不一定。
如果冲突得到解决,他可以继续git checkout BugB
git rebase master
工作,最后将工作推送到BugB
。
修改:git -- locking master branch for some users?的答案将向您展示如何为同事锁定repo_mark/BugB
。
编辑2:当然,你可以保留另外两个回购信息让你的同事在那里备份他们的工作:他们master
到这些回购,直到他们的工作准备传递到您和push
到push
。但在这种情况下,他们将负责保持他们的回购与你的同步,你应该在这种情况下摆脱困境。
答案 1 :(得分:0)
我能看到发生冲突的唯一方法是,如果通过“更改代码”来表示实际修改其提交,即使用新的SHA1创建提交并检查其中的提交。如果你试图保持你的历史“干净”(在我看来被高估),那么这些冲突就不存在了。但是,如果减少合并工作更重要,那么您需要在其上创建包含修复的新提交,而不是更改其提交。
如果这不是您修改提交的方式,那意味着您的工作流程中还有其他内容我不知道。让我知道,我会看到我还能想出什么。