新建一個倉庫,裡面只放一個文字文件,分別做6次提交,,此時git log --oneline 的樣子應該是這樣的
文件的內容是這樣的
我要丟棄 442452d 提交,但保留e09949e提交,我的做法是這樣的
git reset --hard 260effc
然後 git cherry-pick e09949e
此時爆衝突了,如下圖
我不理解的是為何會衝突,按道理應該直接就patch了,不應是上圖的樣子,e09949e這次提交應該是只包含'4' 不包含'3'吧,如果要是還需要手動去掉'3'的話,那cherry-pick 還有啥意義呢,我直接進文件把它刪掉就好了啊,還是我用法有問題?求大神指點! ! !
為什麼不直接 git revert 442452d 呢?
commit記錄的是相對修改 和修改內容的上下行是關聯的 如果上一行丟失了 就會報衝突 需要人工解決。 如果你兩個commit之間不再相關聯的函數內 就可以直接revert。
另外使用這種reset --hard 再cherry-pick的方式 不太好 其他協作者可能在中間加了其他的commit,後續衝突處理更困難。
cherry-pick比較好的使用場景是在 一個分支上想要另一個分支的單獨的某個特性。
因為
e09949e
只包含4
,是针对前一个commit442452d
的差異而言。可你現在把
442452d
给去掉了,希望把e09949e
的父节点从442452d
指到260effc
,確實會有衝突。不確定在沒動圖的情況下我解釋的是否清楚,如果有疑問,建議你先把這個教程好好玩玩。