gpt4 book ai didi

git - merge 到主分支时,在第一个分支被压扁后 merge 分支的分支

转载 作者:IT王子 更新时间:2023-10-29 00:40:45 25 4
gpt4 key购买 nike

这是我在工作中经常处理的工作流程。

git checkout -b feature_branch
# Do some development
git add .
git commit
git push origin feature_branch

此时,我的同事正在审查功能分支,但我想继续开发依赖于 feature_branch 的其他功能。因此,当 feature_branch 正在审查中时......

git checkout feature_branch
git checkout -b dependent_branch
# Do some more development
git add .
git commit

现在我根据 feature_branch 上的代码审查做出一些更改

git checkout feature_branch
# Do review fixes
git add .
git commit
git checkout dependent_branch
git merge feature_branch

现在这就是我们遇到问题的地方。我们在 master 上有一个压缩策略,这意味着 merge 到 master 中的特性分支必须被压缩到一个提交中。

git checkout feature_branch
git log # Look for hash at beginning of branch
git rebase -i first_hash_of_branch # Squash feature_branch into a single commit
git merge master

一切都很酷,除了 dependent_branch。当我尝试将依赖分支 rebase 到 master 或尝试将 master merge 到其中时,git 被重写/压缩的历史搞糊涂了,基本上将 depedendent_branch 中的每一个更改标记为冲突。这是一个 PITA,需要经历并基本上重新做或消除 dependent_branch 中的所有更改的冲突。有什么解决办法吗?有时,我会手动创建一个补丁并将其应用到 master 的新分支上,但如果与此有任何真正的冲突,修复起来就更糟了。

git checkout dependent_branch
git diff > ~/Desktop/dependent_branch.diff
git checkout master
git checkout -b new_dependent_branch
patch -p1 < ~/Desktop/dependent_branch.diff
# Pray for a clean apply.

有什么想法吗?我知道发生这种情况是因为 Squash 期间重写了历史记录,但这是我无法更改的要求。什么是最好的解决方案/解决方法?有什么我可以做的魔术吗?或者有没有更快的方法来完成手动创建差异所涉及的所有步骤?

最佳答案

关于为什么会发生这种情况的一点点:

我会让 O 成为“原始主控”,FB 成为“新主控”,在一个功能分支被 merge 到:

假设 feature_branch 看起来像:

O - A - B - C 

dependent_feature 在此之上有一些额外的提交:

O - A - B - C - D - E - F

您将原始功能分支 merge 到 master 中并将其压缩,给您:

O - FB

现在,当您尝试对依赖分支进行 rebase 时,git 将尝试找出这些分支之间的共同祖先。虽然它最初 应该是 C,但如果您没有压缩提交,git 会发现 O 作为共同祖先。结果,git 尝试重放 ABC,它们已经包含FB,你会遇到一堆冲突。

因此,您不能真正依赖典型的 rebase 命令,您必须通过提供 --onto 参数来更明确地说明它:

git rebase --onto master HEAD~3  # instruct git to replay only the last
# 3 commits, D E and F, onto master.

根据需要为您的分支修改 HEAD~3 参数,这样您就不必处理任何多余的冲突解决方案。

一些替代语法,如果您不喜欢指定范围并且您还没有删除原始功能分支:

git rebase --onto master feature_branch dependent_feature

# replay all commits, starting at feature_branch
# exclusive, through dependent_feature inclusive
# onto master

关于git - merge 到主分支时,在第一个分支被压扁后 merge 分支的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22593087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com