git 常用命令以及其他使用筆記

東平人氏發表於2018-05-30

本篇文章記錄了 git 的使用過程中的筆記,大部分為常用命令列記錄。內容傾向查閱使用,而非教程,詳細教程文中有連結。部落格會不定時持續更新。

推薦詳細教程

名詞解釋與目錄結構

1. .git 目錄

/stage 或 /index:暫存區,具體見名稱解釋 /HEAD:版本指標 /config:配置檔案

2. 名詞解釋

  1. 工作區(Working Directory):就是你在電腦裡能看到的目錄,不解釋
  2. 版本庫(Repository):就是 .git 目錄
  3. 暫存區:命令 git add . 就是將修改內容放置到暫存區,而命令 git commit 則是將暫存區的內容提交到當前分支

初始配置

效果:在"~"目錄下會生成隱藏檔案: .gitconfig

# 配置使用者
git config --global user.name "Your Name"
git config --global user.email "email@example.com"

# 檢視使用者
git config --global user.name
git config --global user.email
複製程式碼

倉庫建立

# 建立本地倉庫
git init

# 建立遠端倉庫(伺服器使用命令)
git --bare init

# 從遠端克隆倉庫(只會克隆預設分支,一般是 master)
git clone https://github.com/ReactiveX/RxJava.git RxJava/
複製程式碼

遠端庫與本地互動操作

關聯遠端庫

# 本地與遠端庫關聯
git remote add origin https://github.com/hanhailong/CustomRatingBar

# 顯示出詳細的 remote 資訊
git remote -v

# 刪除新增的遠端庫
git remote remove origin
複製程式碼

遠端分支管理

# 從遠端庫更新到本地(不自動 merge)
git fetch

git fetch origin master

# 從遠端庫更新到本地(自動 merge)
git pull

git pull origin master

# 將本地分支推送到遠端庫(影響遠端庫,並自動關聯本地分支與遠端分支)
# git push -u 遠端庫名稱 本地分支名稱:遠端庫分支名稱
git push -u origin master:master

# 將本地分支推送到遠端庫(影響遠端庫,不關聯本地分支與遠端分支)
git push origin master:master

git push origin master

# 將本地當前分支推送到遠端庫(影響遠端庫,當前分支與遠端分支已關聯才可使用)
git push

# 檢視遠端庫的分支資訊
git branch -r

# 拉取遠端分支並建立本地分支
# git checkout -b 本地分支名稱 遠端庫名稱/遠端庫分支名稱
git checkout -b dev origin/dev

# 刪除遠端分支
git push origin --delete dev

# 更新遠端分支列表
git remote update origin --prune
複製程式碼

遠端標籤管理

# 拉取遠端標籤到本地標籤(指定)
git fetch origin tag v1.1.0

# 將本地標籤推送到遠端庫(指定)
git push origin v1.1.0

# 將本地標籤推送到遠端庫(所有)
git push origin --tags

# 刪除遠端庫標籤(指定)
git push origin :v1.1.0

# 其實不論是推送到遠端,還是從遠端庫刪除,命令均轉換成以下語句,刪除是源標籤為空
git push origin refs/tags/源標籤:refs/tags/目的標籤

git push origin refs/tags/v1.1.0:refs/tags/v1.1.0
複製程式碼

備註:

  1. origin:遠端庫名稱
  2. master, deve, dev:是遠端/本地分支名稱,自定義
  3. 1.1.0:本地標籤名稱,自定義

影響遠端庫的操作:

  1. git push 系列命令

本地倉庫操作

1. 檢視幫助

# 檢視幫助
git help
複製程式碼

2. 新增、刪除、提交

# 新增(內容更新到暫存區)
git add .

git add readme.txt

# 刪除(內容更新到暫存區,同時刪除工作區檔案)
git rm readme.txt

# 提交
git commit -m "Wrote a readme file"
複製程式碼

3. 對比

狀態對比

