Git常用命令

1. 新建代碼庫

# 初始化本地倉庫,在當(dāng)前目錄下生成 .git 文件夾
$ git init
# 默認(rèn)在當(dāng)前目錄下創(chuàng)建和版本庫名相同的文件夾并下載版本到該文件夾下
$ git clone <remote-url>

# 指定本地倉庫的目錄
$ git clone <remote-url> <local-file-path>

# -b 指定要克隆的分支或tag,默認(rèn)是master分支
$ git clone <remote-url> -b <remote-branch-name> <local-file-path>

# --depth 指定克隆深度,很多時候我們并不需要將一個倉庫下的所有歷史全部拉下來,而是只需要最新的代碼,這個時候就可以用該參數(shù)來控制
# 需要該倉庫下的最新代碼:git clone git@gitlab... --depth 1
$ git clone <remote-url> --depth 1

# 克隆帶主倉庫,并遞歸初始化和更新依賴子模塊
$ git clone --recurse-submodules <remote-url>

參考資料:Git 基礎(chǔ) - 遠程倉庫的使用

2. 操作遠程庫

# 列出已經(jīng)存在的遠程倉庫
$ git remote

# 列出遠程倉庫的詳細信息,在別名后面列出URL地址
$ git remote -v

# 添加遠程倉庫
$ git remote add <remote-name> <remote-url>

# 修改遠程倉庫的別名
$ git remote rename <origin-name> <new-name>

# 修改遠程倉庫的 URL 地址
$ git remote set-url <remote-name> <new-remote-url>

3. 狀態(tài)查看及變更

# 查看本地倉庫的狀態(tài)
$ git status

# 以簡短模式查看本地倉庫的狀態(tài)
# 會顯示兩列,第一列是文件的狀態(tài),第二列是對應(yīng)的文件
# 文件狀態(tài):A 新增,M 修改,D 刪除,?? 未添加到Git中
$ git status -s 或 git status --short

# 查看依賴的子模塊信息
$ git submodule status
# 把指定的文件添加到暫存區(qū)中
$ git add <文件> ...

# 添加所有文件到暫存區(qū)
$ git add .

# 暫存補?。ń换ナ竭x擇暫存文件指定部分)
# y 暫存該修改塊
# n 不暫存該修改塊
# q 退出,同時不會暫存本次提示和所有文件剩余沒有提示過的修改塊
# a 暫存本次提示和該文件剩余沒有提示過的修改塊
# d 不暫存本次提示和該文件剩余沒有提示過的修改塊
# g - select a hunk to go to(未嘗試)
# / - search for a hunk matching the given regex(未嘗試)
# j - leave this hunk undecided, see next undecided hunk(未嘗試)
# J - leave this hunk undecided, see next hunk(未嘗試)
# e - manually edit the current hunk(未嘗試)
# ? 打印幫助文檔
$ git add -p 或 git add --patch

