짧은 대답 :
- 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
master에서 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 은 이제 최신 마스터 위치에서 루팅됩니다. 끝난!