Git log 不太好看,我們來合併 commit 吧

Jourdon發表於2018-04-03

最近在修改部落格時腦子有點蒙,幾個 commit 提交得都有點問題,提交到線上才發現又寫了好幾個 bug ,導致網站經常 500,沒辦法,趕緊修復唄,這也沒什麼,反正都是本地 git,但是之後部落格準備開源的,這麼糟糕的 commit 真的要放到 github 上嗎?

合併 commit,唯一的優點,就是看起來相當乾淨,commit 看起來也是相當完美,算了,編不下去了,快點開始吧。
首先git log檢視下

commit 1a76bac5e0edbc5d3d70e017eced9ee334f78a60
Author: jourdon <admin@qiehe.net>
Date:   Mon Apr 2 09:55:40 2018 +0000

   test 3

commit b59c48ce22a5de512fcecbaa66d23cf03fc27b5f
Author: jourdon <admin@qiehe.net>
Date:   Mon Apr 2 08:16:44 2018 +0000

    fix bug

commit 89b42221a2517a307979658e8e3159110fde2700
Author: jourdon <admin@qiehe.net>
Date:   Thu Mar 15 05:32:01 2018 +0000

  test 2  

commit a665822532841654e87e2a7ea5ba7a896b57c045
Author: jourdon <admin@qiehe.net>
Date:   Wed Mar 14 03:20:37 2018 +0000

    test 1

fix bug 這條 commit 不好看,幹掉他。

git rebase -i 89b42221a // 這裡跟的 commit 是 test2 的 commit-id,test2 是不會被幹掉的。

正常情況下,敲了命令會出來 VIM 的編輯器,但是這裡你可能會遇到問題,出現的可能是另外的編輯器,比如 nano ,這個實在不好用,我們還是要換回 vim

update-alternatives --config editor

你會看到下面的介面

There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
 *0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    10        manual mode
Press <enter> to keep the current choice[*], or type selection number:

vim.basic 是一個完整版的 vim ,但沒有影像介面,選單欄
vim.tiny 是一個 vim 的縮減版
這裡選 3 就可以了。
我們繼續

pick b59c48c fix bug
pick 1a76bac test 3

# Rebase a665822..1a76bac onto a665822 (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit

上面的介面,先列出當前分支最新的2個 commit (越下面越新)。每個commit 前面有一個操作命令,預設是 pick ,表示該行 commit 被選中,要進行 rebase 操作。2個 commit 的下面是一大堆註釋,列出可以使用的命令。

  • pick:正常選中
  • reword:選中,並且修改提交資訊;
  • edit:選中,rebase時會暫停,允許你修改這個commit(參考這裡)
  • squash:選中,會將當前commit與上一個commit合併
  • fixup:與squash相同,但不會儲存當前commit的提交資訊
  • exec:執行其他shell命令

squashfixup 都可以用來合併 commit ,唯一的區別是 squash 會把 commit message 也合併,而 fixup只會留下最新的一條 commit message, 現在我們先把需要合併的 commit 前面的動詞,改成 fixup (或者f),然後就是 :wq 儲存吧。

需要注意的是合併 commit 是不可以把全部 commit 合併成一條的,因為預設是需要有一條前置的 commit ,也就是第一條 commit 是沒辦法合併的

儲存完成後,你有兩個選擇

git rebase --continue  //確認 rebase
git rebase --abort //取消 rebase

確認後,就可以上傳到遠端了。

git push -f  //強制覆蓋遠端

去伺服器上看一下

commit 1a76bac5e0edbc5d3d70e017eced9ee334f78a60
Author: jourdon <admin@qiehe.net>
Date:   Mon Apr 2 09:55:40 2018 +0000

   test 3

commit b59c48ce22a5de512fcecbaa66d23cf03fc27b5f
Author: jourdon <admin@qiehe.net>
Date:   Mon Apr 2 08:16:44 2018 +0000

    fix bug

commit 89b42221a2517a307979658e8e3159110fde2700
Author: jourdon <admin@qiehe.net>
Date:   Thu Mar 15 05:32:01 2018 +0000

  test 2  

commit a665822532841654e87e2a7ea5ba7a896b57c045
Author: jourdon <admin@qiehe.net>
Date:   Wed Mar 14 03:20:37 2018 +0000

    test 1

發現並沒有推上來,這裡是因為我們本地推送到倉庫是強制覆蓋的,站點目錄需要 git pull 下來。但是倉庫與站點目錄現在有衝突,所以我們需要再強制覆蓋本地。

git fetch --all
git reset --hard origin/master
git pull

伺服器返回 Already up-to-date
再次 git log

commit 1a76bac5e0edbc5d3d70e017eced9ee334f78a60
Author: jourdon <admin@qiehe.net>
Date:   Mon Apr 2 09:55:40 2018 +0000

   test 3

commit 89b42221a2517a307979658e8e3159110fde2700
Author: jourdon <admin@qiehe.net>
Date:   Thu Mar 15 05:32:01 2018 +0000

  test 2  

commit a665822532841654e87e2a7ea5ba7a896b57c045
Author: jourdon <admin@qiehe.net>
Date:   Wed Mar 14 03:20:37 2018 +0000

    test 1

搞定!

這裡是重點

本文說的是合併,但是強烈不建議合併,我這裡只是自己的一個小專案為了好看而已,但是如果你真的專案中這麼做了,只會被隊友嫌棄,不,是唾棄,你已經無法與隊友合作完成專案了,因為你合併後的專案不管多麼漂亮,都是一個亂七八糟的專案,Git 的意義已經不復存在了。

原文地址: 茄盒網 - git log 不太好看,我們來合併 commit 吧

Good Good Study , Day Day Up!!

相關文章