如何進階成公司 Git 小能手(常見問題總結)

  • 2020 年 3 月 18 日
  • 筆記

前言

Git 命令對於程式設計師的你來說再熟悉不過,但是發現好多小夥伴都是會一些基本的提交流程,當遇到問題的時,查到的命令還不敢用,總是請教組裡那幾個精通 Git 的小夥伴。本文對 Git 使用過程中常出現的問題進行總結並且對 Git 的一些誤區概念說明了一些,看完後記得自己嘗試下,希望你也能成為組裡被請教的那 個 Git 小能手。

Git 經典圖

一張經典的 Git 流程圖(來源阮一峰老師的部落格)  

圖中的幾個專用名詞解釋:

  1. Workspace: 工作區
  2. Index / Stage: 暫存區
  3. Repository: 本地倉庫
  4. Remote: 遠程倉庫

git 提交可能遇到的一些問題

git 提交到本地倉庫有問題怎麼辦?

情況一:最近一次 commit 的程式碼有問題怎麼辦?

這時候可能有小夥伴說直接修改再提交一次不就好了,這裡說一下優雅的方式,不進行再一次提交,修改這次提交。

git add 我是修改內容.txt  git commit --amend  

【amend】修正,會對最新一條 commit 進行修正,會把當前 commit 里的內容和暫存區(stageing area)里的內容合併起來後創建一個新的 commit,用這個新的 commit 把當前 commit 替換掉。

輸入上面的命令後,Git 會進入提交資訊編輯介面,然後你可以刪除之前的 changeId,並且修改或者保留之前的提交資訊,:wq 保存按下回車後,你的 commit 就被更新了。

對於 amend 還可能出現幾種小問題,下面列舉下:

剛剛寫的提交資訊有問題,想修改怎麼辦?
git commit --amend -m "新的提交資訊"  
剛剛提交完程式碼發現,我有個文件沒保存,漏了提交上去怎麼辦?

最簡單的方式,再次 commit:

git  commit -m "提交資訊"  

另一中方式,使用--no-edit,它表示提交資訊不會更改,在 git 上僅為一次提交。

git add changgeFile // changeFile 剛剛漏了提交的文件  git commit --amend --no-edit  

情況二:最新提交的程式碼沒問題,它上一次提交的有問題怎麼辦?

上面說的是最新一次的提交出了問題,接下來說之前提交的程式碼發現有問題了想修改,應該怎麼辦?需要一個新的命令:

git rebase -i  

rebase -i 是 rebase --interactive 的縮寫形式,意為「互動式 rebase」。所謂「互動式 rebase」,就是在 rebase 的操作執行之前,你可以指定要 rebase 的 commit 鏈中的每一個 commit 是否需要進一步修改。

注意點:看 commit 歷史的時候,最新的提交在最下面,剛開始使用時候總是搞錯。

輸入上面的命令後,會進入下面的編輯介面。

根據編輯介面中的提示,我們把要修改的倒數第二個 commit,也就是上面的【修改程式碼格式首行縮進】前面 pick 指令改為 edit。edit的意思編輯器中已給了解釋,應用這個commit,但是停下來修正。改完之後,esc退出,:wq 保存。

會顯示如下資訊。

這個rebase過程已經停在倒數第二個 commit 的位置了,修改完成你要修改的內容,再次提交。

git add .  git commit --amend  

然後繼續 rebase 過程,使用 rebase --continue 來繼續 rebase 過程,把後面的 commit 直接應用上去。

git rabase --continue  

另外在使用git rebase -i 的時候,裡面帶了不同的指令,都可以對已有的提交進行一些操作,比如 squash 對多個 commit 合併成一個 commit。

情況三:剛剛寫完的提交太爛了,不想改了,想直接丟棄怎麼辦?

你可以用 reset --hard 來撤銷 commit

git reset --hard HEAD^  

HEAD 表示 HEAD^ 往回數一個位置的 commit ,HEAD^ 表示你要恢復到哪個 commit。因為你要撤銷最新的一個 commit,所以你需要恢復到它的父 commit ,也就是 HEAD^。那麼在這行之後,你的最新一條就被撤銷了。

Git 程式碼已經 push 上去發現有問題

情況一:如果出錯內容還在私有分支

這種情況你修改後,再次提交會報錯,由於你在本地對已有的 commit 做了修改,這時你再 push 就會失敗,因為中央倉庫包含本地沒有的 commits。這種情況只在你自己的分支 branch1 ,可以使用強制 push 的方式解決衝突。

git push origin branch1 -f  

-f 是 --force 的縮寫,意為「忽略衝突,強制 push」

情況2:如果出錯內容已經 push 到了 master 分支

這種情況可以使用 Git 的 revert 指令。

git revert HEAD^  

上面這行程式碼就會增加一條新的 commit,它的內容和倒數第二個 commit 是相反的,從而和倒數第二個 commit 相互抵消,達到撤銷的效果。

在 revert 完成之後,把新的 commit 再 push 上去,這個 commit 的內容就被撤銷了。

