【每日一技】那些鮮為人知的 git 實(shí)用新功能
前言
git 幾乎是每個(gè)程序員都會(huì)使用的版本控制工具,但是你是否有這樣的困擾:
- 想為不同項(xiàng)目配置不同的 git 信息,每個(gè)新項(xiàng)目都要用 git config --local 配置一次,很煩
- 使用 feature-branching 工作流時(shí)經(jīng)常在 多個(gè) feature 或 修復(fù) bug 的分支來回切換,每次都要 syc 一次項(xiàng)目,還要用 stash 暫存修改
- git checkout 命令承載了 切換分支和文件恢復(fù)的部分功能,職責(zé)不單一
- ...
本文介紹幾個(gè)我日常用到的 git 新功能,并在文末附上 mac 上更新 git 的方法。
多分支操作利器:worktree(2.5)目前主流的 git 工作流是 feature-branching,即:任何新的功能(feature)或 bug 修復(fù)全都新建一個(gè) branch 來寫。
當(dāng)我們?cè)谀硞€(gè) feature 分支上開發(fā)時(shí)(分支名 feature),有一個(gè)高優(yōu)的 bug 需要解決,這時(shí)候我們一般會(huì)進(jìn)行如下操作:
- 使用
git stash隱藏未完成的修改 - 基于 dev 分支創(chuàng)建并切換到修改 bug 的分支(分支名 bugfix)
- 進(jìn)行開發(fā),測(cè)試完成后合入 dev 分支
- 切回 feature 分支,使用
git stash pop恢復(fù)之前未完成的修改,繼續(xù)開發(fā)

很多小伙伴會(huì)平時(shí)會(huì)再 clone 出一個(gè)項(xiàng)目來簡(jiǎn)化上述場(chǎng)景,不過這會(huì)帶來另一個(gè)問題:你需要保持兩個(gè)倉庫與遠(yuǎn)程的同步。
git 2.5 版本引入了 git worktree 命令,該命令允許將分支檢出到某個(gè)文件夾下。對(duì)于上文提到的場(chǎng)景,我們只需:
- 使用
git worktree add -b bugfix ../bugfix dev基于 dev 創(chuàng)建 bugfix 分支到 ../bugfix 目錄 cd ../bugfix進(jìn)入到該目錄進(jìn)行開發(fā)
圖片上傳失敗(可前往掘金查看原文圖片)
bugfix 目錄對(duì)應(yīng) bugfix 分支,與 feature 分支互不干擾,并且 bugfix 目錄下的 .git 是一個(gè)文件,指向主倉庫。

git worktree add :關(guān)聯(lián)一個(gè) branch 到指定的路徑
git worktree add -b :基于指定 branch 新建一個(gè) branch 到指定路徑
作為 github 的重度使用者,我經(jīng)常會(huì)發(fā)布一些個(gè)人項(xiàng)目。個(gè)人項(xiàng)目與公司項(xiàng)目的 git 配置是有很多差異的,例如:
- 用戶名郵箱
- 拉代碼的方式(rebase 還是 merge)
- ...
git 2.13 版本前 可以使用 git config --global 和 git config --local 分別設(shè)置全局配置和本地配置
2.13 版本開始,我們有了新的選擇,IncludeIf 為不同目錄下的倉庫提供不同的默認(rèn)設(shè)置。
簡(jiǎn)單講,我們可以為指定目錄下的所有倉庫單獨(dú)設(shè)置 git 配置,例如我們?cè)?~/projects 下建立三個(gè)目錄:work,personal,thirdparty 分別存儲(chǔ)公司,個(gè)人和第三方的項(xiàng)目:

之后我們可以為這三個(gè)目錄以及全局設(shè)置不同的 git 配置,其中全局的配置文件在 ~/.gitconfig,目錄的獨(dú)立的配置文件需要我們手動(dòng)創(chuàng)建,例如我們分別創(chuàng)建 .gitconfit-work,.gitconfig-personal,.gitconfig-thridparty:

之后我們?cè)?~/.gitconfig 加入如下配置:
省略...
+?[includeIf?"gitdir:~/projects/work/"]
+??path?=?~/.gitconfig-work
+?[includeIf?"gitdir:~/projects/personal/"]
+??path?=?~/.gitconfig-personal
+?[includeIf?"gitdir:~/projects/thirdparty/"]
+??path?=?~/.gitconfig-thirdparty
這樣 ~/projects/work/ 目錄下的所有 git 倉庫都使用 ~/.gitconfig-work 中的配置。(注意:使用 git config --local 的配置優(yōu)先級(jí)更高)
例如我們?cè)?~/.gitconfig-work 填入工作的用戶信息:
[user]
??signingkey?=?xxxxxxxx
??name?=?xxxx
[email protected]
為 checkout 減負(fù):switch 和 restore(2.23)我們都知道,git checkout 可以切換分支,除此之外,git checkout 還可以切換到某個(gè) commit,或者恢復(fù)文件:
git?checkout?branchname?#?切換分支
git?checkout?-b?branchname?#?創(chuàng)建并切換到新的分支
git?checkout?commitid?#?切換到某個(gè)commit?id
git?checkout?--?filename?#?丟棄工作區(qū)某文件的修改
git 2.23 版本開始引入了 git switch 和 git restore 命令
#?切換分支
-?git?checkout?branchname
+?git?switch?branchname
#?創(chuàng)建并切換到新的分支
-?git?checkout?-b?branchname
#?-c?代表?--?create
+?git?switch?-c?branchname
#?無替代
git?checkout?commitid
#?丟棄工作區(qū)某文件的修改
-?git?checkout?--?filename
#?等價(jià)?git?restore?-W?--filename?其中?-W?代表?--worktree
+?git?restore?--?filename
#?將某文件從暫存區(qū)移除,-S?代表?--staged
+?git?restore?-S?--?filename
#?將某文件從暫存區(qū)移除并丟棄工作區(qū)的修改
+?git?restore?-S?-W?--?filename
git switch 命令專注于分支的切換,git restore 命令可以將文件從暫存區(qū)移至工作區(qū)或從工作區(qū)丟棄
mac 使用 brew 更新默認(rèn) git注意,
git switch不能切換至 commit id
一般來說,mac 自帶的 git 版本較低,我們可以使用 brew 安裝或更新 git:
#?安裝?git
brew?install?git
#?升級(jí)?git
brew?upgrade?git
brew 安裝軟件時(shí)首先會(huì)更新自身,屏幕顯示:
Updating Homebrew...,通常較慢,我們可以使用ctrl + c跳過這一過程。
不過此時(shí)系統(tǒng)默認(rèn)的 git 并不是 brew 安裝的版本,我們只需執(zhí)行以下命令將默認(rèn) git 連接到 brew 安裝的版本上:
brew?link?--overwrite?git
我們可以使用 git version 或 git --version 查看目前的 git 版本。完整操作如下圖:
關(guān)于我人總是喜歡做能夠獲得正反饋(成就感)的事情,如果感覺本文內(nèi)容對(duì)你有幫助的話,麻煩點(diǎn)亮一下 ??,這對(duì)我很重要哦~
我是 Flywith24,人只有通過和別人的討論,才能知道我們自己的經(jīng)驗(yàn)是否是真實(shí)的,加我微信交流,讓我們共同進(jìn)步。
掘金,小專欄,Github,微信(公眾號(hào)同名):Flywith24關(guān)注公眾號(hào),點(diǎn)擊底部 聯(lián)系我 -> 知識(shí)星球 加入免費(fèi)的知識(shí)星球
