短い答え:
- git cherry-pickはより「低レベル」です
- そのため、git rebaseをエミュレートできます
上記の答えは良いです、私はそれらの相互関係を実証する試みの例を挙げたかっただけです。
「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
たとえば、test_branch_1に含めたい非常に重要な変更(コミット#2から#5まで)がマスターにあるとします。通常、ブランチに切り替えて「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(マスターのチップコミット)に対して適用されました。HEADは移動され、本質的にはリベースされたブランチの先端であるコミットを指します。ここで必要なのは、古いブランチポインターを削除して新しいブランチポインターを作成することだけです。
$ git branch -D test_branch_1
$ git checkout -b test_branch_1 dd0d3b4
test_branch_1が最新のマスターポジションからルート付けされました。できた!