專有名詞
名稱 | 解釋 |
---|---|
workspace | 工作區(qū) |
index(或stage) | 暫存區(qū) |
repository | 倉(cāng)庫(kù)區(qū)(或本地倉(cāng)庫(kù)) |
remote | 遠(yuǎn)程倉(cāng)庫(kù) |
新建代碼庫(kù)
命令 | 解釋 |
---|---|
git init |
在當(dāng)前目錄新建一個(gè)git代碼庫(kù) |
git init [project-name] |
新建一個(gè)目錄,將其初始化為git代碼庫(kù) |
git clone [url] |
下載一個(gè)項(xiàng)目到本地 |
配置
Git的設(shè)置文件為.gitconfig,它可以在用戶主目錄下(全局配置)类溢,也可以在項(xiàng)目目錄下(項(xiàng)目配置)烫沙。
命令 | 解釋 |
---|---|
git config [--global] user.name "x00354221" |
配置用戶名 |
git config [--global] user.email "xiaoxiang5@huawei.com" |
配置郵箱 |
git config --global core.autocrlf false |
防止自動(dòng)轉(zhuǎn)換\r\n和\n |
git config --global core.safecrlf true |
拒絕提交包含混合換行符的文件霎箍,防止\n和\r\n混用 |
git config --global core.editor "notepad++.exe -multiInst -notabbar -nosession -noPlugin" |
默認(rèn)編輯器設(shè)置為notepad++祈匙,需要將notepad++所在位置加到path里 |
git config --global i18n.commitencoding utf-8 |
設(shè)置在使用git commit命令時(shí)可以輸入中文 |
git config --global i18n.logoutputencoding utf-8 |
設(shè)置在使用git log命令時(shí)可以顯示中文日志 |
export LESSCHARSET=utf-8 |
git設(shè)置后還需要設(shè)置LESS字符集為utf-8,之后才能正常顯示中文 |
git config --global core.quotepath false |
windows環(huán)境下鲜侥,設(shè)置執(zhí)行g(shù)it diff命令時(shí)正確顯示中文路徑名 |
git config --global color.ui true |
讓Git顯示顏色褂始,會(huì)讓命令輸出看起來(lái)更醒目 |
git config --global alias.st status |
命令簡(jiǎn)寫,用git st表示git status |
git config --global alias.co checkout |
命令簡(jiǎn)寫描函,用co表示checkout |
git config --global alias.ci commit |
命令簡(jiǎn)寫崎苗,ci表示commit |
git config --global alias.br branch |
命令簡(jiǎn)寫,br表示branch |
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" |
lg配置成快速查看合入圖表 |
git config --list |
顯示當(dāng)前的Git配置 |
git config --local -l |
顯示當(dāng)前項(xiàng)目配置舀寓,配置文件位于當(dāng)前項(xiàng)目.git\config目錄下 |
git config --global -l |
顯示當(dāng)前全局配置胆数,配置文件位于用戶目錄下的.gitconfig |
git config --system -l |
顯示當(dāng)前系統(tǒng)配置,配置文件位于以下兩個(gè)地方:C:\ProgramData\Git\ 和 C:\Program Files\Git\mingw64\etc
|
git config -e [--global 或 local 或 system] |
通過(guò)編輯器的方式修改git配置文件 |
git config --global core.editor vim |
修改默認(rèn)編輯器為vim |
git config -l --show-origin |
查看所有配置互墓,對(duì)應(yīng)配置所在的配置文件及其位置 |
git config --[local 或 global 或 system] --unset 配置名 |
刪除[local 或 global 或 system]中的某項(xiàng)配置 |
增加/刪除文件
命令 | 解釋 |
---|---|
git add [file1] [file2] … |
添加指定文件到暫存區(qū) |
git add [dir] |
添加指定目錄到暫存區(qū)必尼,包括子目錄 |
git add . |
添加當(dāng)前目錄的所有文件到暫存區(qū) |
git add -u |
只add修改和刪除文件,不add新增文件 |
git add --ignore-removal . |
只add新增和修改文件篡撵,不add刪除文件 |
git add -p |
添加每個(gè)變化前判莉,都會(huì)要求確認(rèn),對(duì)于同一個(gè)文件的多處變化酸休,可以實(shí)現(xiàn)分次提交 |
git add … -n |
只顯示會(huì)add的文件骂租,但實(shí)際不會(huì)添加 |
git add . -u |
添加所有文件,但忽略未追蹤的文件 |
git rm [file1] [file2] … |
刪除工作區(qū)文件斑司,并且將這次刪除放入暫存區(qū) |
git rm --cached [file] |
停止追蹤指定文件渗饮,但該文件會(huì)保留在工作區(qū) |
git rm -r [dir-name] |
刪除文件夾 |
git mv [file-original] [file-renamed] |
改名文件,并且將這個(gè)改名放入暫存區(qū) |
代碼提交
命令 | 解釋 |
---|---|
git commit -m [message] |
提交暫存區(qū)到倉(cāng)庫(kù)區(qū) |
git commit [file1] [file2] ... -m [message] |
提交暫存區(qū)的指定文件到倉(cāng)庫(kù)區(qū) |
git commit -a |
提交工作區(qū)自上次commit之后的變化宿刮,直接到倉(cāng)庫(kù)區(qū) |
git commit -v |
提交時(shí)顯示所有diff信息 |
git commit --amend -m [message] |
使用一次新的commit互站,替代上一次提交,如果代碼沒有任何新變化僵缺,則用來(lái)改寫上一次commit的提交信息 |
git commit --amend [--no-edit] [file1] [file2] … |
重做上一次commit胡桃,并包括指定文件的新變化 如果加上--no-edit選項(xiàng),則不修改注釋磕潮,否則提交時(shí)需要更新注釋 |
git commit --allow-empt |
允許commit的時(shí)候不附帶注釋(不推薦使用) |
分支管理
命令 | 解釋 |
---|---|
git switch [branch-name] |
切換到指定分支翠胰,并更新工作區(qū) |
git switch -c [branch-name] |
新建一個(gè)分支,并切換到該分支 |
git switch - |
切換到上一個(gè)分支 |
git branch -m <舊名稱> <新名稱> |
重命名分支 |
git branch |
列出所有本地分支 |
git branch -r |
列出所有遠(yuǎn)程分支 |
git branch -a |
列出所有本地分支和遠(yuǎn)程分支 |
git branch [branch-name] |
新建一個(gè)分支自脯,但依然停留在當(dāng)前分支 |
git branch [branch] [commit] |
新建一個(gè)分支之景,指向指定commit |
git branch --track [branch] [remote-branch] |
新建一個(gè)分支,與指定的遠(yuǎn)程分支建立追蹤關(guān)系 |
git branch --set-upstream [branch] [remote-branch] |
建立追蹤關(guān)系膏潮,在現(xiàn)有分支與指定的遠(yuǎn)程分支之間 |
git cherry-pick [commit] |
選擇一個(gè)commit锻狗,合并進(jìn)當(dāng)前分支 |
git branch -d [branch-name] |
刪除本地分支(如果沒有完全合并會(huì)失敗) |
git branch -D [branch-name] |
刪除本地分支(強(qiáng)制刪除) |
git branch -dr [remote/branch] |
刪除遠(yuǎn)程分支(只刪除本地記錄的遠(yuǎn)端信息,分支在遠(yuǎn)端實(shí)際還存在) |
git push --delete [branch-name] |
刪除遠(yuǎn)程分支(會(huì)真正刪除遠(yuǎn)端保存的分支) |
git merge [branch] |
合并指定分支到當(dāng)前分支 |
git merge --squash [branch] |
將branch中多筆commit造成的差異合成一筆合入當(dāng)前分支的工作區(qū)轻纪,提交后會(huì)產(chǎn)生一筆新的節(jié)點(diǎn) |
git merge --no-ff -m "there is a comment" <name> |
--no-off 保存之前的分支merge歷史油额,否則分支上的commit記錄會(huì)合并到當(dāng)前分支。 |
git fetch --all git reset --hard [remote]/[branch] git push -f
|
強(qiáng)制覆蓋遠(yuǎn)端分支刻帚,本地先同步到指定節(jié)點(diǎn)潦嘶,再?gòu)?qiáng)制覆蓋遠(yuǎn)端分支 |
git branch [branch-name] --edit-description |
添加分支注釋 |
git config branch.[branch-name].description |
查看分支注釋 |
標(biāo)簽
命令 | 解釋 |
---|---|
git tag |
列出所有tag,按照字母序我擂,而不是時(shí)間序 |
git tag [tag] |
新建一個(gè)tag在當(dāng)前commit |
git tag [tag] [commit] |
新建一個(gè)tag在指定commit |
git tag -d [tag] |
刪除本地tag |
git log --pretty=oneline --abbrev-commit |
查看tag和commit的對(duì)應(yīng)關(guān)系衬以,可以用 |
git show <tagname> |
查看tag的的詳細(xì)情況 |
git push origin :refs/tags/[tagName] |
刪除遠(yuǎn)程tag缓艳,前提是已經(jīng)刪除了本地tag |
git show [tag] |
查看tag的詳細(xì)信息 |
git push [remote] [tag] |
提交指定tag |
git push [remote] --tags |
提交所有tag |
git checkout -b [branch] [tag] |
新建一個(gè)分支校摩,指向某個(gè)tag |
查看信息
命令 | 解釋 |
---|---|
git status |
顯示有變更的文件 |
git log |
顯示當(dāng)前分支的版本歷史 |
git log --stat |
顯示commit歷史,以及每次commit發(fā)生變更的文件 |
git log -S [keyword] |
搜索提交歷史阶淘,根據(jù)關(guān)鍵詞 |
git log [tag] HEAD --pretty=format:%s |
顯示某個(gè)commit之后的所有變動(dòng)衙吩,每個(gè)commit占據(jù)一行 |
git log [tag] HEAD --grep feature |
顯示某個(gè)commit之后的所有變動(dòng),其"提交說(shuō)明"必須符合搜索條件 |
git log --follow [file] |
顯示某個(gè)文件的版本歷史溪窒,包括文件改名 |
git log -p [file] |
顯示指定文件相關(guān)的每一次diff |
git log --oneline git log --pretty=oneline --abbrev-commit
|
顯示過(guò)去提交坤塞,每條只顯示一行信息,ID只顯示前幾位 |
git log --pretty=oneline |
顯示過(guò)去提交澈蚌,每條只顯示一行信息摹芙,ID完整顯示 |
git log --decorate --graph --oneline --all |
顯示當(dāng)前及之前的版本號(hào) |
git log --graph |
顯示分支合并圖 |
git log --author="userName" |
列出指定用戶的上庫(kù)記錄 |
git log --merges |
僅顯示合并提交 |
git show --name-only [commit] |
顯示某次提交發(fā)生變化的文件 |
git show [commit]:[filename] git show [commit] [filename]
|
顯示某次提交時(shí),某個(gè)文件的內(nèi)容 |
git log --follow [file] git whatchanged [file]
|
顯示某個(gè)文件的版本歷史宛瞄,包括文件改名 |
git shortlog -sn |
顯示所有提交過(guò)的用戶浮禾,按提交次數(shù)排序 |
git blame [file] |
顯示指定文件是什么人在什么時(shí)間修改過(guò) |
git reflog |
本地保存的git詳細(xì)操作日志,可以通過(guò)reflog找到所有針對(duì)分支的操作 |
git rev-parse [--short=N] HEAD |
查詢當(dāng)前HEAD節(jié)點(diǎn)的commit號(hào)份汗,長(zhǎng)度由N指定盈电,如果不指定長(zhǎng)度,則默認(rèn)值是core.abbrev變量的值 |
遠(yuǎn)程同步
命令 | 解釋 |
---|---|
git fetch [remote] |
下載遠(yuǎn)程倉(cāng)庫(kù)的所有變動(dòng) |
git remote -v |
顯示所有遠(yuǎn)程倉(cāng)庫(kù) |
git remote show [remote] [branch] |
顯示某個(gè)遠(yuǎn)程倉(cāng)庫(kù)的信息 |
git remote add [shortname] [url] |
增加一個(gè)新的遠(yuǎn)程倉(cāng)庫(kù)杯活,并命名 |
git remote rm <repository> |
刪除遠(yuǎn)程倉(cāng)庫(kù) |
git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名> |
同步遠(yuǎn)程倉(cāng)庫(kù)到本地匆帚,如果是合并的是當(dāng)前分支,則可以不寫本地分支名 |
git pull [remote] [branch] |
取回遠(yuǎn)程倉(cāng)庫(kù)的變化旁钧,并與本地分支合并 |
git push [remote] [branch] |
上傳本地指定分支到遠(yuǎn)程倉(cāng)庫(kù) |
git push [remote] --force |
強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù)吸重,即使有沖突 |
git push [remote] --all |
推送所有分支到遠(yuǎn)程倉(cāng)庫(kù) |
git push 遠(yuǎn)端倉(cāng) 本地分支名:遠(yuǎn)端分支名 |
將本地當(dāng)前分支推送到指定的遠(yuǎn)端分支,如果遠(yuǎn)端無(wú)此分支歪今,則會(huì)新建一個(gè)嚎幸。 |
git push --set-upstream 分支 |
將本地分支和遠(yuǎn)端分支關(guān)聯(lián) |
撤銷刪除
命令 | 解釋 |
---|---|
git restore --staged [file 或 .] |
恢復(fù)暫存區(qū)的指定文件或所有文件到工作區(qū) |
git restore --worktree [file 或 .] |
撤銷工作區(qū)指定文件或所有文件的改動(dòng) |
git reset --[hard 或 soft 或 mixed] CommitId |
重置暫存區(qū)與工作區(qū),與上一次commit保持一致彤委。 Hard:源碼也會(huì)回退到某個(gè)版本,commit和index 都回回退到某個(gè)版本 Soft:保留源碼,不涉及index的回退,相當(dāng)于執(zhí)行了git add的效果鞭铆,版本間的差異都存在暫存區(qū)。 Mixed:保留源碼,將git commit和index 信息回退到了某個(gè)版本.相當(dāng)于版本間的差異都存在了工作區(qū) |
git reset --hard [HEAD^ or HEAD~1] |
回退到上一個(gè)版本 |
git reset --hard [HEAD^^ or HEAD~2] |
回退到上上個(gè)版本,以此類推车遂,一次提交即為一個(gè)版本 |
git reset --hard e9efa77 |
回退到 e9efa77 版本 |
git reset [commit] |
重置當(dāng)前分支的指針為指定commit封断,同時(shí)重置暫存區(qū),但工作區(qū)不變 |
git reset --keep [commit] |
重置當(dāng)前HEAD為指定commit舶担,但保持暫存區(qū)和工作區(qū)不變 |
git clean -f |
刪除未Track的文件 |
git clean -fd |
刪除未Track的文件和目錄 |
git clean -xfd |
連 gitignore 的untrack 文件/目錄也一起刪掉 (慎用坡疼,一般這個(gè)是用來(lái)刪掉編譯出來(lái)的 .o之類的文件用的) |
git clean -n |
顯示要?jiǎng)h除的文件,但實(shí)際不會(huì)刪除 |
git revert [commit] |
新建一個(gè)commit衣陶,回退所有指定commit合入的修改柄瑰,并主動(dòng)提交commit |
git revert -n [commit] |
回退指定的commit修改,但不主動(dòng)提交commit剪况,差異存在暫存區(qū) |
git revert -m [1 或 2] [commit] |
如果要回退的是merge節(jié)點(diǎn)教沾,則需要選擇具體回退的分支,一般默認(rèn)是1 |
git stash |
暫時(shí)將工作區(qū)內(nèi)未提交的變化壓棧 |
git stash [save "message"] |
暫時(shí)將未提交的變化移除译断,稍后再移入授翻。[message]是需要加的注釋 |
git stash pop [--index] [stash_id] |
將未提交的變化出棧, |
git stash pop --index |
如下為恢復(fù)最新的進(jìn)度到工作區(qū)和暫存區(qū)(嘗試將暫存區(qū)的改動(dòng)恢復(fù)到暫存區(qū)) |
git stash pop -u |
將新增文件也暫存 |
git stash apply [--index] [stash_id] |
將堆棧中的內(nèi)容應(yīng)用到當(dāng)前目錄孙咪,不同于git stash pop堪唐,該命令不會(huì)將內(nèi)容從堆棧中刪除 |
git stash list |
查看所有壓棧的變化列表 |
git stash drop [stash_id] |
刪除已經(jīng)壓棧的變化 |
git stash clear |
刪除所有存儲(chǔ)的進(jìn)度 |
git stash show [stash@{$num}] -p |
顯示指定修改和當(dāng)前目錄的差異 |
PATCH操作
- 通過(guò)diff命令生成的補(bǔ)丁(.diff格式)不會(huì)攜帶git分支的信息,通過(guò)format-patch生成的補(bǔ)丁(.patch格式)則可以保留這些信息翎蹈。
- apply和am的區(qū)別是淮菠,git apply并不會(huì)將commit message等打上去,打完patch后需要重新git add和git commit荤堪,而git am會(huì)直接將patch的所有信息打上去合陵,而且不用重新git add和git commit,author也是patch的author而不是打patch的人
命令 | 解釋 |
---|---|
git diff [file] |
顯示工作區(qū)和暫存區(qū)的差異 |
git diff --cached [file] git diff --staged [file]
|
顯示暫存區(qū)和本地倉(cāng)的差異 |
git diff HEAD |
顯示“工作目錄和暫存區(qū)”與本地倉(cāng)之間的的所有不相同文件的差異 |
git diff HEAD~X git diff HEAD^^^
|
可以查看最近一次提交的版本與過(guò)去數(shù)X個(gè)的版本之間的差異 |
git diff [COMMIT-ID1] [COMMIT-ID2] |
顯示兩次提交之間的差異,不包含ID1的修改 |
git diff --shortstat "@{0 day ago}" |
顯示今天你寫了多少行代碼 |
git format-patch HEAD^ |
生成最近的1次commit的patch |
git format-patch <r1>..<r2> |
生成兩個(gè)commit間的修改的patch |
git format-patch -1 <r1> |
生成單個(gè)commit的patch |
git format-patch <r1> |
生成某commit以來(lái)的修改patch(不包含該commit) |
git apply XX.patch git am XX.patch
|
打補(bǔ)丁 |
git apply --check XX.patch |
測(cè)試補(bǔ)丁能否能應(yīng)用到當(dāng)前工程 |
git apply --stat patchfile |
輸出patch補(bǔ)丁的簡(jiǎn)要內(nèi)容逞力,比如修改了哪些文件 |
git am --abort |
當(dāng)git am失敗時(shí)曙寡,將所有patch廢棄掉,包括之前已經(jīng)打成功的 |
git am --resolved |
當(dāng)git am失敗寇荧,解決完沖突后举庶,這條命令會(huì)接著打patch |
submodule
命令 | 解釋 |
---|---|
git submodule add <url> <path> |
添加子模塊,將其放到path指定的目錄下面揩抡』Ы模可以通過(guò)git diff --cached 查看.gitmodules 中的改動(dòng) |
git submodule init git submodule update or git submodule update --init
|
主倉(cāng)根目錄下執(zhí)行,初始化并下載子模塊代碼 |
git submodule update --init --recursive |
遞歸下載所有子模塊峦嗤,用于子模塊下面又創(chuàng)建了子模塊的場(chǎng)景 |
git clone --recurse-submodules <url> |
克隆主倉(cāng)庫(kù)的同時(shí)克隆模塊倉(cāng)庫(kù)代碼蕊唐,這樣首次初始化的時(shí)候就不需要單獨(dú)再通過(guò)git submodule update 下載子模塊 |
git submodule sync --recursive |
當(dāng)子模塊的url發(fā)生了改變,則更新前需要先執(zhí)行該命令同步變化 |
submodule.<name>.shallow |
配置烁设,設(shè)置為 true 時(shí)替梨,此子模塊的克隆將作為淺層克碌鍪浴(深度為1)執(zhí)行 |
# 刪除子模塊
rm -rf # ?模塊?錄刪除?模塊?錄及源碼
vi .gitmodules # 刪除項(xiàng)??錄下.gitmodules?件中?模塊相關(guān)條?
vi .git/config # 刪除配置項(xiàng)中?模塊相關(guān)條?
rm .git/module/* # 刪除模塊下的?模塊?錄,每個(gè)?模塊對(duì)應(yīng)?個(gè)?錄副瀑,注意只刪除對(duì)應(yīng)的?模塊?錄即可
## 執(zhí)?完成后弓熏,再執(zhí)?添加?模塊命令即可,如果仍然報(bào)錯(cuò)糠睡,執(zhí)?如下:
git rm --cached <submodule name>
# 完成刪除后挽鞠,提交到倉(cāng)庫(kù)即可。
subtree
命令 | 解釋 |
---|---|
git subtree add --prefix=<prefix> <url> |
添加url指定的git工程狈孔,將其放到prefix指定的目錄下面信认。 |
git subtree add --prefix=<prefix> <url> <branch> --squash |
添加url指定的git工程,將其放到path指定的目錄下面均抽。squash會(huì)將所有commit記錄合并為一筆嫁赏。 |
git subtree pull --prefix=<prefix> <url> <branch> --squash |
更新指定的subtree目錄 |
git subtree push --prefix=<prefix> <url> <branch> |
將所有對(duì)subtree的修改同步到subtree對(duì)應(yīng)的倉(cāng) |
git subtree split --prefix=<prefix> --rejoin |
subtree push實(shí)際上是遍歷本工程每一次提交,把提交文件涉及到subtree目錄的挑出來(lái)到忽,同步到subtree工程橄教,如果提交有很多,遍歷提交的過(guò)程是有嚴(yán)重的性能問題喘漏。執(zhí)行split命令后,產(chǎn)生了一個(gè)新的分支华烟,且這個(gè)分支和subtree push操作的邏輯一樣翩迈,只把涉及subtree目錄的提交摘出來(lái)了,最終這個(gè)分支合并到原分支盔夜,產(chǎn)生了一個(gè)Split xxxxx的提交記錄负饲。后續(xù)再執(zhí)行subtree push操作,git只會(huì)檢索split以后的提交喂链,達(dá)到減少檢索次數(shù)的目的返十,提升push性能。--rejoin就是不產(chǎn)生新分支椭微,而是直接把摘出來(lái)的提交重新合入當(dāng)前分支洞坑。 |
git rm <subtree> git commit
|
刪除subtree,和刪除普通的目錄用法一樣 |
# 因?yàn)槊看蝩rl都輸入完整的鏈接比較麻煩蝇率,可以先將其命名為別名迟杂,然后再直接使用就行了
# 比如下面將pico項(xiàng)目命名為pico_project,后面就可以直接用這個(gè)別名了
git remote add pico_project https://github.com/raspberrypi/pico-sdk.git
git subtree add --prefix=subtree/pico pico_project master
其它命令
命令 | 解釋 |
---|---|
git archive |
生成一個(gè)可供發(fā)布的壓縮包 |