合并在 GitHub 上创建的不同本地分支
Merging branches on GitHub created on different locals
我是 Git 的新手,我正在尝试了解它的工作流程。我已经到了不知道如何完成我想做的事情的情况,很高兴有人能解释发生了什么,更重要的是为什么。
场景是这样的:我正在和另一个人一起做一个项目。该项目由不同的独立子项目组成。我们的想法是,我们将自己处理不同的子项目,并逐渐将这些子项目的结果添加到主项目中。
为了管理这个,我们在 GitHub 上创建了一个包含信息 A 的共享存储库。我们都将该存储库克隆到本地计算机。我在本地创建了一个新分支来处理子项目 B,他也为子项目 C 做同样的事情。最后我们只需要 GitHub 上的一个分支包含所有信息 A+B+C。
完成此任务有哪些不同的方法?我无法理解的是如何将我的工作 B 推送到 GitHub 而不进行任何更改(如删除)他已经放在那里的工作 C。如果他在本地将 A 和 C 合并为 A+C,将其推送到 GitHub,然后我对 A+B 执行相同操作,会发生什么情况; GitHub 上的 C 会怎样?是不是想办法把B和C的独立分支推到GitHub上,然后把A、B、C合并成A+B+C?
如您所知,我对此有点困惑,希望能提供一些帮助。
您应该首先了解 Git 中的分支是如何完成的。 Git 并不像您想象的那样真正有分支的概念。 Git "branch" 实际上只是指向提交的指针。
"branch"你想的,其实是通过chaining top commit(称为分支的HEAD,分支指针指向的地方),一路往下实现到初始提交。
当您合并两个分支时,Git 将对两个分支头进行三向合并,并在您要合并的分支上创建一个 new 提交将 合并到 ,以及您要合并的分支中的更改。
有3个案例:
- 分支
to-merge
中的所有提交都已经在分支 merge-into
中(当您创建分支 to-merge
、进行一些提交并合并到 [=11 时会发生这种情况=] 没有 merge-into
获得任何新的提交)。在这种情况下,Git 将执行快进(默认情况下),这意味着不会引入新的提交,但 merge-into
指针将简单地转发到 to-merge
指针所在的位置。导致 to-merge
中的所有提交现在也都在 merge-into
上。您可以使用 git merge --no-ff
标志覆盖此选项。
- 两个分支都有提交,但是分支
to-merge
中的更改 none 与分支 merge-into
中的更改重叠,在这种情况下,Git 将创建一个新提交与两个分支的合并结果。没有麻烦,没有问题。
- 两个分支都有提交,并且一些更改重叠。在这种情况下,Git 将拒绝合并,并要求您解决冲突。 Git 将使用特殊标记标记文件中的冲突,并在完成后要求您
git add
文件,并 commit
完成合并。
所以在你的情况下,我怀疑会发生的是:
- 分支 A 未开发。您从中创建分支 B 和 C。
- 分支 B 有您想要合并回 A 的工作。执行
git pull origin A
以获取最新更改(始终在合并之前执行!!!),然后执行 git checkout A; git merge B
。可能发生的是快进,因为 A 没有收到任何提交。
- 分支 C 现在有您要合并回 A 的工作。执行
git pull origin A
以获取最新更改(在合并之前始终这样做!!!) 然后 git checkout A; git merge C
。将要发生的是通过合并进行新的提交(您可以 git push origin A
返回远程),或者它会告诉您您有需要解决的冲突。在这种情况下,解析 git add
文件,然后 commit
和 push
.
阅读更多
我是 Git 的新手,我正在尝试了解它的工作流程。我已经到了不知道如何完成我想做的事情的情况,很高兴有人能解释发生了什么,更重要的是为什么。
场景是这样的:我正在和另一个人一起做一个项目。该项目由不同的独立子项目组成。我们的想法是,我们将自己处理不同的子项目,并逐渐将这些子项目的结果添加到主项目中。
为了管理这个,我们在 GitHub 上创建了一个包含信息 A 的共享存储库。我们都将该存储库克隆到本地计算机。我在本地创建了一个新分支来处理子项目 B,他也为子项目 C 做同样的事情。最后我们只需要 GitHub 上的一个分支包含所有信息 A+B+C。
完成此任务有哪些不同的方法?我无法理解的是如何将我的工作 B 推送到 GitHub 而不进行任何更改(如删除)他已经放在那里的工作 C。如果他在本地将 A 和 C 合并为 A+C,将其推送到 GitHub,然后我对 A+B 执行相同操作,会发生什么情况; GitHub 上的 C 会怎样?是不是想办法把B和C的独立分支推到GitHub上,然后把A、B、C合并成A+B+C?
如您所知,我对此有点困惑,希望能提供一些帮助。
您应该首先了解 Git 中的分支是如何完成的。 Git 并不像您想象的那样真正有分支的概念。 Git "branch" 实际上只是指向提交的指针。
"branch"你想的,其实是通过chaining top commit(称为分支的HEAD,分支指针指向的地方),一路往下实现到初始提交。
当您合并两个分支时,Git 将对两个分支头进行三向合并,并在您要合并的分支上创建一个 new 提交将 合并到 ,以及您要合并的分支中的更改。
有3个案例:
- 分支
to-merge
中的所有提交都已经在分支merge-into
中(当您创建分支to-merge
、进行一些提交并合并到 [=11 时会发生这种情况=] 没有merge-into
获得任何新的提交)。在这种情况下,Git 将执行快进(默认情况下),这意味着不会引入新的提交,但merge-into
指针将简单地转发到to-merge
指针所在的位置。导致to-merge
中的所有提交现在也都在merge-into
上。您可以使用git merge --no-ff
标志覆盖此选项。 - 两个分支都有提交,但是分支
to-merge
中的更改 none 与分支merge-into
中的更改重叠,在这种情况下,Git 将创建一个新提交与两个分支的合并结果。没有麻烦,没有问题。 - 两个分支都有提交,并且一些更改重叠。在这种情况下,Git 将拒绝合并,并要求您解决冲突。 Git 将使用特殊标记标记文件中的冲突,并在完成后要求您
git add
文件,并commit
完成合并。
所以在你的情况下,我怀疑会发生的是:
- 分支 A 未开发。您从中创建分支 B 和 C。
- 分支 B 有您想要合并回 A 的工作。执行
git pull origin A
以获取最新更改(始终在合并之前执行!!!),然后执行git checkout A; git merge B
。可能发生的是快进,因为 A 没有收到任何提交。 - 分支 C 现在有您要合并回 A 的工作。执行
git pull origin A
以获取最新更改(在合并之前始终这样做!!!) 然后git checkout A; git merge C
。将要发生的是通过合并进行新的提交(您可以git push origin A
返回远程),或者它会告诉您您有需要解决的冲突。在这种情况下,解析git add
文件,然后commit
和push
.