在某个分支上重新建立基础,忽略之前删除的提交

问题描述 投票:0回答:1

我有两个分支 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 rebase git-rebase
1个回答
0
投票

我找到了一个解决方案,我们使用的背后的想法

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_
© www.soinside.com 2019 - 2024. All rights reserved.