mercurial 與 git 快速筆記 002 – 取消前一個 commit

注意、以下操作都是 push 之前為佳,push 之後,最好別這麼幹! 除非很確定你有更動遠端倉庫的權利與能力 (包含一一通知倉庫共用者調整其版本歷史,與你的修訂達成一致)

因為某種原因,我們得取消前一個 commit,例如、

  1. 手殘不小心把 commit 的註解打錯了,硬是看不順眼想改~~
  2. commit 完以後又改了一些東西,但我想把修改一起併入前面那個 commit

解決方案大致有:

hg rollback
  • 他會取消你剛剛的commit,就像undo一樣,回到剛剛尚未 commit 的狀態,但修改都在。
  • 此時再次 commit ,就等同於修改註解
  • 即使 commit 後還有新的修改也OK,修改不會消失,換句話說,待會你重新commit後,新的修改也就併進來成為同一commit。
hg strip -k -r .
  • -k 是只砍 commit 的歷史,但保留你的修改到暫存工作區;而沒加這參數的話,就是直接砍掉commit及其修改。跟下方 git 的 –soft、–hard功能相似。
  • -r 後面要加版本號,而上面的 . (英文句點)則是代表最後一個的意思。
    • 所以若 -r 2,代表你要一口氣回到本地的第 2 號提交,第 3 號以後的提交你都要抹掉或改掉。
    • -r -3,則代表你要往前跳3個提交,原先的最新三個提交你都要抹掉或改掉。

ps. strip 需要擴充mq套件唷! 請到 hgrc 設定[extension] 或打開 Tortosiehg 的設定介面勾選喔!

git commit --amend
  • 直接修改最後一次commit的內容,包含檔案組成、註解..等等
  • 換言之,新的修改想併入前一個 commit 就用這個指令
git rest --soft HEAD^
  • 功能跟上面的 hg rollback 類似,取消最後N個 commit 的紀錄,但是保留修改
  • N可以任意,用 HEAD 來控制,HEAD , N=0 ; HEAD^ N=1; HEAD~2 N=2
  • –soft 表示:雖然取消 commit,但要保留修改。若參數改為 –hard,表示連修改都不保留,徹底從版本歷史上抹除。跟上面 hg 的 -k 參數功能相似。

You Might Also Like

Leave a Reply

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料