Git 應用: 取用多個commit
commit 的戲法
例如你之前已經在 newImage branch 上做了一些 commit,然後又開了一個 branch 叫做 caption ,並且在上面做了一些相關的 commit ,因此它們看起來是一個接著一個的。
有點棘手的就是有時候你又想在之前的 commit 裡面做一些修改。在這個例子裡面,我們要去稍微修改一下 newImage 所指向的 commit,儘管已經是之前的 commit 了
為了克服這個困難,我們可以按照下面的方法來做:
- 先用 git rebase -i 將 commit 重新排序,然後把我們想要修改的 commit 移到最前面
- 然後用 git commit --amend 來進行一些修改
- 接著再用 git rebase -i 來將他們按照最開始的順序重新排好
- 最後我們把 main 移到這個修改的最前端(用你自己喜歡的方法),就大功告成
如以下範例:
輸入以下指令:
git rebase -i HEAD~2 //產生互動式rebase
互換C3與C4可得下圖
接著輸入以下指令來改寫提交:
git commit --amend
接著同樣使用以下指令:
git rebase -i HEAD~2 //產生互動式rebase
來將c2與c3互換
最後我們把 main 移到這個修改的最前端:
git branch -f main caption
https://weather-research-daily.webnode.tw/l/git-%e5%b8%b8%e7%94%a8%e6%8c%87%e4%bb%a42/
移動方式請參考上述連結
commit 的戲法#2
如上所看到的,我們使用 rebase -i 來重新排列那些 commit。只要把我們想要修改的 commit 移到最前面,我們就可以很容易地重新修改它,然後再把它們重新排成我們想要的順序。
但唯一的問題就是這樣做就要排很多次,有可能造成 rebase conflict。下面就看看用另外一種方法 git cherry-pick 是怎麼做的吧!
請輸入指令:
git checkout main //將HEAD指向main
git cherry-pick newImage //將newImage接續main
git checkout main^ //將HEAD指向main
上一層
git cherry-pick main //將main接續HEAD
git cherry-pick caption //將caption接續HEAD
git branch -f main HEAD //將main移至HEAD
其結果如下圖