如何高效地使用 Git

cover

Git 是一個免費且開源的 版本控制 系統,是目前最爲流行的 源代碼管理 工具,本篇文章從 Git 的基本指令到進階操做,包含了使用 Git 的過程當中遇到的大部分大小問題

基本操做

初始化設置

設置用戶名和郵箱前端

$ git config --global user.name "用戶名"
$ git config --global user.email "郵箱"

- 其中,--global 是全局設置,若是想對特定項目使用不一樣配置,可取消該參數
- git config 還能夠設置其餘選項,由於平時不怎麼用,因此詳細能夠參考 git config --help

查看配置node

$ git config --list

# 查看 Git 的某一項配置
$ git config user.name

建立 SSH Keygit

$ ssh-keygen -t rsa -C "郵箱"

# 而後會在用戶主目錄下,發現 .ssh 目錄,其中包含 id_rsa 和 id_rsa.pub 兩個文件
# id_rsa.pub 是 SSH Key 公鑰,將其添加到 github 的 SSH keys 中,就能夠將本地倉庫推送到遠程倉庫了

建立本地倉庫,進行基本源代碼管理

# 初始化倉庫
$ git init

# 將源代碼提交到暫存區
$ git add .

# 提交暫存區的源代碼
$ git commit -m "本次提交說明"

# 查看當前狀態
$ git status
$ git status -sb  // 查看 branch 和 short status

# 查看提交歷史
$ git log

將本地代碼同步至遠程倉庫

# 克隆
$ git clone 倉庫地址

# 遠程倉庫
$ git remote

# 分支
$ git branch 分支名    // 建立
$ git checkout 分支名  // 切換

# 合併
$ git merge 分支名

# 拉取更新
$ git fetch 主機名 分支名    // 不合並
$ git pull 主機名 分支名    // 合併

# 推送
$ git push 主機名 分支名

# 打標籤
$ git tag -a 版本號 -m "版本說明"

進階操做

忽略 SSL 證書錯誤

經過 HTTPS 訪問 Git 遠程倉庫時,若是服務器的 SSL 證書未通過第三方機構簽署,那麼 Git 就會阻止這一操做github

$ env GIT_SSL_NO_VERIFY=true git clone 倉庫地址
$ cd 倉庫名稱
$ git config http.sslVerify "false"

- 使用 env 命令保證了忽略證書錯誤只應用於這次克隆

儲藏

當有未提交的修改,執行 切換分支拉取更新 須要倉庫狀態保持 clean 的一些操做時,可使用 git stash 將目前的修改臨時儲藏起來web

# 儲藏
$ git stash

# 查看儲藏
$ git stash list

# 應用最近儲藏並刪除
$ git stash pop

# 應用指定儲藏不刪除
$ git stash apply [儲藏名]

# 移除儲藏
$ git stash drop 儲藏名

撤消操做

對於 工做區暫存區 的修改,咱們不能保證上次操做是完美的,git 就是這麼強大,提供了不少 反悔 的操做vim

# 丟棄暫存區的文件,放回工做區
$ git reset HEAD 文件

# 丟棄工做區的修改
$ git checkout -- 文件

- 修改後沒添加到暫存區,則撤銷到 git commit 時的狀態
- 修改後添加到暫存區,則撤銷到 git add 時的狀態

# 覆蓋上次提交
$ git commit --amend [-m "本次提交說明"]

版本回退

# 回退到以前的某次提交
$ git reset --hard commit_id

- HEAD 指向當前版本
- git log 能夠查看提交歷史,以便肯定要回退到哪一個版本
- git reflog 能夠查看命令歷史,以便肯定要回到將來的哪一個版本

# 撤銷一個已經提交
$ git revert commit_id

- 並無從項目歷史中移除這個 commit, 而是生成一個新的 commit

分支

Git 有不少優勢,其中 分支使用方便 就是很顯著的一條,建立倉庫的時候,master 是默認的分支,通常,咱們會建立其餘的分支在上面進行開發,完後再將它們合併到主分支上來服務器

# 建立開發分支
$ git branch dev

# 建立並切換到開發分支
$ git checkout -b dev

# 切換回主分支
$ git checkout master

# 快速檢出上一個分支
$ git checkout -

# 查看全部分支
$ git branch -a

# 查看合併到當前分支的分支列表
$ git branch --merged

# 查看還沒合併到當前分支的分支列表
$ git branch --no-merged

# 刪掉臨時分支
$ git branch -d fix

# 將開發分支推送到遠程倉庫
$ git push origin dev

# 重命名分支
$ git branch -m dev develop

# 刪除遠程分支
- $ git push origin --delete 分支名
- $ git push origin :分支名

標籤

軟件要發佈一個新的版本的時候,咱們一般給它打個 tagapp

# 打標籤
$ git tag [-a] 標籤名 [-m 附註信息 某次提交的id]

# 推送標籤到遠程倉庫
$ git push origin 標籤名
$ git push origin --tags    // 推送全部標籤

# 刪除本地標籤
$ git tag -d 標籤名

# 刪除遠程標籤
$ git push origin --delete 標籤名
$ git push origin :refs/tags/標籤名

提交

# 花式查看提交
$ git log --pretty=oneline  // 只顯示一行
$ git log --abbrev-commit   // 只顯示 SHA-1 的前幾個字符
$ git log --graph           // 顯示 ASCII 圖形表示的分支合併歷史
$ git log --relative-date   // 使用較短的相對時間顯示
$ git log --name-only       // 僅在提交信息後顯示已修改的文件清單
$ git log -n                      // 顯示最近的 n 條提交
$ git log --author=fengshangwuqi  // 僅顯示指定做者相關的提交
$ git log --grep                  // 僅顯示含指定關鍵字的提交

