【问题标题】:What are we doing wrong with git?我们在 git 上做错了什么?
【发布时间】:2011-11-06 18:53:35
【问题描述】:

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

我比其他两个经验丰富,所以所有的变化都是在他们进入“大师”之前由我来完成的。

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

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

一旦他们完成了 BugA,他们就会从一个新的分支开始 BugB。在审查他们的工作时,我发现了一些问题(过多的代码、缺少 cmets 等......)所以我对他们的代码进行了更改、测试并提交给 master。

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

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

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

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

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

它真的应该是这样工作的吗?

【问题讨论】:

  • 可以简化您的问题吗?

标签: git merge-conflict-resolution


【解决方案1】:

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

  • 你的仓库(带有生产代码的)repo_mark
  • 用户1的回购repo_user1
  • 用户2的repo repo_user2

场景如下:

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

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

所以,user1 不会将 BugA 分支推送到他的原点(不存在),而是推送到 repo_mark/BugA

一旦您将BugA 的更改放入repo_mark/master(这被认为是THE 回购),您告诉您的两个同事更新他们的工作副本(即做一个git fetch origin where originrepo_mark) 后跟一个

git checkout master
git rebase origin/master

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

现在是删除 repo_mark 中的 BugA 的合适时机,方法是告诉 git

git push origin :BugA

并为user1 删除他的本地BugA 分支。

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

git checkout BugB
git rebase master

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

如果冲突得到解决,他可以继续处理BugB,最后将工作推送到repo_mark/BugB


编辑:git -- locking master branch for some users? 的答案将向您展示如何为您的同事锁定master


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

【讨论】:

  • +1 让我查找并理解 git push origin :BugA 步骤。
  • 如何防止他们提交 repo_mark/master?目前我正在使用隔离存储库的文件系统权限。
【解决方案2】:

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

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

【讨论】:

  • 我一直在合并 --no-commit,然后对比 HEAD 并进行修复。我的想法是错误的提交不会击中大师。也许我可以在他们的分支上进行多次提交,然后与 master 合并?
猜你喜欢
  • 2021-03-24
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 2021-03-26
  • 2018-10-12
  • 2011-06-01
相关资源
最近更新 更多