# 進入交互式暫存操作
# Commands:
# 1: status,狀態(tài)查看,在 What now> 的時候輸入 1 或 s 或 status 然后按enter,可以查看文件改動
# 2: update,暫存,在 What now> 的時候輸入 2 或 u 或 update 然后按enter進入文件選擇模式,輸入需要暫存文應(yīng)的編號,多個文件中間用 ',' 隔開(例:Update>> 1、Update>> 1,2)然后按enter進入確認(rèn)模式,這個時候可以追加暫存文件,將會被暫存的文件前面會用 '*' 標(biāo)記出來,如果在 Update>> 提示符后不輸入任何東西并直接按enter,被標(biāo)記文件會被暫存起來
# 3: revert,取消暫存,在 What now> 的時候輸入 3 或 r 或 revert 然后按enter進入文件選擇模式,輸入需要取消暫存文應(yīng)的編號,多個文件中間用 ',' 隔開(例:Revert>> 1、Revert>> 1,2)然后按enter進入確認(rèn)模式,這個時候可以追加要取消暫存的文件,將會被取消暫存的文件前面會用 '*' 標(biāo)記出來,如果在 Update>> 提示符后不輸入任何東西并直接按enter,被標(biāo)記文件會被取消暫存
# 4: add untracked,添加未被跟蹤文件到暫存,跟 update 和 revert 操作類似
# 5: patch,暫存補丁,(相當(dāng)于執(zhí)行 git add -p),在 What now> 的時候輸入 5 或 p 或 patch 然后按enter進入文件選擇模式,輸入需要補丁暫存操作的文件編號,多個文件中間用 ',' 隔開(例:Patch update>> 1、Patch update>> 1,2)然后按enter進入確認(rèn)模式,這個時候可以追加要補丁暫存操作的文件,將會被補丁暫存操作的文件前面會用 '*' 標(biāo)記出來,如果在 Patch update>> 提示符后不輸入任何東西并直接按enter,進入補丁暫存操作,跟據(jù)提示完成補丁暫存工作
# 6: diff,查看暫存內(nèi)容(相當(dāng)于執(zhí)行 git diff --cached),跟 patch 操作類似
# 7: quit,退出交互式暫存操作,在 What now> 的時候輸入 7 或 q 或 quit 然后按enter退出交互式暫存操作
# 8: help,打印幫助文檔
$ git add -i 或 git add --interactive
# 查看工作空間修改(尚未暫存的修改)
$ git diff

# 查看指定文件尚未暫存的修改
$ git diff <file>...

# 查看已暫存起來的修改(Git 1.6.1 及更高版本還允許使用 git diff --staged,效果是相同的)
$ git diff --cached

參考資料:Git 基礎(chǔ) - 記錄每次更新到倉庫Git 工具 - 交互式暫存

4. 撤銷

# 撤銷工作區(qū)指定文件的修改
git restore <file>... 或 git checkout -- <file>...

# 撤銷工作區(qū)所有文件的修改
git restore . 或 git checkout -- .

# 取消指定文件的暫存修改
$ git restore --staged <file>... 或 git reset HEAD <file>...

# 取消所有文件的暫存修改
$ git restore --staged . 或 git reset HEAD .

參考資料:Git 基礎(chǔ) - 撤消操作

5. 貯藏

# 將修改貯藏起來,包括工作空間的修改和索引中暫存的修改
$ git status | $ git status push

# 將修改貯藏起來并加上對應(yīng)描述
$ git status push --message "<貯藏描述>" 或 git status push -m "<貯藏描述>"

# 將修改貯藏起來,同時保持索引中的暫存修改
$ git stash --keep-index 或 git stash push -k

# 交互式地提示哪些修改想要貯藏、哪些修改不想貯藏,根據(jù)提示進行選擇(類似上面的 git add -p)
$ git stash --patch 或 git stash -p

# 查看貯藏列表
$ git stash list

# 將最近一次貯藏內(nèi)容重新應(yīng)用(不從貯藏列表中清除)
$ git stash apply 或 git stash apply stash@{0}

# 將最近一次貯藏內(nèi)容重新應(yīng)用(不從貯藏列表中清除),并且保持貯藏時的索引暫存狀態(tài)
$ git stash apply --index

# 將最近一次貯藏內(nèi)容重新應(yīng)用(從貯藏列表中清除)
$ git stash pop

# 丟棄貯藏列表中最近的一次貯藏記錄
$ git stash drop 或 git stash drop stash@{0}

# 清空貯藏列表
$ git stash clear

參考資料:Git 工具 - 貯藏與清理

6. 清理

# 刪除未被跟蹤的文件
$ git clean

# 刪除指定的未被跟蹤的文件
$ git clean <file>...

# 刪除未被跟蹤的文件和目錄
$ git clean -d

# 做一次演習(xí)然后告訴將要移除什么,實際不會刪除任何文件
$ git clean -n

