【问题标题】:GIT Branch Work FlowGIT 分支工作流程
【发布时间】:2023-11-26 03:19:02
【问题描述】:

在一个大型团队项目中工作,这是我们的工作流程:

 // create branch
 git checkout -b mybranch
 (do work)
 // commit to branch locally
 git commit -a
 // push to remote
 git push origin mybranch
 (repeat)

在我们的分支中完成工作后,我们将分支合并到 master:

 // go to master
 git checkout master     
 // update
 git pull master
 // merge our branch into master
 git merge mybranch
 (solve conflicts)
 git push

现在我们只需重复上述步骤,几天的工作流程就很好了。现在突然间,每个人都在其他组成员分支和主控上获得非转发更新。例如有人 git 在 master 中拉入,然后合并但他们无法推送。它说非快进推动。这很奇怪,因为它说 master 完全是最新的。

下面是紧接着一个 git pull, git merge mybranch, git push:

  ! [rejected]        master -> master (non-fast-forward)
  error: failed to push some refs to 'git@github.com:foo/project.git'
  To prevent you from losing history, non-fast-forward updates were rejected
  Merge the remote changes (e.g. 'git pull') before pushing again.  See the
  'Note about fast-forwards' section of 'git push --help' for details.

然而 git pull 说我们是最新的。

所以问题是,对于 GIT 中的大型团队,预期的工作流程是什么?我们应该如何处理分支机制。

谢谢!

【问题讨论】:

    标签: git github versioning


    【解决方案1】:

    您之前的工作流程没有问题。

    您引入新的更改,将您的分支合并在一起,然后推出合并的结果。您可以选择使用rebase 而不是merge 进行从未公开的更改。

    这里的问题很可能是有人在他们的本地副本中重写了历史;如果发生这种情况,您将是“最新的” - 例如,您的工作副本与远程端相同 - 但您将无法推送。

    如果您重新克隆存储库,然后从那里执行mergepush,它可能会成功。

    【讨论】:

    • 既然可以 git checkout master 为什么要重新克隆; git reset --hard origin/master?
    • @chazomaticus 我不知道他们的本地存储库做了什么。据我们所知,origin 有两种不同的含义。一个新的开始是干净和明确的。
    • Borealid 可能是正确的,因为例如 rebase 会重写历史。我只想补充一点,我会将我的分支保留在本地,而不是将它们推送到原点,因为原点会被大量不必要的“mybranch”垃圾邮件发送,除非 mybranch 必须与其他人共享,否则请将其保留在本地。