我有两个分支 A 和 B,这些分支之间的区别是 B 删除了 A 中的一些提交(其他一个提交是相同的)。
当我在分支 A 中进行一些新提交时,我想将它们合并到分支 B 中,但留下的已删除的提交仍待删除(换句话说:只挑选从 A 到 B 的新提交)。
当我这样做时:
git rebase A
它不仅会重新调整新的提交,还会恢复删除的提交,如何避免它?
是否可以使用 rebase 或其他方式来实现它,也许可以在两个分支中指示相同的提交并开始挑选?
示例:
A: 1 2 3 4 5 6
B: 1 3 4
结果 A -> B:
A: 1 2 3 4 5 6
B: 1 3 4 5 6
我找到了一个解决方案,我们使用的背后的想法
git checkout A
git rebase --onto B A_since_commit B
上面问题中的 A_since_commit = 4
当我们位于A分行时。我们获取当前的 B 分支,并从 A 分支获取自 A_since_commit 以来的提交,并通过修改后的 B 分支重写 A 分支。由于我们不想重写当前分支,因此我们需要临时分支。
解决方案:
# creation copy of A branch and checkout _temp_
git checkout -b _temp_ A
# take commits from A
git rebase --onto B $COMMIT_ID
# Replace old branch with temporary and remove old one
git checkout B
git reset --hard _temp_
git branch -D _temp_
我们还可以检测父 A 分支中具有不同 ID 的最后一次相同提交,因此完整的解决方案(bash):
BRANCH_A="A"
BRANCH_B="B"
# Detect same commit id in parent branch (can be improved)
git checkout $BRANCH_B
COMMIT_MESSAGE=$(git log -1 --pretty=%B)
COMMIT_ID=$(git log $BRANCH_A --grep="$COMMIT_MESSAGE" --pretty=format:"%h" --no-patch)
git branch -D _temp_
git checkout -b _temp_ $BRANCH_A
git rebase --onto $BRANCH_B $COMMIT_ID
git checkout $BRANCH_B
git reset --hard _temp_
git branch -D _temp_