我们用git做错了什么?

时间:2011-08-30 12:48:30

标签: git merge-conflict-resolution

我们有三个人正在使用git处理Django项目。

我比其他2人有更多的经验,所以在他们进入“主人”之前,所有的变化都来自我。

我们都在运行Windows,而且我们不是基于磁盘的共享工作的地方所以我们在linux盒子上的个人帐户中都有单独的“origin”回购。这些是我们彼此分享变更的一种方式,也是我们存储库的“异地”备份。

另外两个人之一创建了一个分支,让我们称之为BugA,然后他们进行修复。然后他们将它从他们的工作机器推送到我们都有权访问的linux机器,以便我可以查看更改并将它们合并到我的帐户上的“主”(这被认为是生产代码的副本)。

一旦他们完成BugA,他们将以新分支开始BugB。当我正在审查他们的工作时,我发现了一些问题(代码过多,注释丢失等等)。所以我对他们的代码进行了更改,测试并将其提交给掌握。

然后他们向我发送BugB的修复程序,我发现他们的更改存在各种冲突。这些冲突与我在提交中更改的代码有关。

当他们试图与我合并时,他们也报告了他们的冲突。

在写这篇文章时,我想我已经开始明白可能出现的问题了。我正在将他们的代码合并到我的主人,进行编辑和提交。我真的需要在我的仓库中对我的分支进行更改,推回它们以便合并,然后将它们合并到我的主人。

我不确定的是,该怎么做。一旦他们从我的仓库与他们的分支合并,那么他们必须与我的主人合并? 2合并而不是1?

由于我们在linux盒子上有一个外部托管的repo,这意味着两次推送,两次合并等等....

这真的应该如何运作吗?

2 个答案:

答案 0 :(得分:2)

据我了解你的问题,你有三个远程回购(“起源”),一切都在进行:

  • 您的回购(包含生产代码)repo_mark
  • rep1 of user1 repo_user1
  • repo of user2 repo_user2

情况如下:

  • user1创建错误修复分支(BugA)并执行一些修复
  • 然后,他用[{1}}
  • 将更改推送到repo_user1(他的来源)
  • 然后,您获取执行git push origin BugA:BugA的更改,并将分支git fetch repo_user1(包括您必须执行的一些更改)合并到您的BugAmaster(被认为是全球主要回购协议)

为了使事情保持一致,您不必处理三个回购;只使用一个。指南是只有你才能推送到origin,同时您的同事可能会推送到该回购邮件中的Bugfix分支。

因此,repo_mark/master不会将user1分支推送到其原点(不存在),而是推送到BugA

repo_mark/BugA的更改添加到BugA(被视为 THE repo)后,您会告诉您的两位同事更新其工作副本(即执行repo_mark/master其中git fetch originorigin)后跟

repo_mark

现在,你们三个人共享同一个git checkout master git rebase origin/master 分支。并且 - 您在问题中提到了备份 - master ed的所有用户现在都拥有fetch的完整备份。

这是通过告诉git

删除repo_markBugA的正确时间
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到这些回购,直到他们的工作准备传递到您和pushpush。但在这种情况下,他们将负责保持他们的回购与你的同步,你应该在这种情况下摆脱困境。

答案 1 :(得分:0)

我能看到发生冲突的唯一方法是,如果通过“更改代码”来表示实际修改其提交,即使用新的SHA1创建提交并检查其中的提交。如果你试图保持你的历史“干净”(在我看来被高估),那么这些冲突就不存在了。但是,如果减少合并工作更重要,那么您需要在其上创建包含修复的新提交,而不是更改其提交。

如果这不是您修改提交的方式,那意味着您的工作流程中还有其他内容我不知道。让我知道,我会看到我还能想出什么。