# 如果Git配置變量clean.requireForce未設(shè)置為false,git clean將拒絕刪除文件或目錄,除非給定-f
$ git clean -f

# 例:刪除所有未被跟蹤的文件及目錄
$ git clean -d -f

參考資料:Git 工具 - 貯藏與清理

7. 提交

# 把索引中暫存的修改提交到本地倉庫中并添加描述信息
$ git commit -m "<提交的描述信息>"

# 相當(dāng)于 'git add .' 和 'git commit' 組合
$ git commit -a -m "<提交的描述信息>"

# 將另外某個分支上的修改作用到當(dāng)前分支上
$ git cherry-pick <commit-id>

8. 重寫歷史(未同步到遠程倉庫)

# 修改最后一條提交,追加索引中新暫存的修改,可以修改commit message(以vim方式展示)
# 如果想撤銷 amend 操作可以參考 http://www.itdecent.cn/p/97341ed9d89e,原理:用 git reflog 查找到對應(yīng)的commit id,然后回滾回去
$ git commit --amend

# 修改最后一條提交,追加索引中新暫存的修改,并修改commit message
$ git commit --amend -m "<提交的描述信息>"

# 索引中新暫存的修改同步到最后一次commit,跳過commit message編輯
$ git commit --amend --no-edit

# 交互式操作最近的n次提交,例如對最近3次提交進行修改 'git rebase -i HEAD~3'
# Commands:
# p, pick <commit> = 保留該commit
# r, reword <commit> = 保留該commit, 但是可以編輯commit message
# e, edit <commit> = 保留該commit, 停留在該次commit, 對該次commit或前后面做些修改, 修改完后運行 'git rebase --continue' 往下走
# s, squash <commit> = 保留該commit, 將其合并到前一次commit
# f, fixup <commit> = 跟squash一樣, 但是會跳過合并后的commit message編輯
# x, exec <command> = run command (the rest of the line) using shell (未嘗試)
# b, break = stop here (continue rebase later with 'git rebase --continue')  (未嘗試)
# d, drop <commit> = 丟棄該commit
# l, label <label> = label current HEAD with a name  (未嘗試)
# t, reset <label> = reset HEAD to a label  (未嘗試)
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]  (未嘗試)
$ git rebase -i HEAD~n

參考資料:Git 工具 - 重寫歷史、撤銷 git commit --amend

9. 重置

# 將HEAD挪到指定提交,索引暫存和工作區(qū)保持不變
$ git reset --soft <commit-id>

# 將HEAD挪到指定提交,索引暫存區(qū)回滾到指定提交,工作區(qū)保持不變
$ git reset --mixed <commit-id> 或 git reset <commit-id>

# 將HEAD挪到指定提交,索引暫存區(qū)和工作區(qū)都回滾到指定提交
$ git reset --hard <commit-id>

# 將HEAD挪到前一次或前n次提交,索引暫存和工作區(qū)保持不變
$ git reset --soft HEAD~ 或 git reset --soft HEAD~n

# 將HEAD挪到前一次或前n次提交,索引暫存區(qū)回滾到前一次或前n次提交,工作區(qū)保持不變
$ git reset --mixed HEAD~ 或 git reset HEAD~n

# 將HEAD挪到前一次或前n次提交,索引暫存區(qū)和工作區(qū)都回滾到前一次或前n次提交
$ git reset --hard HEAD~ 或 git reset --hard HEAD~n

參考資料:Git 工具 - 重置揭密

10. 提交查看

# 按提交時間列出所有的更新(會列出每個提交的 SHA-1 校驗和、作者的名字和電子郵件地址、提交時間以及提交說明)
$ git log 

# 顯示每次提交的內(nèi)容差異
$ git log -p

# 可以加上 -1 來僅顯示最近一次提交的內(nèi)容差異
$ git log -p -1

# 顯示每次提交內(nèi)容簡略的統(tǒng)計信息
$ git log --stat

