如何高效地使用 Git
Git
是一個免費且開源的版本控制
系統,是目前最為流行的源代碼管理
工具,本篇文章從Git
的基本指令到進階操作,包含了使用Git
的過程中遇到的大部分大小問題
基本操作
初始化設置
設置用戶名和郵箱
$ git config --global user.name "用戶名"n$ git config --global user.email "郵箱"nn- 其中,--global 是全局設置,如果想對特定項目使用不同配置,可取消該參數n- git config 還可以設置其他選項,因為平時不怎麼用,所以詳細可以參考 git config --helpn
查看配置
$ git config --listnn# 查看 Git 的某一項配置n$ git config user.namen
創建 SSH Key
$ ssh-keygen -t rsa -C "郵箱"nn# 然後會在用戶主目錄下,發現 .ssh 目錄,其中包含 id_rsa 和 id_rsa.pub 兩個文件n# id_rsa.pub 是 SSH Key 公鑰,將其添加到 github 的 SSH keys 中,就可以將本地倉庫推送到遠程倉庫了n
創建本地倉庫,進行基本源代碼管理
# 初始化倉庫n$ git initnn# 將源代碼提交到暫存區n$ git add .nn# 提交暫存區的源代碼n$ git commit -m "本次提交說明"nn# 查看當前狀態n$ git statusn$ git status -sb // 查看 branch 和 short statusnn# 查看提交歷史n$ git logn
將本地代碼同步至遠程倉庫
# 克隆n$ git clone 倉庫地址nn# 遠程倉庫n$ git remotenn# 分支n$ git branch 分支名 // 創建n$ git checkout 分支名 // 切換nn# 合併n$ git merge 分支名nn# 拉取更新n$ git fetch 主機名 分支名 // 不合併n$ git pull 主機名 分支名 // 合併nn# 推送n$ git push 主機名 分支名nn# 打標籤n$ git tag -a 版本號 -m "版本說明"n
進階操作
忽略 SSL 證書錯誤
通過 HTTPS
訪問 Git
遠程倉庫時,如果伺服器的 SSL
證書未經過第三方機構簽署,那麼 Git
就會阻止這一操作
$ env GIT_SSL_NO_VERIFY=true git clone 倉庫地址n$ cd 倉庫名稱n$ git config http.sslVerify "false"nn- 使用 env 命令保證了忽略證書錯誤只應用於此次克隆n
儲藏
當有未提交的修改,執行 切換分支
或 拉取更新
需要倉庫狀態保持 clean
的一些操作時,可以使用 git stash
將目前的修改臨時儲藏起來
# 儲藏n$ git stashnn# 查看儲藏n$ git stash listnn# 應用最近儲藏並刪除n$ git stash popnn# 應用指定儲藏不刪除n$ git stash apply [儲藏名]nn# 移除儲藏n$ git stash drop 儲藏名n
撤消操作
對於 工作區
和 暫存區
的修改,我們不能保證上次操作是完美的,git
就是這麼強大,提供了很多 反悔
的操作
# 丟棄暫存區的文件,放回工作區n$ git reset HEAD 文件nn# 丟棄工作區的修改n$ git checkout -- 文件nn- 修改後沒添加到暫存區,則撤銷到 git commit 時的狀態n- 修改後添加到暫存區,則撤銷到 git add 時的狀態nn# 覆蓋上次提交n$ git commit --amend [-m "本次提交說明"]n
版本回退
# 回退到之前的某次提交n$ git reset --hard commit_idnn- HEAD 指向當前版本n- git log 可以查看提交歷史,以便確定要回退到哪個版本n- git reflog 可以查看命令歷史,以便確定要回到未來的哪個版本nn# 撤銷一個已經提交n$ git revert commit_idnn- 並沒有從項目歷史中移除這個 commit, 而是生成一個新的 commitn
分支
Git
有很多優點,其中 分支使用方便
就是很顯著的一條,創建倉庫的時候,master
是默認的分支,一般,我們會創建其他的分支在上面進行開發,完後再將它們合併到主分支上來
# 創建開發分支n$ git branch devnn# 創建並切換到開發分支n$ git checkout -b devnn# 切換回主分支n$ git checkout masternn# 快速檢出上一個分支n$ git checkout -nn# 查看所有分支n$ git branch -ann# 查看合併到當前分支的分支列表n$ git branch --mergednn# 查看還沒合併到當前分支的分支列表n$ git branch --no-mergednn# 刪掉臨時分支n$ git branch -d fixnn# 將開發分支推送到遠程倉庫n$ git push origin devnn# 重命名分支n$ git branch -m dev developnn# 刪除遠程分支n- $ git push origin --delete 分支名n- $ git push origin :分支名n
標籤
軟體要發布一個新的版本的時候,我們通常給它打個 tag
# 打標籤n$ git tag [-a] 標籤名 [-m 附註信息 某次提交的id]nn# 推送標籤到遠程倉庫n$ git push origin 標籤名n$ git push origin --tags // 推送所有標籤nn# 刪除本地標籤n$ git tag -d 標籤名nn# 刪除遠程標籤n$ git push origin --delete 標籤名n$ git push origin :refs/tags/標籤名n
提交
# 花式查看提交n$ git log --pretty=oneline // 只顯示一行n$ git log --abbrev-commit // 只顯示 SHA-1 的前幾個字元n$ git log --graph // 顯示 ASCII 圖形表示的分支合併歷史n$ git log --relative-date // 使用較短的相對時間顯示n$ git log --name-only // 僅在提交信息後顯示已修改的文件清單n$ git log -n // 顯示最近的 n 條提交n$ git log --author=fengshangwuqi // 僅顯示指定作者相關的提交n$ git log --grep // 僅顯示含指定關鍵字的提交nn# 沒有任何改動的提交ngit commit -m "a no chnage commit" --allow-emptynn主要用於一下情形:n- 標記新的工作或一個新功能的開始n- 記錄對項目的跟代碼無關的改動n- 跟使用你倉庫的其他人交流n- 作為倉庫的第一次提交,因為第一次提交後不能被 rebasen
git pull 與 git pull --rebase 的區別
$ git pull = git fetch + git mergen$ git pull --rebase = git fetch + git rebasen
git merge 與 git rebase 的區別
# 相同點n整合的最終結果所指向的快照是一樣的nn# 不同點n## 提交歷史不同n- merge 會生成一個新的 commit 節點,提交歷史忠實地記錄了實際發生過什麼n- rebase 不會產生額外的 commit 節點,提交歷史反映了項目過程中發生了什麼n## 衝突處理策略不同n- merge 遇見衝突後會直接停止,等待手動解決衝突並重新提交後,才能再次 mergen- rebase 遇見衝突後會暫停當前操作,開發者可以選擇手動解決衝突,然後 git rebase --continue 繼續,或 --skip 跳過,或 --abort 停止nn# 注意事項n## 推薦 git merge 結合 --no-ff 一起使用n- git merge 默認是 fast forward(快速合併),適用於分支 B 從分支 A 從 checkout 出來後,分支 A 沒有 commitn- 如果分支 B 被 checkout 出來後,分支 A 也有修改,那麼就沒法快速前進合併,會額外建立一個 merge commit,對分支 A 和分支 B 做一個合併操作,即 --no-ff,它的好處是保持了分支的結構n
其他
忽略特殊文件
對於 操作系統自動生成
的文件,編譯生成
的中間文件,以及帶有 敏感信息
的配置文件等,我們不想追蹤,也不想放進我們的遠程倉庫中,這時,我們創建一個 .gitignore
文件來忽略上述文件,下面是一個前端工程忽略的文件參考
# Logsnlogsn*.lognn# Runtime datanpidsn*.pidn*.seedn*.DS_Storenn# testingncoveragenn# Dependency directorynnode_modulesnn# Bowernbower_components/ndistnn# WebStorm文件n*.idea/nn# vscode文件n.vscode/nn# Emacsn.tern-portn.#*n*#n*~nn# vimn.agignorenn# 敏感信息ndefault.ymln
Commit message 指南
好的 Commit message
可以提供更多的歷史信息,方便 快速瀏覽和查找
,還可以直接生成 Change log
,一般至少包含 type
和 subject
,type 是 commit 的類別,subject 是 commit 的簡短描述
## typenn- feat:添加新功能n- fix:修補缺陷n- docs:修改文檔n- style: 修改格式n- refactor:重構n- perf:優化n- test:增加測試n- chore:構建過程或輔助工具的變動n- revert:回滾到上一個版本n
除此之外,有興趣的同學還可以添加 gitmoji 和 validate-commit-msg 等更多內容
使用 Commit 信息關閉 Issue
如果某個提交修復了一個 Issue
,當提交到某個分支時,提交信息里可以使用 fix/fixes/fixed
, close/closes/closed
或者 resolve/resolves/resolved
等關鍵詞,後面再跟上 Issue
號,這樣就會關閉這個 Issue
$ git commit -m "fix: ..., fix #1, #2"n
這將會關閉 Issue #1 和 #2
,並且在 Issue
討論列表裡關聯引用這次提交
如果想鏈接 其他倉庫的 Issue
,則使用 {user}/{repo}#ISSUE_NUMBER
快速添加許可證文件
在創建一個倉庫時,Github
會為你提供一個預置的軟體許可證列表
如果此時沒有選擇,後來可以通過 web 界面 create new file
,輸入 LICENSE
,點擊右側的 choose a license template
來添加
一些不錯的 github 插件
Octotree
:提供項目目錄GitHub Plus
:提供每個文件的大小和下載鏈接GitHub Hovercard
:懸停在用戶頭像或倉庫地址上時,通過懸浮框提供更多信息Sourcegraph for GitHub
:提供 IDE 上常用的功能操作Awesome Autocomplete for GitHub
:提供更強大的智能搜索Isometric Contributions
:更友好地展示提交記錄
http://Git.io
Git.io 是 Github 的 短網址
服務
你可以通過 Curl
命令以普通 HTTP
協議使用它
$ curl -i https://git.io -F "url=https://github.com/..."nHTTP/1.1 201 CreatednLocation: https://git.io/abc123nn$ curl -i https://git.io/abc123nHTTP/1.1 302 FoundnLocation: https://github.com/...n
Gists
Gists 方便我們管理代碼片段,不必使用功能齊全的倉庫
Gist
可以非常方便地得到便於嵌入到其他網站的 HTML 代碼
而且,Gists
可以像任何標準倉庫一樣被克隆,你可以像 Github
倉庫一樣去修改和更新 Gists
,只不過,Gists
不支持目錄,所有文件都添加在倉庫的根目錄下
使用快捷鍵
github 倉庫頁面
提供了一些 快捷鍵
方便大家快速導航,按 ?
可以查看當前頁面支持的 快捷鍵列表
使用表情符
我們在 Pull Requests
, Issues
, commit
, Markdown
文件中可以加我們喜歡的表情,使用方法如下
:name_of_emoji:n
比如 :joy:
會返回一個
更多表情,可參考 emoji-cheat-sheet
其中,可能常用的表情有
:tada:
:sparkles:
:bug:
:
:white_check_mark:
:
:wrench:
:ok_hand:
:construction_worker:
:whale:
:clap:
總結
關於 Git
,如果還有 更有意思的內容或問題
,歡迎在評論中交流
推薦閱讀:
※Git的初步使用教程
※高大上的Git
※說說Git reset 與 revert 的故事
※Visual Studio Code 使用Git進行版本控制