简短回答:
- git cherry-pick 更“低级”
- 因此,它可以模拟 git
变基
上面给出的答案很好,我只是想举一个例子来说明它们之间的相互关系。
不建议用这一系列操作替换“git rebase”,它只是“概念证明”,我希望这有助于理解事情是如何工作的。
给定以下玩具存储库:
$ git log --graph --decorate --all --oneline
* 558be99 (test_branch_1) Test commit #7
* 21883bb Test commit #6
| * 7254931 (HEAD -> master) Test commit #5
| * 79fd6cb Test commit #4
| * 48c9b78 Test commit #3
| * da8a50f Test commit #2
|/
* f2fa606 Test commit #1
比如说,我们在 master 中有一些非常重要的更改(提交 #2 到 #5),我们希望将其包含到我们的 test_branch_1 中。通常我们只是切换到一个分支并执行“git rebase master”。但是因为我们假装我们只配备了“git cherry-pick”,所以我们这样做:
$ git checkout 7254931 # Switch to master (7254931 <-- master <-- HEAD)
$ git cherry-pick 21883bb^..558be99 # Apply a range of commits (first commit is included, hence "^")
完成所有这些操作后,我们的提交图将如下所示:
* dd0d3b4 (HEAD) Test commit #7
* 8ccc132 Test commit #6
* 7254931 (master) Test commit #5
* 79fd6cb Test commit #4
* 48c9b78 Test commit #3
* da8a50f Test commit #2
| * 558be99 (test_branch_1) Test commit #7
| * 21883bb Test commit #6
|/
* f2fa606 Test commit #1
正如我们所见,提交 #6 和 #7 应用于 7254931(master 的提示提交)。 HEAD 被移动并指向一个提交,它本质上是一个重新定位的分支的尖端。现在我们需要做的就是删除一个旧的分支指针并创建一个新的:
$ git branch -D test_branch_1
$ git checkout -b test_branch_1 dd0d3b4
test_branch_1 现在植根于最新的主位置。完成!