# 只顯示 --stat 中最后的行數(shù)修改添加移除統(tǒng)計
$ git log --shortstat

# 只顯示 --stat 中已修改的文件清單
$ git log --name-only

# --pretty選項可以指定使用不同于默認(rèn)格式的方式展示提交歷史。 比如用 oneline 將每個提交放在一行顯示。 另外還有 short,full 和 fuller 可以用,展示的信息或多或少有些不同
$ git log --pretty=oneline

# 顯示 ASCII 圖形表示的分支合并歷史,常與 git log --pretty 配合使用 git log --pretty=oneline --graph
$ git log --graph

# 僅顯示指定時間之后的提交,例如:git log --since="2019-11-27"
$ git log --since 或 git log --after

# 僅顯示指定時間之前的提交,例如:git log --since="2019-11-27" --until="2019-11-28" 可以查看 2019年11月27日到2019年11月28日之間的提交
$ git log --until 或 git log --before

# 僅顯示指定作者相關(guān)的提交
$ git log --author

# 僅顯示含指定關(guān)鍵字的提交,例如:git log --grep="xxx",或者后面可以直接跟正則表達式,
$ git log --grep

# 僅顯示指定文件或者目錄的歷史提交,-- 告訴 git log 接下來的參數(shù)是文件路徑而不是分支名,如果分支名和文件名不可能沖突,你可以省略 --
$ git log -- <file>

# 顯示那些添加或移除了某些字符串的提交,想找出添加或移除了某一個特定函數(shù)的提交,例如:git log -S "main()"
$ git log -S

# 查看所有分支提交
$ git log --all

#  輸出當(dāng)前分支提交歷史(每次提交一行顯示),--oneline 是 --pretty=oneline --abbrev-commit 合用的簡寫
$ git log --oneline

# 輸出提交歷史、各個分支的指向以及項目的分支分叉情況
$ git log --graph --oneline --all

# 格式化查看提交歷史,--pretty=format
# 常用可選項
#   %H  提交的完整哈希值
#   %h  提交的簡寫哈希值
#   %P  父提交的完整哈希值
#   %p  父提交的簡寫哈希值
#   %an  作者名字
#   %ae  作者的電子郵件地址
#   %ad  作者修訂日期(可以用 --date=選項 來定制格式)
#   %ar  作者修訂日期,按多久以前的方式顯示
#   %cd  提交日期
#   %cr  提交日期(距今多長時間)
#   %s  提交說明
# 例:git log --pretty=format:"%h  %an"
$ git log --pretty=format:“<指定給是>"

參考資料:Git 基礎(chǔ) - 查看提交歷史、Git log 高級用法

11. 分支

# 列出本地的所有分支,當(dāng)前所在分支以 "*" 標(biāo)出
$ git branch

# 列出所有本地分支和遠程分支
$ git branch -a

# 查看每一個分支的最后一次提交
$ git branch -v

# 將所有的本地分支列出來并且包含更多的信息,如每一個分支正在跟蹤哪個遠程分支與本地分支是否是領(lǐng)先、落后或是都有
$ git branch -vv

# 創(chuàng)建本地新分支,新的分支基于前一次提交建立
$ git branch <branch-name>

# 查看已經(jīng)合并到當(dāng)前分支的分支
$ git branch --merged

# 查看所有未合并到當(dāng)前分支的分支
$ git branch --no-merged

# 刪除指定的本地分支
$ git branch -d <branch-name>

# 強制刪除指定的本地分支,例如分支上有改動沒提交或合并刪除需要使用強制刪除
$ git branch -D <branch-name>

# 切換到已存在的指定分支
$ git checkout <branch-name>

# 創(chuàng)建并切換到指定的本地分支
# 等同于 "git branch" 和 "git checkout" 兩個命令合并
$ git checkout -b <branch-name>

