1

我们三个人使用 git 在一个 Django 项目上工作。

我比其他 2 人有更多的经验,所以所有的变化都是在他们进入“大师”之前由我来完成的。

我们都在运行 Windows,并且我们不在基于磁盘的共享可以工作的地方,因此我们在 linux 机器上的个人帐户中都有单独的“来源”存储库。这些是我们相互分享更改的一种方式,也是我们存储库的“异地”备份。

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

一旦他们完成了 BugA,他们将用一个新的分支开始 BugB。当我审查他们的工作时,我发现了一些问题(多余的代码,缺少注释等......)所以我对他们的代码进行了更改,对其进行测试并将其提交给 master。

然后他们将 BugB 的修复发送给我,我得到了与他们的更改发生的各种冲突。这些冲突发生在我在提交中更改的代码行上。

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

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

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

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

这真的是它应该如何工作的吗?

4

2 回答 2

2

据我了解您的问题,您有三个远程存储库(“起源”),一切都在进行:

  • 你的仓库(带有生产代码)repo_mark
  • user1 的仓库repo_user1
  • user2 的仓库repo_user2

场景如下:

  • user1 创建一个错误修复分支 ( BugA) 并进行一些修复
  • 然后,他将更改推送到repo_user1(他的起源)git push origin BugA:BugA
  • 然后,您获取所做的更改git fetch repo_user1并将分支BugA(包括您必须做的一些更改)合并到master origin(被认为是全局主仓库)中

为了使事情保持一致,您不必处理三个存储库;只用一个。指导方针是只有你被允许推送,repo_mark/master而你的同事可以推送到该仓库中的 Bugfix 分支。

因此,user1不会将BugA分支推到他的原点(不存在),而是推到repo_mark/BugA.

一旦您将更改BugA放入repo_mark/master(被认为是存储库),您告诉您两个同事更新他们的工作副本(即执行git fetch originwhere originis repo_mark),然后是

git checkout master
git rebase origin/master

现在,你们三个共享同一个master分支。而且——你在问题中提到了备份——每个编辑过的用户都有你现在fetch的完整备份。repo_mark

这将是通过告诉 git删除BugA的正确时间repo_mark

git push origin :BugA

user1删除他的本地BugA分支。

如果工作BugB同时开始,正在工作的用户BugB会做一个

git checkout BugB
git rebase master

在你告诉他更新之后。可能会出现一些冲突,但不是必须的。

如果冲突得到解决,他可以继续工作BugB并最终将工作推到repo_mark/BugB.


编辑:git的答案——为某些用户锁定主分支?将向您展示如何master为您的同事锁定。


编辑 2:当然,您可以保留其他两个存储库,让您的同事在那里备份他们的工作:他们push到这些存储库,直到他们的工作准备好传递给您,然后再传push递给repo_mark. 但在这种情况下,他们将负责保持他们的回购与你的同步,在这种情况下你应该摆脱困境。

于 2011-08-30T13:39:04.380 回答
0

我可以看到发生冲突的唯一方法是,如果通过“更改他们的代码”,您的意思是实际修改他们的提交,即使用新的 SHA1 创建提交并将其签入。如果你想保持你的历史“干净”(在我看来被高估了),那么这些冲突就没有办法解决了。但是,如果减少合并的工作更重要,那么您不想更改他们的提交,而是希望在其之上创建一个包含您的修复的新提交。

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

于 2011-08-30T14:05:01.430 回答