【工具篇】git常用命令分享

申城異鄉人發表於2021-06-15

1. 配置

1.1 設定全域性使用者名稱和郵箱

git config --global user.name xxx

git config --global user.email xxx@xxx.com

上述命令是設定全域性使用者名稱和郵箱,設定完成後,所有git倉庫的使用者名稱和郵箱都是一樣的。

建議:

在公司電腦中,建議將使用者名稱設定為姓名全拼音或者域賬號,建議將郵箱設定為公司郵箱,方便團隊成員快速識別。

1.2 設定某個git倉庫的使用者名稱和郵箱

如果你是某個開源專案的貢獻者,每次提交程式碼時肯定希望顯示的是自己的暱稱和個人郵箱,而不是全域性設定裡的域賬號和公司郵箱,此時則可以單獨對這個git倉庫設定使用者名稱和郵箱。

首先,切換到目標git倉庫的根目錄,開啟終端視窗,執行如下命令:

git config user.name xxx

git config user.email xxx@163.com

執行完命令後,檢視.git資料夾下的config檔案,會看到底部增加了剛剛配置的使用者名稱和郵箱。

注意事項:上述命令僅對當前git倉庫生效,不影響全域性配置。

1.3 檢視使用者名稱和郵箱

git config user.name

git config user.email

1)如果是在某個git倉庫下執行上述命令,並且當前git倉庫單獨設定過使用者名稱和郵箱,返回的是當前git倉庫的使用者名稱和郵箱,否則,返回的是全域性的使用者名稱和郵箱。

2)如果不是在某個git倉庫下執行上述命令,返回的是全域性的使用者名稱和郵箱。

1.4 檢視全部配置

git config --list

1)如果是在某個git倉庫下執行上述命令,返回的是全域性配置+當前專案的配置。

2)如果不是在某個git倉庫下執行上述命令,返回的是全域性配置。

2. 拉取程式碼

2.1 git clone

如果要將遠端git倉庫的程式碼克隆到本地,可以使用git clone命令,如下所示:

git clone https://github.com/mybatis/mybatis-3.git

命令執行完成後,會自動建立一個名為mybatis-3的資料夾。

如果你想自定義生成資料夾的名字,可以進行指定,如下所示:

git clone https://github.com/mybatis/mybatis-3.git mybatis

命令執行完成後,會發現自動建立了一個名為mybatis的資料夾,而不是mybatis-3。

2.2 git pull

如果團隊成員有提交程式碼,想要拉取最新程式碼到本地,可以使用git pull命令,如下所示:

git pull

3. 分支

3.1 檢視本地分支

git branch

前面帶*並高亮顯示的代表當前分支。

3.2 檢視遠端分支

git branch -r

3.3 檢視所有分支

所有分支包含本地和遠端的分支

git branch -a

3.4 建立分支

1)建立本地分支(基於本地分支建立)

git branch fix_0609_npe

該命令是基於當前分支建立(一般是基於master分支並保證程式碼最新),並且建立成功後仍然停留在當前分支,不會跳轉到新建的分支。

2)建立本地分支(基於遠端分支建立)

git checkout -b fix_0609_npe origin/master

以上命令會基於遠端master分支建立本地分支fix_0609_npe,並切換到分支fix_0609_npe。

特別注意:此時本地分支fix_0609_npe關聯的遠端分支是master

3)建立遠端分支

git push origin fix_0609_npe:fix_0609_npe

以上命令會建立一個名為fix_0609_npe的遠端分支。

4)本地分支與遠端分支建立關聯

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

以上命令會將本地分支fix_0609_npe與遠端分支fix_0609_npe建立關聯。

可以通過git branch -vv命令來檢視本地分支與遠端分支的關聯關係:

git branch -vv

3.5 切換分支

切換分支可以使用git checkout命令。

1)切換到已存在的分支

git checkout test

2)切換到不存在的分支(基於本地當前分支自動建立)

git checkout -b fix_0609_npe

以上命令會基於當前分支建立新分支fix_0609_npe,並切換到該分支。

3)切換到不存在的分支(基於指定遠端分支自動建立)

git checkout -b fix_0609_npe origin/fix_0609_npe

4)切換到上一個分支

git checkout -

3.6 刪除分支

刪除分支時需要先切換到其它分支,否則分支無法刪除

git branch -d fix_0609_npe

如果某些分支無法正常刪除,可以強制刪除:

git branch -D fix_0609_npe

刪除遠端分支:

git push origin --delete fix_0609_npe

4. 提交修改

提交前,可以通過git status檢視下檔案修改狀態:

git status

然後使用git add命令將檔案新增到暫存區:

git add .

然後使用git commit命令提交檔案:

git commit -m "code optimize"

