คำตอบสั้น ๆ :
- 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
สมมติว่าเรามีการเปลี่ยนแปลงที่สำคัญบางอย่าง (ยอมรับ # 2 ถึง # 5) ในต้นแบบที่เราต้องการรวมไว้ใน test_branch_1 ของเรา โดยปกติเราแค่เปลี่ยนไปใช้ branch และทำ "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ถูกรูทจากตำแหน่งหลักล่าสุดแล้ว ทำ!