# 從遠程跟蹤分支檢出一個本地分支,名字與遠程分支名一樣
$ git checkout --track <remote-name>/<remote-branch-name>

# 從遠程跟蹤分支檢出一個本地分支,名字與遠程分支名可以不一致
$ git checkout -b <local-branch-name> <remote-name>/<local-branch-name>

# 當(dāng)前分支與指定遠程分支建立追蹤關(guān)系,例如:git branch -u origin/develop
$ git branch -u <remote-name>/<remote-branch-name>

# 指定本地分支與遠程分支建立追蹤關(guān)系,例如:git branch --set-upstream-to=origin/develop develop
$ git branch --set-upstream-to=<remote-name>/<remote-branch-name> <local-branch-name>

# 修改本地分支名稱
# 如果不指定原分支名稱則為當(dāng)前所在分支
$ git branch -m <new-branch-name>
# 修改指定分支
$ git branch -m <origin-branch-name> <new-branch-name>
# 強制修改分支名稱
$ git branch -M <origin-branch-name> <new-branch-name>

參考資料:Git 分支 - 遠程分支、Git 分支 - 分支簡介Git 分支 - 分支管理

12. 合并

# 將指定分支合并到當(dāng)前分支,可以用作"快進"合并
$ git merge <branch-name>
# 將某一個分支“變基”合并到當(dāng)前分支
# 實現(xiàn)步驟
# 首先,git 會把當(dāng)前分支里面的每個 commit 取消掉;
# 其次,把上面的操作臨時保存成 patch 文件,存在 .git/rebase 目錄下;
# 然后,把當(dāng)前分支更新到最新的 basebranch 分支;
# 最后,把上面保存的 patch 文件應(yīng)用到當(dāng)前分支上;
$ git rebase <base-branch>

# 將某一個分支“變基”合并到指定分支
$ git rebase <base-branch> <topic-branch>

# 取出 topic-branch 分支,找出它從 exception-branch 分支分歧之后的補丁,然后把這些補丁在 base-branch 分支上重放一遍,讓 topic-branch 看起來像直接基于 base-branch 修改一樣
$ git rebase --onto <base-branch> <exception-branch> <topic-branch>

# 將對應(yīng)的遠程分支“變基”合并到當(dāng)前本地分支
$ git pull --rebase

參考資料:Git 分支 - 分支的新建與合并、Git 分支 - 變基

13. 遠程同步

#  創(chuàng)建遠程分支
$ git push <remote-name> <loacl-branch-name>:<remote-branch-name>

# 將遠程分支與當(dāng)前本地分支建立對應(yīng)關(guān)系
$ git push --set-upstream <remote-name> <remote-branch-name>

# 一步到位創(chuàng)建遠程分支并與本地分支建立對應(yīng)關(guān)系
$ git push -u <remote-name> <loacl-branch-name>:<remote-branch-name>

# 強制將本地差異推送到遠端,讓遠端跟本地保持同步,例如:當(dāng)遠程倉庫比本地更新,可以通過該指令將遠程更新成和本地一樣
$ git push -f <remote-name>
$ git push --force <remote-name>

# 將本地所有分支提交到遠端
$ git push --all

# 刪除遠程分支
$ git push <remote-name> :<remote-branch-name>
$ git push <remote-name> --delete <remote-branch-name>

# 將本地分支修改內(nèi)容推送到對應(yīng)的遠程分支
$ git push <remote-name> <remote-branch-name>

# 從遠程倉庫中獲得數(shù)據(jù),不會自動合并或修改你當(dāng)前的工作
$ git fetch <remote-name>

# 同步遠程分支,例如小伙伴已經(jīng)刪除了 origin/develop這個分支,但是我們本地倉庫還有這個分支,可以執(zhí)行下面指令進行同步
$ git remote prune origin

參考資料:Git 分支 - 遠程分支

14. 標(biāo)簽

# 在最新commit上打上標(biāo)簽,例如:git tag v1.0
$ git tag <tagname>

