经过一番思考,我认为我有一个与文档中类似的变基情况,尽管有其他分支名称。
这里的文档说要申请
git rebase --onto master next topic
获得
在我的例子中,我有一个名为“develop”的分支,其中图中的 master 所在位置,以及一个名为“MyFeature”的分支,其中图中的 topic 所在位置。在“下一个”所在的点上,我没有分支,但我有一个标签“OLDdevelop”
我可以在此处应用 git rebase --onto 而无需在“下一个”位置明确创建分支吗?
git rebase --onto <newbase> <upstream> <branch>
这里有一些伪命令解释了
git rebase
的工作原理。
# Checkout <branch>
git checkout ${branch}
# Reset it to <newbase>
git reset ${newbase} --hard
# Get the commits that are to be applied
commits=$(git rev-list ${upstream}..${branch})
# Apply these commits onto the newbase one by one
for commmit in $commits;do
git cherry-pick $commit
done
上述伪命令中除了第一个参数之外,这 3 个参数是分支、标签、提交还是其他 commit-ish 都没关系。无论如何,都会应用提交,并创建一个新的日志图。
无论git checkout $branch
是否为分支,
$branch
的行为都不同。
# A branch in short format
git checkout master
# A branch in other formats, or a non-branch ref
git checkout refs/heads/master # a branch in long format
git checkout refs/tags/foo # a tag in long format
git checkout foo # a tag in short format
git checkout 5b74449ba231d4750743c2b5c00ddc2535fab38e # a commit
git checkout refs/changes/22/339822/1 # a Gerrit ref
git checkout refs/merge-requests/99/head # a Gitlab merge-request head
第一个切换到分支
master
,其他则通向分离的 HEAD。
说
topic
指向提交 a4f6f0e8cabe00011f5fc27176284c30575c136f
。
之前
git-rebase
,
* 8a73f8b (master) e
* 0271872 d
* 5b53145 c
| * a4f6f0e (topic) n
| * 046efc5 m
| * 544582f (next) g
| * f6516cf f
|/
* 7f2ea62 b
* 42dee2c root
git-rebaes
之后,
# Case 1
git rebase --onto master next topic
git log --oneline --graph --decorate master topic next
* 5b74449 (HEAD -> topic) n
* 05f4607 m
* 8a73f8b (master) e
* 0271872 d
* 5b53145 c
| * 544582f (next) g
| * f6516cf f
|/
* 7f2ea62 b
* 42dee2c root
# Case 2
git rebase --onto master next a4f6f0e8cabe00011f5fc27176284c30575c136f
git log --oneline --graph --decorate HEAD master topic next
* 5b74449 (HEAD) n
* 05f4607 m
* 8a73f8b (master) e
* 0271872 d
* 5b53145 c
| * a4f6f0e (topic) n
| * 046efc5 m
| * 544582f (next) g
| * f6516cf f
|/
* 7f2ea62 b
* 42dee2c root
两者都可以。假设最后一次提交是在命令之后的
5b74449
。在情况 1 中,您不需要做额外的工作。在情况 2 中,您需要将 topic
重置为 5b74449
。否则,topic
仍指向a4f6f0e8cabe00011f5fc27176284c30575c136f
。
git checkout topic
git reset abc123 --hard
git log --oneline --graph --decorate master topic next
* 5b74449 (HEAD -> topic) n
* 05f4607 m
* 8a73f8b (master) e
* 0271872 d
* 5b53145 c
| * 544582f (next) g
| * f6516cf f
|/
* 7f2ea62 b
* 42dee2c root
在你的情况下,无论
$next
是分支、标签、提交还是任何其他提交,都是一样的。