#### 揀選指令:git cherry-pick
從眾多的提交中挑選出一個提交應用在當前的工作分支中。需要一個提交ID作參數,操作過程相當于將該提交導出為補丁文件,然后在當前HEAD上重放,形成無論內容還是提交說明都一致的提交。
#### 對提交執行變基操作:git rebase
實現將指定范圍的提交嫁接到另外一個提交之上。
-i 交互式界面
--continue變基遇到沖突而暫停的情況下,先完成沖突解決(添加到暫存區,不提交),然后在恢復變基操作時使用
--skip變基遇到沖突而暫停的情況下,跳過當前提交時使用
--abort變基遇到沖突而暫停的情況下,終止變基操作,回到之前的分支時使用
$ git rebase --onto <newbase> <since> <till>
首先會執行?git checkout?切換到?<till>?。 因為會切換到?<till>?,因此如果?<till>?指向的不是一個分支(如 master),則變基操作是在?detached HEAD?(分離頭指針)狀態進行的,當變基結束后,還要像在“時間旅行一”中那樣,對 master 分支執行重置以實現把變基結果記錄在分支中。
將?<since>..<till>?所標識的提交范圍寫到一個臨時文件中。 還記得前面介紹的版本范圍語法,?<since>..<till>?是指包括?<till>?的所有歷史提交排除?<since>?以及?<since>?的歷史提交后形成的版本范圍。
當前分支強制重置(git reset --hard)到?<newbase>?。 相當于執行:?git reset --hard <newbase>?。
從保存在臨時文件中的提交列表中,一個一個將提交按照順序重新提交到重置之后的分支上。
如果遇到提交已經在分支中包含,跳過該提交。
如果在提交過程遇到沖突,變基過程暫停。用戶解決沖突后,執行?git rebase --continue?繼續變基操作。或者執行?git rebase --skip?跳過此提交。或者執行?git rebase --abort?就此終止變基操作切換到變基前的分支上。
丟棄歷史
由里程碑A對應的提交構造出一個根提交至少有兩種方法。
第一種:使用git commit-tree命令。用A^{tree}語法訪問里程碑A對應的目錄樹,使用git commit-tree命令直接從該目錄樹創建提交。
~~~
$ git cat-file -p A^{tree}
$ echo "Commit from tree of tag A." | git commit-tree A^{tree}
~~~
第二種:使用git hash-object命令。用A^0語法訪問里程碑A對應的提交。將輸出過濾掉以parent開頭的行,并將結果保存到一個文件中。運行git hash-object命令,將文件tmpfile作為一個commit對象寫入對象庫。
~~~
$ git cat-file commit A^0
$ git cat-file commit A^0 | sed -e '/^parent/ d' > tmpfile
$ git hash-object -t commit -w -- tmpfile
~~~
然后就可以使用變基操作。
#### 反轉提交:git revert
重新做一次新的提交,相當于用錯誤的歷史提交的反向提交,來修正錯誤的歷史提交。