# 沒有任何改動的提交
git commit -m "a no chnage commit" --allow-empty

主要用於一下情形:
- 標記新的工做或一個新功能的開始
- 記錄對項目的跟代碼無關的改動
- 跟使用你倉庫的其餘人交流
- 做爲倉庫的第一次提交,由於第一次提交後不能被 rebase

git pull 與 git pull --rebase 的區別

$ git pull = git fetch + git merge
$ git pull --rebase = git fetch + git rebase

git merge 與 git rebase 的區別

# 相同點
整合的最終結果所指向的快照是同樣的

# 不一樣點
## 提交歷史不一樣
- merge 會生成一個新的 commit 節點,提交歷史忠實地記錄了實際發生過什麼
- rebase 不會產生額外的 commit 節點,提交歷史反映了項目過程當中發生了什麼
## 衝突處理策略不一樣
- merge 碰見衝突後會直接中止,等待手動解決衝突並從新提交後,才能再次 merge
- rebase 碰見衝突後會暫停當前操做,開發者能夠選擇手動解決衝突,而後 git rebase --continue 繼續,或 --skip 跳過,或 --abort 中止

# 注意事項
## 推薦 git merge 結合 --no-ff 一塊兒使用
- git merge 默認是 fast forward(快速合併),適用於分支 B 從分支 A 從 checkout 出來後,分支 A 沒有 commit
- 若是分支 B 被 checkout 出來後,分支 A 也有修改,那麼就無法快速前進合併,會額外創建一個 merge commit,對分支 A 和分支 B 作一個合併操做,即 --no-ff,它的好處是保持了分支的結構

其餘

忽略特殊文件

對於 操做系統自動生成 的文件,編譯生成 的中間文件,以及帶有 敏感信息 的配置文件等,咱們不想追蹤,也不想放進咱們的遠程倉庫中,這時,咱們建立一個 .gitignore 文件來忽略上述文件,下面是一個前端工程忽略的文件參考ssh

# Logs
logs
*.log

# Runtime data
pids
*.pid
*.seed
*.DS_Store

# testing
coverage

# Dependency directory
node_modules

# Bower
bower_components/
dist

# WebStorm文件
*.idea/

# vscode文件
.vscode/

# Emacs
.tern-port
.#*
*#
*~

# vim
.agignore

# 敏感信息
default.yml

Commit message 指南

好的 Commit message 能夠提供更多的歷史信息,方便 快速瀏覽和查找,還能夠直接生成 Change log,通常至少包含 typesubject,type 是 commit 的類別,subject 是 commit 的簡短描述curl

## type

- feat:添加新功能
- fix:修補缺陷
- docs:修改文檔
- style: 修改格式
- refactor:重構
- perf:優化
- test:增長測試
- chore:構建過程或輔助工具的變更
- revert:回滾到上一個版本

除此以外,有興趣的同窗還能夠添加 gitmojivalidate-commit-msg 等更多內容

使用 Commit 信息關閉 Issue

若是某個提交修復了一個 Issue,當提交到某個分支時,提交信息裏可使用 fix/fixes/fixed, close/closes/closed 或者 resolve/resolves/resolved 等關鍵詞,後面再跟上 Issue 號,這樣就會關閉這個 Issue

$ git commit -m "fix: ..., fix #1, #2"

這將會關閉 Issue #1 和 #2,而且在 Issue 討論列表裏關聯引用此次提交

若是想連接 其餘倉庫的 Issue,則使用 {user}/{repo}#ISSUE_NUMBER

快速添加許可證文件

在建立一個倉庫時,Github 會爲你提供一個預置的軟件許可證列表

clipboard.png

若是此時沒有選擇,後來能夠經過 web 界面 create new file,輸入 LICENSE,點擊右側的 choose a license template 來添加

clipboard.png

一些不錯的 github 插件

  • Octotree:提供項目目錄
  • GitHub Plus:提供每一個文件的大小和下載連接
  • GitHub Hovercard:懸停在用戶頭像或倉庫地址上時,經過懸浮框提供更多信息
  • Sourcegraph for GitHub:提供 IDE 上經常使用的功能操做
  • Awesome Autocomplete for GitHub:提供更強大的智能搜索
  • Isometric Contributions:更友好地展現提交記錄

Git.io

Git.io 是 Github 的 短網址 服務

io

你能夠經過 Curl 命令以普通 HTTP 協議使用它

$ curl -i https://git.io -F "url=https://github.com/..."
HTTP/1.1 201 Created
Location: https://git.io/abc123

$ curl -i https://git.io/abc123
HTTP/1.1 302 Found
Location: https://github.com/...

Gists

Gists 方便咱們管理代碼片斷,沒必要使用功能齊全的倉庫

Gists

Gist 能夠很是方便地獲得便於嵌入到其餘網站的 HTML 代碼

並且,Gists 能夠像任何標準倉庫同樣被克隆,你能夠像 Github 倉庫同樣去修改和更新 Gists,只不過,Gists 不支持目錄,全部文件都添加在倉庫的根目錄下

使用快捷鍵

github 倉庫頁面 提供了一些 快捷鍵 方便你們快速導航,按 ? 能夠查看當前頁面支持的 快捷鍵列表

keyboard

使用表情符

咱們在 Pull Requests, Issues, commit, Markdown 文件中能夠加咱們喜歡的表情,使用方法以下

:name_of_emoji:

好比 :joy: 會返回一個

更多表情,可參考 emoji-cheat-sheet

其中,可能經常使用的表情有

  • :tada:
  • :sparkles:
  • :bug::
  • :white_check_mark::
  • :wrench:
  • :ok_hand:
  • :construction_worker:
  • :whale:
  • :clap:

總結

關於 Git,若是還有 更有意思的內容或問題,歡迎在評論中交流

相關文章
相關標籤/搜索