# 檢視狀態:當前程式碼庫與最新版本的簡單對比
git status

git status readme.txt
複製程式碼

內容對比

# 工作區與暫存區對比
git diff -- readme.txt ## 有時可以省略 --,但不推薦,具體見下面的說明

# 工作區與版本區對比
git diff HEAD readme.txt

git diff HEAD -- readme.txt

# 暫存區與版本區對比
git diff --staged readme.txt

git diff --cached readme.txt

# 工作區與指定分支的版本區對比
git diff deve readme.txt

#
git diff 1094a readme.txt
複製程式碼

說明:

  1. 綠色表示檔案被 git add,紅色表示檔案沒有被 git add
  2. git diff -- readme.txt:其中 -- 作用是防止命令變成分支對比,如果不存在該分支,則可以省略 --,但不推薦
  3. deve:是分支名稱,自定義
  4. 1094a:是版本號,就是 commit id

4. 日誌

# 檢視專案 log
git log

# 檢視某檔案 log
git log -- readme.txt

git log readme.txt

# 只檢視 10 個 log
git log -10

# 一行顯示 log,只顯示雜湊值和提交說明
git log --pretty=oneline

git log --oneline

# 檢視圖形 Log
git log --oneline --graph --abbrev-commit

git log --pretty=format:"%C(auto)%h %ad | %C(auto)%s%d  %C(bold blue)<%an>" --date=short --graph --abbrev-commit

# 檢視某檔案每次提交的 Diff
git log -p readme.txt

# 檢視某檔案指定提交的 Diff
git show 1094a readme.txt # 1094a 是版本號,就是 commit id
複製程式碼

說明:

  1. 日誌中 "HEAD —>" 當前版本指標,指向當前版本,以下簡稱 HEAD 指標

5. 版本管理

版本庫管理(可能會影響到工作區)

# 版本回滾(當前版本變為指定版本,同時暫存區被清空,不影響工作區)
git reset HEAD^

# 版本穿梭(當前版本變為指定版本,同時暫存區被清空,工作區的所有 modified 檔案被 Revert 到指定版本)
git reset --hard HEAD^

git reset --hard 1094a # 1094a 是版本號,就是 commit id

# 檢視版本管理命令歷史,可用於獲取所有的版本號
git reflog
複製程式碼

說明:

  1. HEAD: 表示當前版本,HEAD^:表示上一個版本,HEAD^^:表示上上一個版本,HEAD~100:表示上上上...(100個上)個版本
  2. 版本號寫前幾位即可
  3. 版本穿梭後 git log 就只顯示到指定版本,即不含指定版本之後的 log 資訊

版本 Revert(不影響版本庫)

# Revert 到暫存區(工作區與暫存區相同)
git checkout .

git checkout -- readme.txt ## 有時可以省略 --,但不推薦,具體見下面的說明

# Revert 到指定版本庫(工作區與指定版本庫相同,同時暫存區被清空)
git checkout HEAD^ .

git checkout HEAD^ readme.txt

git checkout HEAD^ -- readme.txt ## 可以省略 --
複製程式碼

說明:

  1. git checkout -- readme.txt:其中 -- 作用是防止命令變成分支切換,如果不存在該分支,則可以省略 --,但不推薦
  2. 誤刪回滾:無論是 git rm,還是直接刪除導致的誤刪,均可通過上述方式回滾

6. 分支管理

# 檢視分支
git branch

# 檢視當前分支
git symbolic-ref --short -q HEAD

# 建立分支(不切換分支)
git branch deve

# 切換分支
git checkout deve

# 建立 + 切換分支
git checkout -b deve

# 刪除分支
git branch -d deve

# 合併指定分支到當前分支(Fast forward 模式,不保留分支資訊)
git merge deve

# 合併指定分支到當前分支(推薦,禁用 Fast forward 模式,保留分支資訊)
git merge --no-ff -m "add merge" deve

