本篇文章記錄了 git 的使用過程中的筆記,大部分為常用命令列記錄。內容傾向查閱使用,而非教程,詳細教程文中有連結。部落格會不定時持續更新。
推薦詳細教程
名詞解釋與目錄結構
1. .git 目錄
/stage 或 /index:暫存區,具體見名稱解釋 /HEAD:版本指標 /config:配置檔案
2. 名詞解釋
- 工作區(Working Directory):就是你在電腦裡能看到的目錄,不解釋
- 版本庫(Repository):就是 .git 目錄
- 暫存區:命令
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
複製程式碼
備註:
- origin:遠端庫名稱
- master, deve, dev:是遠端/本地分支名稱,自定義
- 1.1.0:本地標籤名稱,自定義
影響遠端庫的操作:
- 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
複製程式碼
說明:
- 綠色表示檔案被
git add
,紅色表示檔案沒有被git add
git diff -- readme.txt
:其中--
作用是防止命令變成分支對比,如果不存在該分支,則可以省略--
,但不推薦- deve:是分支名稱,自定義
- 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
複製程式碼
說明:
- 日誌中 "HEAD —>" 當前版本指標,指向當前版本,以下簡稱 HEAD 指標
5. 版本管理
版本庫管理(可能會影響到工作區)
# 版本回滾(當前版本變為指定版本,同時暫存區被清空,不影響工作區)
git reset HEAD^
# 版本穿梭(當前版本變為指定版本,同時暫存區被清空,工作區的所有 modified 檔案被 Revert 到指定版本)
git reset --hard HEAD^
git reset --hard 1094a # 1094a 是版本號,就是 commit id
# 檢視版本管理命令歷史,可用於獲取所有的版本號
git reflog
複製程式碼
說明:
- HEAD: 表示當前版本,HEAD^:表示上一個版本,HEAD^^:表示上上一個版本,HEAD~100:表示上上上...(100個上)個版本
- 版本號寫前幾位即可
- 版本穿梭後
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 ## 可以省略 --
複製程式碼
說明:
git checkout -- readme.txt
:其中--
作用是防止命令變成分支切換,如果不存在該分支,則可以省略--
,但不推薦- 誤刪回滾:無論是
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
複製程式碼
備註說明:
- deve:是分支名稱,自定義
- git branch:當前分支前面會標一個 * 號
- 切換分支:如暫存區不為空(即執行過
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
複製程式碼
備註說明:
--index 1
:1 表示索引號,可通過git stash list
檢視git stash apply
:不推薦,因為如果存在多個工作現場,則容易出現工作現場存在衝突的問題。推薦追加引數--index
git stash pop
:不推薦,原因同上,不過一旦衝突,工作現場並不會自動刪除。推薦追加引數--index
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
複製程式碼
備註說明:
- v1.1.*、v1.1.0:標籤名稱,自定義
- 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