如何在团队成员之间共享大型 git 合并
How to share a large git merge amongst team members
当将两个分支合并在一起导致 1000 多个冲突(分支有很大分歧)时,能够将工作分配给一个团队的最佳做法是什么?
假设代码库位于包含 20 个项目的 Visual Studio 解决方案中,每个团队成员一次合并一个项目、解决冲突然后提交并推送到远程是有意义的其他团队成员可以得到已经完成的合并工作。
这是一个场景:
有3个分支:master,A和B。A从master分支出来,B从A分支出来。
分支 A 不断更新,但会定期推送到 master。
B 已经完成了很多工作,但很长时间没有将 A 合并到其中。
A 需要合并到 B 以使 B 尽可能接近 A 以确保在最终将 B 合并到 A 之前一切正常(然后 A 可以进入 master 并且 B 可以是删除)
我们遇到的问题是,一旦团队成员将他们的 A->B 合并工作推送到 B,git 就会假设从 A 到 B 合并的整个合并已经解决。
例如假设第一个团队成员想要将分支 A 的 Project1 合并到分支 B 的 Project1 中。他们从 B 中创建一个分支(称之为 B-submerge),然后将 A 合并到 B-submerge,修复 [=33= 中的冲突]Project1 然后暂存、提交并将 Project1 文件推送到 B.
这让 git 相信从 A->B 合并时不需要进一步的合并工作。这意味着当另一个团队成员试图创建自己的 B-sumbmerge2 并将 A 合并到其中以解决 Project2 中的冲突时, git 认为没有工作要做。
是否有可以用来处理这种情况的策略?
历史
所以,你有以下分支,对吧?
--o--o--------------o-----o--------o--------o master
\ / / / /
\ / / / /
o--o--o--o--o--o--o--o--o--o--o--o--o--o--o A
\
\
o--o--o--o--o--o--o--o--o--o B
我将直到(不包括)"push the Project1 files into B" 的描述解释为大约以下 git 命令:
cd /the/source/project1
get checkout -b project1.B_submerge B
git merge A
# Fix the conflicts
git add $the_modified_files_in_project1
git commit -m "Merge of branch A into project1"
问题
此时您想将分支 project1.B_submerge
合并到 B
,而不继续从 A
合并导致的 "something is merged from A" 属性 (例如,创建下面的 X
版本)。
---------o--------o master
/ /
/ /
--o--o--o--o--o--o--o A
\
\
--o--o--o--o--o-----------------X B
\ \ *
\ \ *
o--------o--o project1.B_submerge
解决方案
这可以通过使用 git apply
命令来完成。
cd /the/source/project1
git checkout B
git diff B project1.B_submerge | git apply
git add .
git commit -m "Merge of project1.B_submerge using git apply"
git apply
命令获取一个补丁并应用到当前分支,通过将当前分支的差异和其他任何内容提供给它,它将有效地使当前分支与内容 100% 相同除此之外。
所以这将使 B
分支的内容与 project1.B_submerge
分支的内容相同,但没有任何合并引用。请注意,这将是单个 "squashed" 提交。
NB 这将完全丢弃在 get checkout -b project1.B_submerge B
命令之后在 B
上所做的任何提交。如果这是可能的,请使用
创建一个目标分支
git checkout -b target_B $(git merge-base B project1.B_submerge B)
并在上面的 git 应用命令部分中使用它代替 B
,然后合并或变基到 B
的尖端。
@hlovdal 的回答很好,但我会详细说明。
诀窍是创建一个 'integration' 分支 'B' 并且从未 'A' 合并到其中。这可以防止 git 在合并历史方面出现任何混淆。
每关闭一个子分支'B'
- 合并到'A'
- 取消所有因合并而自动显示的更改。
- 解决 project1 合并冲突。
- 暂存并提交 project1
的所有添加、删除和修改的文件
- 在提交 project1 之前和之后的点之间创建一个 diff/patch,例如
git diff e5ffdee a3ae287 > merge_project1.diff
现在,在 integration 分支中,使用 git apply <path to patch file>/merge_project1.diff
应用补丁
从那里开始,另一个致力于合并 project2 的人现在可以获得 project1 修复。假设他们已经将 A 合并到 B 的分支中,他们:
- 现在可以使用
git checkout origin/integration -- project1_dir
[=53 检查对 project1 所做的更改(现在它们存在于 integration 中) =]
- 提交 project1 更改(到他们的本地分支)
- 解决 project2 更改
- 提交并提交 project2 更改
- 根据 project2 提交前后的差异创建补丁。
- 将补丁应用于 集成
当一切都完成后,整合可以合并到A.
当将两个分支合并在一起导致 1000 多个冲突(分支有很大分歧)时,能够将工作分配给一个团队的最佳做法是什么?
假设代码库位于包含 20 个项目的 Visual Studio 解决方案中,每个团队成员一次合并一个项目、解决冲突然后提交并推送到远程是有意义的其他团队成员可以得到已经完成的合并工作。
这是一个场景:
有3个分支:master,A和B。A从master分支出来,B从A分支出来。
分支 A 不断更新,但会定期推送到 master。
B 已经完成了很多工作,但很长时间没有将 A 合并到其中。
A 需要合并到 B 以使 B 尽可能接近 A 以确保在最终将 B 合并到 A 之前一切正常(然后 A 可以进入 master 并且 B 可以是删除)
我们遇到的问题是,一旦团队成员将他们的 A->B 合并工作推送到 B,git 就会假设从 A 到 B 合并的整个合并已经解决。
例如假设第一个团队成员想要将分支 A 的 Project1 合并到分支 B 的 Project1 中。他们从 B 中创建一个分支(称之为 B-submerge),然后将 A 合并到 B-submerge,修复 [=33= 中的冲突]Project1 然后暂存、提交并将 Project1 文件推送到 B.
这让 git 相信从 A->B 合并时不需要进一步的合并工作。这意味着当另一个团队成员试图创建自己的 B-sumbmerge2 并将 A 合并到其中以解决 Project2 中的冲突时, git 认为没有工作要做。
是否有可以用来处理这种情况的策略?
历史
所以,你有以下分支,对吧?
--o--o--------------o-----o--------o--------o master
\ / / / /
\ / / / /
o--o--o--o--o--o--o--o--o--o--o--o--o--o--o A
\
\
o--o--o--o--o--o--o--o--o--o B
我将直到(不包括)"push the Project1 files into B" 的描述解释为大约以下 git 命令:
cd /the/source/project1
get checkout -b project1.B_submerge B
git merge A
# Fix the conflicts
git add $the_modified_files_in_project1
git commit -m "Merge of branch A into project1"
问题
此时您想将分支 project1.B_submerge
合并到 B
,而不继续从 A
合并导致的 "something is merged from A" 属性 (例如,创建下面的 X
版本)。
---------o--------o master
/ /
/ /
--o--o--o--o--o--o--o A
\
\
--o--o--o--o--o-----------------X B
\ \ *
\ \ *
o--------o--o project1.B_submerge
解决方案
这可以通过使用 git apply
命令来完成。
cd /the/source/project1
git checkout B
git diff B project1.B_submerge | git apply
git add .
git commit -m "Merge of project1.B_submerge using git apply"
git apply
命令获取一个补丁并应用到当前分支,通过将当前分支的差异和其他任何内容提供给它,它将有效地使当前分支与内容 100% 相同除此之外。
所以这将使 B
分支的内容与 project1.B_submerge
分支的内容相同,但没有任何合并引用。请注意,这将是单个 "squashed" 提交。
NB 这将完全丢弃在 get checkout -b project1.B_submerge B
命令之后在 B
上所做的任何提交。如果这是可能的,请使用
git checkout -b target_B $(git merge-base B project1.B_submerge B)
并在上面的 git 应用命令部分中使用它代替 B
,然后合并或变基到 B
的尖端。
@hlovdal 的回答很好,但我会详细说明。
诀窍是创建一个 'integration' 分支 'B' 并且从未 'A' 合并到其中。这可以防止 git 在合并历史方面出现任何混淆。
每关闭一个子分支'B'
- 合并到'A'
- 取消所有因合并而自动显示的更改。
- 解决 project1 合并冲突。
- 暂存并提交 project1 的所有添加、删除和修改的文件
- 在提交 project1 之前和之后的点之间创建一个 diff/patch,例如
git diff e5ffdee a3ae287 > merge_project1.diff
现在,在 integration 分支中,使用 git apply <path to patch file>/merge_project1.diff
从那里开始,另一个致力于合并 project2 的人现在可以获得 project1 修复。假设他们已经将 A 合并到 B 的分支中,他们:
- 现在可以使用
git checkout origin/integration -- project1_dir
[=53 检查对 project1 所做的更改(现在它们存在于 integration 中) =] - 提交 project1 更改(到他们的本地分支)
- 解决 project2 更改
- 提交并提交 project2 更改
- 根据 project2 提交前后的差异创建补丁。
- 将补丁应用于 集成
当一切都完成后,整合可以合并到A.