# 在指定commit上打標(biāo)簽,例如:git tag v1.0 e7bd1d2
$ git tag <tagname> <commit-id>

# 創(chuàng)建帶有說明的標(biāo)簽,用-a指定標(biāo)簽名,-m指定說明文字,例如:git tag -a v1.0 -m "version 1.0" e7bd1d2
$ git tag -a <tagname> -m <tag description> <commit-id>

# 將本地標(biāo)簽同步到遠程,例如:git push origin v1.0
$ git push <remote-name> <tagname>

# 一次性推送全部尚未推送到遠程的本地標(biāo)簽
$ git push <remote-name> --tags

# 刪除本地標(biāo)簽,例如:git tag -d v1.0
$ git tag -d <tagname>

# 刪除遠程標(biāo)簽,例如:git push origin :refs/tags/v1.0
$ git push <remote-name> :refs/tags/<tagname>

# 查看所有的標(biāo)簽,按字母排序
$ git tag

# 查看指定標(biāo)簽信息
$ git show <tagname>

參考資料:Git 基礎(chǔ) - 打標(biāo)簽

15. 別名配置

# 為指定命令設(shè)置一個別名,例如:git config --global alias.co checkout
$ git config --global alias.<alias> <order>

# 修改指定別名對應(yīng)的命令,例如:git config --global alias.co 'commit'
$ git config --global alias.<alias> '<order>'

可以直接在 ~/.gitconfig 文件中將其設(shè)置別名,我的別名設(shè)置如下

[alias]
    st = status -s
    lg = log --graph --oneline --abbrev-commit
    lga = log --graph --oneline --decorate --all
    sbi = submodule init
    sbu = submodule update
    sbuir = submodule update --init --recursive
    crsb = clone --recurse-submodules
    sbst = git submodule status
    renameTag = "!sh -c 'set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags' -"

參考資料:Git 基礎(chǔ) - Git 別名

16. 配置

# 全局配置git提交用戶名,該配置將會被寫到~/.gitconfig文件里面
$ git config --global user.name "John Doe"

# 全局配置git提交用戶郵箱,該配置將會被寫到~/.gitconfig文件里面
$ git config --global user.email johndoe@example.com

# 項目里面配置git提價用戶名,該配置將會被寫到項目目錄下的.git/config文件里面
$ git config user.name "John Doe"

# 項目里面配置git提交用戶郵箱,該配置將會被寫到項目目錄下的.git/config文件里面
$ git config user.email johndoe@example.com

Git使用一系列配置文件來保存你自定義的行為。 它首先會查找系統(tǒng)級的/etc/gitconfig文件,該文件含有系統(tǒng)里每位用戶及他們所擁有的倉庫的配置值。 如果傳遞--system選項給git config,它就會讀寫該文件。
接下來Git會查找每個用戶的~/.gitconfig文件(或者~/.config/git/config文件)。 可以傳遞--global選項讓Git讀寫該文件。
最后Git會查找你正在操作的倉庫所對應(yīng)的Git目錄下的配置文件(.git/config)。 這個文件中的值只對該倉庫有效,它對應(yīng)于向git config傳遞--local選項。
以上三個層次中每層的配置(系統(tǒng)、全局、本地)都會覆蓋掉上一層次的配置,所以.git/config中的值會覆蓋掉/etc/gitconfig中所對應(yīng)的值。
參考資料:自定義 Git - 配置 Git

17. 其它

# 查看最近 HEAD 和分支引用所指向的歷史
$ git reflog

# 查看引用日志信息
$ git log -g

# 查看上一個提交,也就是 “HEAD 的父提交”
$ git show HEAD^

# 操作或查看指定目錄下的倉庫,例如查看指定目錄倉庫log:git -C ~/Desktop/Demo log
$ git -C <local-repository-path> <cmd>

參考資料:Git 工具 - 選擇修訂版本

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容