revert 與前面說的 reset 最主要的區別是,這次改動只是被「反轉」了,並沒有在歷史中消失掉,你的歷史中會存在兩條 commit :一個原始 commit ,一個對它的反轉 commit。

Git 關於暫存的問題

假如正在開發手中需求的時候,突然來了個緊急 bug 要修復,這時候需要先 stash 已經寫的部分程式碼,使自己返回到上一個 commit 改完 bug 之後從快取棧中推出之前的程式碼,繼續工作。

  • 添加快取棧: git stash
  • 查看快取棧: git stash list
  • 推出快取棧: git stash pop
  • 取出特定快取內容:git stash apply stash@{1}

注意:沒有被 track 的文件(即從來沒有被 add 過的文件不會被 stash 起來,因為 Git 會忽略它們。如果想把這些文件也一起 stash,可以加上 -u 參數,它是 --include-untracked 的簡寫。就像這樣:git stash -u

Git 分支相關問題

分支中的常用命令:

  • git 拉取指定分支的程式碼:git clone -b 分支名稱 地址
  • 查看當前分支:git branch
  • 查看遠程分支:git branch -a
  • 創建並切換分支:git checkout -b add_orderdesc
  • 切換分支:git checkout 分支名稱
  • 查看當前的本地分支與遠程分支的關聯關係:git branch -vv
  • 合併當前分支程式碼到master:

問題1:我想把本地創建的一個分支 koalanode提交到遠程,並且遠程分支名稱要求 nodescript,且還未創建,需要怎能做?

  1. 我先在遠程建了一個分支 nodescript,我本地也有這麼一個分支,名字和遠程的分支名稱還不一樣。首先,我把我本地的分支名稱修改成和遠程分支相同。
  2. 將本地新建分支 push 到自己的本地遠程 origin 上,因為只在本地創建了一個新的分支,遠程origin 上還沒有該分支
git push origin nodescript  

1.把本地分支與遠程 origin 的分支進行關聯處理(通過 --set-upstream-to 命令)

git branch --set-upstream-to=origin/add_orderdesc  

2.再次通過 git branch -vv 查看分支的關聯關係,可見本地分支已於 origin 的分支建立上了關聯關係,之後我們每次 push 或者 pull 的時候,只需要輸入git push 或者git pull

git 用戶名密碼郵箱相關問題

公司倉庫有帳號密碼,自己的github有賬戶密碼,兩個不同賬戶,有一次提交發現自己倉庫的郵箱提交成了公司倉庫設置的郵箱,有點尷尬,為什麼會出現這種問題呢?

首先這個你在剛開始安裝一趟的時候應該就用過:

// 設置查看 git 用戶名和郵箱  git config user.name   --查看git當前配置用戶名  git config user.email  --查看git當前配置的郵箱  git config user.name 名稱 設置用戶名  git config user.email 郵箱 設置git郵箱  

全局命令設置

 git config  --global user.name 你的目標用戶名;     git config  --global user.email 你的目標郵箱名;  

在項目中也可以查看這些資訊

vi ~/.gitconfig;  

知道了這些配置修改之後,你可以選擇全局配置下,在公司電腦,或者提交前自己看下,就不會再出現上面的尷尬問題了。

git 提交規範

這裡只列舉我常用的提交格式類型

  • feat:新功能(feature)
  • fix:修補bug
  • docs:文檔(documentation)
  • style:格式(不影響程式碼運行的變動)
  • refactor:重構(即不是新增功能,也不是修改bug的程式碼變動)
  • test:增加測試
  • chore:其他修改,比如構建過程或輔助工具的變動

git 更詳細的提交規範可以看一下阮一峰老師的這篇文章,非常棒Commit message 和 Change log 編寫指南

Git 工具

網上一些 Git 工具很多,推薦一個 SourceThree,但是個人還是比較喜歡用 Git 命令,不然你會發現這項技能慢慢蛻化了,而且一些工具提交時總是帶一些我不懂的參數。平時工具和 Git 命令配個使用,用它的可視化圖表看提交是否有問題,當然也有公司覺得用命令沒有工具安全的,自己選擇就好了,嘿嘿。

SourceThree 下載地址:https://www.sourcetreeapp.com/

vim 常用命令

使用 Git 的時候,偶爾會對 Vim 中對 shell 腳本進行簡單操作,為了節約時間,列出幾個常用的 vim 快捷命令。

  • a,i,r,o,A,I,R,O 進入編輯模式
  • :q 一般退出
  • :q! 退出不保存
  • :wq 保存退出
  • yy 複製當前行的內容
  • ZZ 保存離開
  • dd 刪除游標當前行

總結

本文對 Git 使用過程中常出現的問題進行了一個總結,後面還會更新衝突解決的一些問題,最後建議大家在記憶的時候圍繞文初的圖片,多使用!希望本文能幫助到小夥伴們。點個在看,啦啦啦!

參考文章與附件:

掘金小冊:Git 原理詳解及使用指南

阮一峰老師 Git 提交規範 https://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html

圖解 Git 命令

Tags: