Git 協同開發 — 注意事項

危險的指令

某些指令對於 PUSH 後的 commits 或 branches 是相當危險的,因為你在操作這些 共享的 歷史紀錄。換句話說,如果不小心搞亂了這些紀錄 再 PUSH 回去,團隊內就會大亂。

repo’s history (git log)

以上圖來講,從 commit — 1be017 之下的都算是共享的歷史紀錄。判斷的方法就是 1be017 右邊有個 (origin/master),意即 remote 的 master。但是 origin/master 上面還有兩個 commits,並且最頂端的 commit 右邊有標注 (HEAD -> master)。這代表 local 端有了兩個尚未 push 出去的 commits 。

講到這裡,該說說哪些指令 (用在 commit level) 很危險了:

  • amend: 修正並替換掉前一次的 commit
  • reset: 執行 git reset 7e1775 會讓你的工作目錄回到該 commit 的狀態,但原本 7e1775 之後的四個 commit 都會刪除。 (7e1775 為 origin/master 下方第二個 commit)
  • rebase: 有兩種用途,第一種是用來 merge 分支的,第二種是整理 commits,我所謂的整理是指新增、刪除、修改、搬移、合併等等操作。

以上指令絕對不要用在共享紀錄。反之,上面三個指令如果用在圖中 local commits 是很有用的。在開發時,常常會很隨意的增加一堆 commits,但有些 commit 也許較沒意義或是可以與其它 commit 併在一起,這時可先用 rebase 去整理再 push 出去。如此,團隊在做 code review 時會比較輕鬆。

某些狀況,一定要回溯 共享紀錄 時,可以用:

  • revert
  • cherry-pick
  • checkout: git checkout commit-id; git checkout -b new-branch

Commit

提交 commit 以清楚、詳細、最小化為基本原則:

  • 重要的 commit 請儘量不要加 -m 參數
  • 針對一個檔案修改了很多地方時,請在 git add 後面加上 patch 參數,這樣可以將 一個檔案內不同的修改分成多個 commits,而不是將 檔案內所有的修改視為一個 commit

分之命名

分支根據你要做的事來命名,能讓人馬上看懂為原則,例如:

  • hotfix/#13425: 需要緊急修正 #13425 這個 issue
  • arduino/controller: 關於 arduino 的中控模組開發
  • android/ui-codeblock: 手機端圖形程式介面的開發
Like what you read? Give KuanYu Chu a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.