# 關聯分支與遠端分支
git branch --set-upstream-to origin/deve deve
複製程式碼

備註說明:

  1. deve:是分支名稱,自定義
  2. git branch:當前分支前面會標一個 * 號
  3. 切換分支:如暫存區不為空(即執行過 git add),則需 git commit 或者 git reset 才能切換分支

7. stash 模式

# 當前工作現場儲存起來,用於臨時切換分支
git stash

# 檢視已儲存的所有的工作現場資訊
git stash list

# 檢視工作現場檔案狀態資訊
git stash show

git stash show --index 1

# 工作現場恢復(不刪除工作現場)
git stash apply # 不推薦,具體原因見下面說明

git stash apply --index 1

# 刪除工作現場(不推薦,具體原因見下面說明)
git stash drop # 不推薦,具體原因見下面說明

git stash drop --index 1

# 工作現場恢復(自動刪除工作現場)
git stash pop # 不推薦,具體原因見下面說明

git stash pop --index 1
複製程式碼

備註說明:

  1. --index 1:1 表示索引號,可通過 git stash list 檢視
  2. git stash apply:不推薦,因為如果存在多個工作現場,則容易出現工作現場存在衝突的問題。推薦追加引數 --index
  3. git stash pop:不推薦,原因同上,不過一旦衝突,工作現場並不會自動刪除。推薦追加引數 --index
  4. git stash drop:不推薦,容易造成誤刪除,因為該命令刪除的是索引號為 0 的工作現場(並不管該工作現場是哪個分支的)。推薦追加引數 --index

8. Tag 管理

# 列顯已有的標籤(按字母順序排列)
git tag

# 列顯已有的標籤(檢索模式)
git tag -l 'v1.1.*'

# 新建標籤(輕量級標籤:指向特定提交物件的引用)
git tag v1.1.0

# 新建標籤(含附註的標籤:獨立物件,有自身的校驗和資訊)
git tag -a v1.1.0 -m 'my version 1.1.0'

# 新建標籤(簽署標籤:含附註的標籤的一種)
git tag -s v1.1.0 -m 'my signed 1.1.0 tag'

# 後期向某次提交加註標籤
git tag -a v1.2 9fceb02

# 刪除標籤
git tag -d v1.1.0

# 驗證標籤
git tag -v v1.1.0

# 切換標籤(切換到一個名為'(HEAD detached at v1.1.0)'的空白分支上)
git checkout v1.1.0
複製程式碼

備註說明:

  1. v1.1.*、v1.1.0:標籤名稱,自定義
  2. 9fceb02:某次 commit 資訊,自定義

譯註:

  • -a:取 annotated 的首字母
  • -s:取 signed 的首字母
  • -v:取 verify 的首字母

git 全域性配置

# 設定[pretty]
git config --global pretty.graph '%C(auto)%h %ad | %C(auto)%s%d  %C(bold blue)<%an>'

# 設定別名:[alias]
git config --global alias.logg 'log --pretty=graph --date=short --graph --abbrev-commit'
複製程式碼

新增 Git 忽略配置

由目錄下的[.gitignore]檔案確定,使用規則如下:

萬用字元:

  • / :表示目錄
  • * :匹配多個字元
  • ? :匹配單個字元
  • ! :包含單個字元的匹配列表
  • [] :表示不忽略(跟蹤)匹配到的檔案或目錄

詳細說明:

  • 一行一個忽略項
  • 配置按從上到下進行規則匹配的,意味著如果前面的規則匹配的範圍更大,則後面的規則將不會生效
  • 規則【build/*】: 等同於【build】,忽略根目錄或某一目錄下的[build],以及其下的全部內容
  • 規則【/.idea/*】: 等同於【/idea】,忽略根目錄下的[.idea],以及其下的全部內容
  • 以下規則,表示忽略全部內容,但是不忽略[.gitignore]檔案

/*

!.gitignore

相關文章