Git實用技巧及命令匯總

\color{rgb(26, 177, 204)}{1澳厢、新建}

創(chuàng)建一個新的 git 版本庫驼抹。這個版本庫的配置毙驯、存儲等信息會被保存到.git 文件夾中

# 初始化當(dāng)前項目
$ git init

# 新建一個目錄柱锹,將其初始化為Git代碼庫
$ git init [project-name]

# 在指定目錄創(chuàng)建一個空的 Git 倉庫哪自。運行這個命令會創(chuàng)建一個名為 directory,只包含 .git 子目錄的空目錄禁熏。

$ git init --bare <directory>

# 下載一個項目和它的整個代碼歷史
# 這個命令就是將一個版本庫拷貝到另一個目錄中壤巷,同時也將分支都拷貝到新的版本庫中。這樣就可以在新的版本庫中提交到遠程分支
$ git clone [url]

\color{rgb(26, 177, 204)}{2瞧毙、配置}

更改設(shè)置胧华〖闹ⅲ可以是版本庫的設(shè)置,也可以是系統(tǒng)的或全局的

# 顯示當(dāng)前的Git配置
$ git config --list

# 編輯Git配置文件
$ git config -e [--global]

# 輸出矩动、設(shè)置基本的全局變量
$ git config --global user.email
$ git config --global user.name

$ git config --global user.email "MyEmail@gmail.com"
$ git config --global user.name "My Name"

# 定義當(dāng)前用戶所有提交使用的作者郵箱有巧。
$ git config --global alias.<alias-name> <git-command>

# 為Git命令創(chuàng)建一個快捷方式(別名)。
$ git config --system core.editor <editor>

\color{rgb(26, 177, 204)}{3悲没、幫助}

git 內(nèi)置了對命令非常詳細的解釋篮迎,可以供我們快速查閱

# 查找可用命令
$ git help

# 查找所有可用命令
$ git help -a

# 在文檔當(dāng)中查找特定的命令
# git help <命令>
$ git help add
$ git help commit
$ git help init

\color{rgb(26, 177, 204)}{4、狀態(tài)}

顯示索引文件(也就是當(dāng)前工作空間)和當(dāng)前的頭指針指向的提交的不同

# 顯示分支示姿,未跟蹤文件甜橱,更改和其他不同
$ git status

# 查看其他的git status的用法
$ git help status

\color{rgb(26, 177, 204)}{5、信息}

獲取某些文件栈戳,某些分支岂傲,某次提交等 git 信息

# 顯示commit歷史,以及每次commit發(fā)生變更的文件
$ git log --stat

# 搜索提交歷史子檀,根據(jù)關(guān)鍵詞
$ git log -S [keyword]

# 顯示某個commit之后的所有變動镊掖,每個commit占據(jù)一行
$ git log [tag] HEAD --pretty=format:%s

# 顯示某個commit之后的所有變動,其"提交說明"必須符合搜索條件
$ git log [tag] HEAD --grep feature

# 顯示某個文件的版本歷史褂痰,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

# 顯示指定文件相關(guān)的每一次diff
$ git log -p [file]

# 顯示過去5次提交
$ git log -5 --pretty --oneline

# 顯示所有提交過的用戶堰乔,按提交次數(shù)排序
$ git shortlog -sn

# 顯示指定文件是什么人在什么時間修改過
$ git blame [file]

# 顯示暫存區(qū)和工作區(qū)的差異
$ git diff

# 顯示暫存區(qū)和上一個commit的差異
$ git diff --cached [file]

# 顯示工作區(qū)與當(dāng)前分支最新commit之間的差異
$ git diff HEAD

# 顯示兩次提交之間的差異
$ git diff [first-branch]...[second-branch]

# 顯示今天你寫了多少行代碼
$ git diff --shortstat "@{0 day ago}"

# 比較暫存區(qū)和版本庫差異
$ git diff --staged

# 比較暫存區(qū)和版本庫差異
$ git diff --cached

# 僅僅比較統(tǒng)計信息
$ git diff --stat

# 顯示某次提交的元數(shù)據(jù)和內(nèi)容變化
$ git show [commit]

# 顯示某次提交發(fā)生變化的文件
$ git show --name-only [commit]

# 顯示某次提交時,某個文件的內(nèi)容
$ git show [commit]:[filename]

# 顯示當(dāng)前分支的最近幾次提交
$ git reflog

# 查看遠程分支
$ git br -r

# 創(chuàng)建新的分支
$ git br <new_branch>

# 查看各個分支最后提交信息
$ git br -v

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

# 查看尚未被合并到當(dāng)前分支的分支
$ git br --no-merged

\color{rgb(26, 177, 204)}{6脐恩、添加}

添加文件到當(dāng)前工作空間中。如果你不使用 git add 將文件添加進去侦讨,那么這些文件也不會添加到之后的提交之中