以上2個命令可以通過下面一行命令來實現:

git commit -am "code optimize"

最後執行git push命令將本地commit推送到遠端分支:

git push

5. 版本回退

如果程式碼commit之後,想撤銷,可以使用git reset命令,如下所示:

git reset --soft HEAD^

以上命令撤銷後,會保留修改的內容。

如果確認不需要保留修改的內容,可以將soft換位hard,如下所示:

git reset --hard HEAD^

說明:

HEAD^表示上一個版本,即上一次commit,等價於HEAD~1,

如果想撤銷最近2次的commit,可以使用HEAD~2。

也可以回退到指定的commit_id(可通過git log命令檢視commit_id),如下所示:

 git reset --hard e094633609aeebd664126dfc48b602157b2dabbc

說明:commit_id為e094633609aeebd664126dfc48b602157b2dabbc的內容修改還存在

如果遠端分支也要回退,需要執行以下命令:

git push --force

6. 暫存

經常遇到某個需求開發了一部分程式碼,然後被打斷去處理線上bug,此時就需要先將本地的修改暫存起來,待線上bug處理後,再將本地

的修改還原,git stash命令可以完美解決這種場景。

6.1 暫存修改

可以使用如下命令,將本地的修改暫存起來:

git stash

但推薦暫存時新增清晰的備註,方便區分,如下所示:

git stash save "code optimize"

6.2 檢視暫存列表

git stash list

6.3 應用某個暫存

git stash apply

預設使用第一個暫存,等價於下面這樣的寫法:

git stash apply stash@{0}

如果想使用其它暫存,可以指定順序,比如第2個,就是stash@{1},依次類推:

git stash apply stash@{1}

說明:該命令不會將對應的暫存從暫存列表中刪除

6.4 應用並刪除某個暫存

git stash pop

預設使用第一個暫存,等價於下面這樣的寫法:

git stash pop stash@{0}

如果想使用其它暫存,可以指定順序,比如第2個,就是stash@{1},依次類推:

git stash pop stash@{1}

說明:該命令會將對應的暫存從暫存列表中刪除

6.5 刪除暫存

git stash drop

預設刪除第一個暫存,等價於下面這樣的寫法:

git stash drop stash@{0}

如果想刪除其它暫存,可以指定順序,比如第2個,就是stash@{1},依次類推:

git stash drop stash@{1}

如果想刪除所有的暫存,可以執行以下命令:

git stash clear

7. 合併所有改動

合併程式碼的場景有很多,比如將master分支合併到自己的開發分支,將開發分支合併到公共分支test、uat。

git merge master

以上命令代表將本地master分支的程式碼合併到當前分支。

git merge origin/master

以上命令代表將遠端master分支的程式碼合併到當前分支。

8. 合併部分改動

因為git merge命令合併的是所有改動,發生衝突的機率是很高的,解決衝突非常耗時且容易出錯,所以在某些場景下,可以只合並部分改動,此時可以使用git cherry-pick命令。

以下命令,是將commit id為aa6b6922fc19173c090c64a4c1d399265e4f0500的提交合併到當前分支:

git cherry-pick aa6b6922fc19173c090c64a4c1d399265e4f0500

也可以指定多個commit id:

git cherry-pick 12eef219da5d7f45892142ddeb107f496177274d aa6b6922fc19173c090c64a4c1d399265e4f0500

9. 特別注意

9.1 強制覆蓋原生程式碼與遠端倉庫保持一致

如果發現遠端master分支被汙染後,應儘快將遠端master分支還原,然後執行如下命令覆蓋掉本地分支程式碼,與遠端master分支保持一致:

git reset --hard origin/master

或者將本地master分支刪除,重新基於遠端master分支拉取:

git branch -d master

git checkout -b master origin/master

9.2 切換分支會把未提交的檔案帶到其它分支

假如在test分支修改了檔案A,未提交,然後此時切換到uat分支時,如果沒有衝突,檔案A的修改會被帶到uat分支,如果不注意的話,就容易被提交,釋出到線上,造成bug。

避免措施:

  1. 切換分支時,檢查下本地檔案狀態,儘量不要有未提交的檔案,可以stash或者commit
  2. 提交程式碼前,儘量比對下修改內容,避免誤提交

10. 其它

10.1 清空命令列

git clear

10.2 檢視git 版本號

git version

10.3 IDEA Annotate 顯示設定

IDEA預設顯示的是Last Name,可以調整為顯示Full Name,否則看到的可能是Zhang這樣的,無法快速識別到是哪個人:

10.4 拉取或者合併程式碼提示需要輸入commit message

Please enter a commit message to explain why this merge is necessary

解決方案:

1)按下esc鍵

2)輸入:wq

3)按下Enter鍵