如何使用包含许多分支的远程存储库?

How to work with a remote repository containing many branches?

让我们假设一个远程(中央)存储库有几个分支,一开始我在本地有远程存储库的精确副本。

现在我想在远程存储库的一个分支中更改一些内容。我可以对远程分支的本地副本进行一些更改,然后尝试推送它,但我想在这种情况下我可能会遇到难以解决的合并冲突。因此,我想需要执行以下操作:

  1. 创建远程分支(分支A)的本地副本(分支B)的本地副本(分支C)。
  2. 对此 "copy of the copy" 进行更改(分支 C)。
  3. 再次拉取远程分支(分支A)。它将更新远程存储库(分支B)的本地副本。
  4. 在本地将 "copy of the copy"(分支 C,包含您的更改)合并到远程存储库(分支 [=12])的(更新的)本地副本(分支 B) =],包含其他人所做的更改)。
  5. 现在您可以将远程存储库(分支B)的本地副本(包含您的更改和其他人的更改)推送到远程分支(A)。

我想我的描述可能令人困惑。所以,我试着用不同的词来概括它:Copy A into B, copy B into C, modify C, update B使用 A 的新状态(基本上再次将 A 复制到 B),将 C 合并到 B,将 B 推入 [=12] =].

这是要走的路吗?

在 Git 中使用共享分支(即多个工程师可能 same/almost 同时修改的分支)的一个非常常见的工作流程如下:

git pull origin the_branch
# work work work
git push origin the_branch

正如您正确指出的那样,您在推送时可能会遇到问题,因为在您推送的那一刻,其他人可能已经将其他提交推送到 the_branch 之上。这里有两种基本方法触手可及。首先,你可以拉合并远程 the_branch 到你的本地分支,然后推出:

git pull origin the_branch
# possibly resolve merge conflicts, then make a merge commit
git push origin the_branch

这种方法会在您的本地分支中创建一个合并提交,因此该提交通常也可能作为远程分支历史记录的一部分出现。如果你不喜欢合并提交,那么变基是这里的另一种选择:

git pull --rebase origin the_branch
# again, possibly resolve merge conflicts
git push origin the_branch

如果你选择变基选项,那么你将把你的提交直接放在远程分支的顶部,就好像你的本地分支已经有其他人最近所做的提交一样。

这两种方法都存在挥之不去的边缘情况。如果在你的 merge/rebase 和你去推送的时间之间出现新的 material 会发生什么。如果发生这种情况,那么您将不得不再次 merge/rebase。但根据我的经验,这种情况几乎从未发生过,实际上我什至不记得这种情况发生在我身上一次。

您描述的是标准开发实践 - 本地和远程分支通常在同一个提交上(在您的情况下为 a 和 b),开发在第三个分支 C 上完成。

在推送到您拉出的遥控器之前,然后在结果之上进行变基(这通常比合并更可取)C 并推回。

这是 IMO 最安全的选择,也是很好的做法。