# 添加一個文件
$ git add test.js

# 添加一個子目錄中的文件
$ git add /path/to/file/test.js

# 支持正則表達式
$ git add ./*.js

# 添加指定文件到暫存區(qū)
$ git add [file1] [file2] ...

# 添加指定目錄到暫存區(qū)驶冒,包括子目錄
$ git add [dir]

# 添加當(dāng)前目錄的所有文件到暫存區(qū)
$ git add .

# 添加每個變化前,都會要求確認
# 對于同一個文件的多處變化韵卤,可以實現(xiàn)分次提交
$ git add -p

\color{rgb(26, 177, 204)}{7骗污、刪除}

rm 和上面的 add 命令相反,從工作空間中去掉某個文件

# 移除 HelloWorld.js
$ git rm HelloWorld.js

# 移除子目錄中的文件
$ git rm /pather/to/the/file/HelloWorld.js

# 刪除工作區(qū)文件沈条,并且將這次刪除放入暫存區(qū)
$ git rm [file1] [file2] ...

# 停止追蹤指定文件需忿,但該文件會保留在工作區(qū)
$ git rm --cached [file]

\color{rgb(26, 177, 204)}{8、分支}

管理分支蜡歹,可以通過下列命令對分支進行增刪改查切換等

# 查看所有的分支和遠程分支
$ git branch -a

# 創(chuàng)建一個新的分支
$ git branch [branch-name]

# 重命名分支
# git branch -m <舊名稱> <新名稱>
$ git branch -m [branch-name] [new-branch-name]

# 編輯分支的介紹
$ git branch [branch-name] --edit-description

# 列出所有本地分支
$ git branch

# 列出所有遠程分支
$ git branch -r

# 新建一個分支屋厘,但依然停留在當(dāng)前分支
$ git branch [branch-name]

# 新建一個分支,并切換到該分支
$ git checkout -b [branch]

# 新建一個分支月而,指向指定commit
$ git branch [branch] [commit]

# 新建一個分支汗洒,與指定的遠程分支建立追蹤關(guān)系
$ git branch --track [branch] [remote-branch]

# 切換到指定分支,并更新工作區(qū)
$ git checkout [branch-name]

# 切換到上一個分支
$ git checkout -

# 建立追蹤關(guān)系父款,在現(xiàn)有分支與指定的遠程分支之間
$ git branch --set-upstream [branch] [remote-branch]

# 合并指定分支到當(dāng)前分支
$ git merge [branch]

# 選擇一個commit溢谤,合并進當(dāng)前分支
$ git cherry-pick [commit]

# 刪除分支
$ git branch -d [branch-name]

# 刪除遠程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

# 切換到某個分支
$ git co <branch>

# 創(chuàng)建新的分支瞻凤,并且切換過去
$ git co -b <new_branch>

# 基于branch創(chuàng)建新的new_branch
$ git co -b <new_branch> <branch>

# 把某次歷史提交記錄checkout出來,但無分支信息世杀,切換到其他分支會自動刪除
$ git co $id

# 把某次歷史提交記錄checkout出來阀参,創(chuàng)建成一個分支
$ git co $id -b <new_branch>

# 刪除某個分支
$ git br -d <branch>

# 強制刪除某個分支 (未被合并的分支被刪除的時候需要強制)
$ git br -D <branch>

\color{rgb(26, 177, 204)}{9、檢出}

將當(dāng)前工作空間更新到索引所標識的或者某一特定的工作空間

# 檢出一個版本庫瞻坝,默認將更新到master分支
$ git checkout
# 檢出到一個特定的分支
$ git checkout branchName
# 新建一個分支蛛壳,并且切換過去,相當(dāng)于"git branch <名字>; git checkout <名字>"
$ git checkout -b newBranch

\color{rgb(26, 177, 204)}{10湿镀、遠程同步}

遠程同步的遠端分支

# 下載遠程倉庫的所有變動
$ git fetch [remote]

# 顯示所有遠程倉庫
$ git remote -v

# 顯示某個遠程倉庫的信息
$ git remote show [remote]

# 增加一個新的遠程倉庫炕吸,并命名
$ git remote add [shortname] [url]

# 查看遠程服務(wù)器地址和倉庫名稱
$ git remote -v

# 添加遠程倉庫地址
$ git remote add origin git@ github:xxx/xxx.git

# 設(shè)置遠程倉庫地址(用于修改遠程倉庫地址)
$ git remote set-url origin git@ github.com:xxx/xxx.git

# 刪除遠程倉庫
$ git remote rm <repository>

# 上傳本地指定分支到遠程倉庫
# 把本地的分支更新到遠端origin的master分支上
# git push <遠端> <分支>
# git push 相當(dāng)于 git push origin master
$ git push [remote] [branch]

# 強行推送當(dāng)前分支到遠程倉庫,即使有沖突
$ git push [remote] --force

# 推送所有分支到遠程倉庫
$ git push [remote] --all

\color{rgb(26, 177, 204)}{11勉痴、撤銷}

# 恢復(fù)暫存區(qū)的指定文件到工作區(qū)
$ git checkout [file]

# 恢復(fù)某個commit的指定文件到暫存區(qū)和工作區(qū)
$ git checkout [commit] [file]

# 恢復(fù)暫存區(qū)的所有文件到工作區(qū)
$ git checkout .

# 重置暫存區(qū)的指定文件赫模,與上一次commit保持一致,但工作區(qū)不變
$ git reset [file]

# 重置暫存區(qū)與工作區(qū)蒸矛,與上一次commit保持一致
$ git reset --hard

# 重置當(dāng)前分支的指針為指定commit瀑罗,同時重置暫存區(qū),但工作區(qū)不變
$ git reset [commit]

# 重置當(dāng)前分支的HEAD為指定commit雏掠,同時重置暫存區(qū)和工作區(qū)斩祭,與指定commit一致
$ git reset --hard [commit]

# 重置當(dāng)前HEAD為指定commit,但保持暫存區(qū)和工作區(qū)不變
$ git reset --keep [commit]

# 新建一個commit乡话,用來撤銷指定commit
# 后者的所有變化都將被前者抵消摧玫,并且應(yīng)用到當(dāng)前分支
$ git revert [commit]

# 恢復(fù)最后一次提交的狀態(tài)
$ git revert HEAD

# 暫時將未提交的變化移除,稍后再移入
$ git stash
$ git stash pop

# 列所有stash
$ git stash list

# 恢復(fù)暫存的內(nèi)容
$ git stash apply

# 刪除暫存區(qū)
$ git stash drop

\color{rgb(26, 177, 204)}{12绑青、commit}

將當(dāng)前索引的更改保存為一個新的提交诬像,這個提交包括用戶做出的更改與信息

# 提交暫存區(qū)到倉庫區(qū)附帶提交信息
$ git commit -m [message]

# 提交暫存區(qū)的指定文件到倉庫區(qū)
$ git commit [file1] [file2] ... -m [message]

# 提交工作區(qū)自上次commit之后的變化,直接到倉庫區(qū)
$ git commit -a

# 提交時顯示所有diff信息
$ git commit -v

# 使用一次新的commit闸婴,替代上一次提交
# 如果代碼沒有任何新變化坏挠,則用來改寫上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新變化
$ git commit --amend [file1] [file2] ...

\color{rgb(26, 177, 204)}{13邪乍、diff}

顯示當(dāng)前工作空間和提交的不同

# 顯示工作目錄和索引的不同
$ git diff

# 顯示索引和最近一次提交的不同
$ git diff --cached

# 顯示工作目錄和最近一次提交的不同
$ git diff HEAD

\color{rgb(26, 177, 204)}{14降狠、grep}

可以在版本庫中快速查找
可選配置:

# 感謝Travis Jeffery提供的以下用法:
# 在搜索結(jié)果中顯示行號
$ git config --global grep.lineNumber true

# 是搜索結(jié)果可讀性更好
$ git config --global alias.g "grep --break --heading --line-number"# 在所有的java中查找variableName
$ git grep 'variableName' -- '*.java'

# 搜索包含 "arrayListName" 和, "add" 或 "remove" 的所有行
$ git grep -e 'arrayListName' --and \( -e add -e remove \)

\color{rgb(26, 177, 204)}{15、log}

顯示這個版本庫的所有提交

# 顯示所有提交
$ git log

# 顯示某幾條提交信息
$ git log -n 10

# 僅顯示合并提交
$ git log --merges

# 查看該文件每次提交記錄
$ git log <file>

# 查看每次詳細修改內(nèi)容的diff
$ git log -p <file>

# 查看最近兩次詳細修改內(nèi)容的diff
$ git log -p -2

#查看提交統(tǒng)計信息
$ git log --stat

\color{rgb(26, 177, 204)}{16庇楞、merge}

合并就是將外部的提交合并到自己的分支中

# 將其他分支合并到當(dāng)前分支
$ git merge branchName

# 在合并時創(chuàng)建一個新的合并后的提交
# 不要 Fast-Foward 合并榜配,這樣可以生成 merge 提交
$ git merge --no-ff branchName

\color{rgb(26, 177, 204)}{17、mv}

重命名或移動一個文件

# 重命名
$ git mv test.js test2.js

# 移動
$ git mv test.js ./new/path/test.js

# 改名文件吕晌,并且將這個改名放入暫存區(qū)
$ git mv [file-original] [file-renamed]

# 強制重命名或移動
# 這個文件已經(jīng)存在芥牌,將要覆蓋掉
$ git mv -f myFile existingFile

\color{rgb(26, 177, 204)}{18、tag}

# 列出所有tag
$ git tag

# 新建一個tag在當(dāng)前commit
$ git tag [tag]

# 新建一個tag在指定commit
$ git tag [tag] [commit]

# 刪除本地tag
$ git tag -d [tag]

# 刪除遠程tag
$ git push origin :refs/tags/[tagName]

# 查看tag信息
$ git show [tag]

# 提交指定tag
$ git push [remote] [tag]

# 提交所有tag
$ git push [remote] --tags

# 新建一個分支聂使,指向某個tag
$ git checkout -b [branch] [tag]

\color{rgb(26, 177, 204)}{19壁拉、pull}

從遠端版本庫合并到當(dāng)前分支

# 從遠端origin的master分支更新版本庫
# git pull <遠端> <分支>
$ git pull origin master

# 抓取遠程倉庫所有分支更新并合并到本地谬俄,不要快進合并
$ git pull --no-ff

\color{rgb(26, 177, 204)}{20、ci}

$ git ci <file>
$ git ci .
# 將git add, git rm和git ci等操作都合并在一起做
$ git ci -a
$ git ci -am "some comments"
# 修改最后一次提交記錄
$ git ci --amend

\color{rgb(26, 177, 204)}{21弃理、rebase (謹慎使用)}

將一個分支上所有的提交歷史都應(yīng)用到另一個分支上
不要在一個已經(jīng)公開的遠端分支上使用 rebase.

# 將experimentBranch應(yīng)用到master上面
# git rebase <basebranch> <topicbranch>
$ git rebase master experimentBranch

\color{rgb(26, 177, 204)}{22溃论、reset (謹慎使用)}

將當(dāng)前的頭指針復(fù)位到一個特定的狀態(tài)。這樣可以使你撤銷 merge痘昌、pull钥勋、commits、add 等
這是個很強大的命令辆苔,但是在使用時一定要清楚其所產(chǎn)生的后果算灸。

# 使 staging 區(qū)域恢復(fù)到上次提交時的狀態(tài),不改變現(xiàn)在的工作目錄
$ git reset

# 使 staging 區(qū)域恢復(fù)到上次提交時的狀態(tài)驻啤,覆蓋現(xiàn)在的工作目錄
$ git reset --hard

# 將當(dāng)前分支恢復(fù)到某次提交菲驴,不改變現(xiàn)在的工作目錄
# 在工作目錄中所有的改變?nèi)匀淮嬖?$ git reset dha78as

# 將當(dāng)前分支恢復(fù)到某次提交,覆蓋現(xiàn)在的工作目錄
# 并且刪除所有未提交的改變和指定提交之后的所有提交
$ git reset --hard dha78as

\color{rgb(26, 177, 204)}{23骑冗、其他}

# 生成一個可供發(fā)布的壓縮包
$ git archive

# 打補丁
$ git apply ../sync.patch

# 測試補丁能否成功
$ git apply --check ../sync.patch

# 查看Git的版本
$ git --version
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赊瞬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贼涩,更是在濱河造成了極大的恐慌巧涧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遥倦,死亡現(xiàn)場離奇詭異谤绳,居然都是意外死亡,警方通過查閱死者的電腦和手機袒哥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門缩筛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人统诺,你說我怎么就攤上這事∫杉螅” “怎么了粮呢?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钞艇。 經(jīng)常有香客問我啄寡,道長,這世上最難降的妖魔是什么哩照? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任挺物,我火速辦了婚禮,結(jié)果婚禮上飘弧,老公的妹妹穿的比我還像新娘识藤。我一直安慰自己砚著,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布痴昧。 她就那樣靜靜地躺著稽穆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赶撰。 梳的紋絲不亂的頭發(fā)上舌镶,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音豪娜,去河邊找鬼餐胀。 笑死,一個胖子當(dāng)著我的面吹牛瘤载,可吹牛的內(nèi)容都是我干的否灾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼惕虑,長吁一口氣:“原來是場噩夢啊……” “哼坟冲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起溃蔫,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤健提,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伟叛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體私痹,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年统刮,在試婚紗的時候發(fā)現(xiàn)自己被綠了紊遵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡侥蒙,死狀恐怖暗膜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鞭衩,我是刑警寧澤学搜,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站论衍,受9級特大地震影響瑞佩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坯台,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一炬丸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜒蕾,春花似錦稠炬、人聲如沸焕阿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捣鲸。三九已至,卻和暖如春闽坡,著一層夾襖步出監(jiān)牢的瞬間栽惶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工疾嗅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留外厂,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓代承,卻偏偏與公主長得像熬尺,于是被迫代替她去往敵國和親旁振。 傳聞我的和親對象是個殘疾皇子嫂伞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容