如何使用包含许多分支的远程存储库?
How to work with a remote repository containing many branches?
让我们假设一个远程(中央)存储库有几个分支,一开始我在本地有远程存储库的精确副本。
现在我想在远程存储库的一个分支中更改一些内容。我可以对远程分支的本地副本进行一些更改,然后尝试推送它,但我想在这种情况下我可能会遇到难以解决的合并冲突。因此,我想需要执行以下操作:
- 创建远程分支(分支
A
)的本地副本(分支B
)的本地副本(分支C
)。
- 对此 "copy of the copy" 进行更改(分支
C
)。
- 再次拉取远程分支(分支
A
)。它将更新远程存储库(分支B
)的本地副本。
- 在本地将 "copy of the copy"(分支
C
,包含您的更改)合并到远程存储库(分支 [=12])的(更新的)本地副本(分支 B
) =],包含其他人所做的更改)。
- 现在您可以将远程存储库(分支
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 最安全的选择,也是很好的做法。
让我们假设一个远程(中央)存储库有几个分支,一开始我在本地有远程存储库的精确副本。
现在我想在远程存储库的一个分支中更改一些内容。我可以对远程分支的本地副本进行一些更改,然后尝试推送它,但我想在这种情况下我可能会遇到难以解决的合并冲突。因此,我想需要执行以下操作:
- 创建远程分支(分支
A
)的本地副本(分支B
)的本地副本(分支C
)。 - 对此 "copy of the copy" 进行更改(分支
C
)。 - 再次拉取远程分支(分支
A
)。它将更新远程存储库(分支B
)的本地副本。 - 在本地将 "copy of the copy"(分支
C
,包含您的更改)合并到远程存储库(分支 [=12])的(更新的)本地副本(分支B
) =],包含其他人所做的更改)。 - 现在您可以将远程存储库(分支
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 最安全的选择,也是很好的做法。