記錄下git常用命令爷速,方便查閱渡八。
1.查看版本號(hào)
git --version
2.配置
安裝完 Git 之后啃洋,要做的第一件事就是設(shè)置你的用戶名和郵件地址传货。這一點(diǎn)很重要,因?yàn)槊恳粋€(gè) Git 提交都會(huì)使用這些信息宏娄,它們會(huì)寫入到你的每一次提交中问裕,不可更改:
1.查看配置
--local:當(dāng)前倉庫配置 --global:全局配置 --system:系統(tǒng)配置 生效順序:system<global<local
// 查看所有的配置
git config --list
// 查看所有的配置以及它們所在的文件
git config --list --show-origin
// 查看全局倉庫配置
git config --list --global
// 查看當(dāng)前倉庫用戶名(可不帶--local)
git config --local user.name
// 查看全局倉庫用戶名
git config --global user.name
2.配置信息
// 配置當(dāng)前倉庫用戶名(與--local等價(jià))
git config user.name "testleo"
// 配置當(dāng)前倉庫用戶名
git config --local user.name "testleo"
// 配置全局倉庫用戶名
git config --global user.name "testleo"
// 配置全局倉庫郵箱
git config --global user.email "testemail@example.com"
// 配置默認(rèn)分支為main(不配置為master)
git config --global init.defaultBranch main
3.幫助
// 查詢add命令的使用
git help add
// 查詢add命令的使用
git add --help
// 查詢add命令的使用
man git-add
// 查詢add命令的簡明使用
git add -h
4.init
1.創(chuàng)建倉庫
包含工作區(qū),在目錄下有.git目錄孵坚。
// 在my_project目錄下初始化git(my_project/.git)(如my_project目錄不存在粮宛,則創(chuàng)建)
git init my_project
// 等價(jià)于
mkdir my_project; cd my_project; git init
2.創(chuàng)建裸倉庫
裸倉庫:不包含工作區(qū)。類似于普通倉庫的.git目錄里的內(nèi)容卖宠。一般用于遠(yuǎn)程倉庫巍杈,遠(yuǎn)程倉庫不能直接操作工作區(qū)(因?yàn)闆]有工作區(qū)),必須clone到本地進(jìn)行修改逗堵,然后再推送到遠(yuǎn)端秉氧。
// 直接初始化
git init --bare my_project.git
// 從已有的普通倉庫生成
git clone --bare my_project my_project.git
// 整體上效果大致相當(dāng)于
cp -Rf my_project/.git my_project.git
5.clone
// <local>可省略,默認(rèn)以遠(yuǎn)程的文件命名
git clone <remote> <local>
// 從保存在本地的遠(yuǎn)端倉庫clone
git clone ./my_project local_project
// 從遠(yuǎn)端clone蜒秤,默認(rèn)命名libgit2
git clone https://github.com/libgit2/libgit2
// 從遠(yuǎn)端clone,命名mylib2
git clone https://github.com/libgit2/libgit2 mylib2
6.status
// 使用檢查當(dāng)前文件狀態(tài)
git status
7.diff
git diff:比較工作區(qū)與暫存區(qū)差異亚斋。注意:只能比較已被git管理的文件的變動(dòng)作媚。如果是新增文件,則無法比較帅刊。(還沒執(zhí)行g(shù)it add)
git diff --staged/--cached:比較已暫存文件與最后一次提交的文件差異纸泡。(執(zhí)行了git add但沒有執(zhí)行g(shù)it commit)
// 比較工作區(qū)與暫存區(qū)差異
git diff
// 比較已暫存文件與最后一次提交的文件差異
git diff --staged
// 比較上一次提交與當(dāng)前提交的區(qū)別(如當(dāng)前提交有新增,則會(huì)以+形式體現(xiàn))
git diff HEAD^ HEAD
// 比較master分支與dev分支區(qū)別
git diff master dev
// 比較兩次提交的區(qū)別
git diff 3fc77104 557b6608
8.add
// 把所有變更的文件放到暫存區(qū)赖瞒。新增文件:加入git管理并放入暫存區(qū)女揭。git已管理變更:把變更放入暫存區(qū)。
git add .
// 把README栏饮、README2加入git管理并放入暫存區(qū) 新增README文件路徑為:v1/v2/README2
git add README v1
9.restore
// 把所有放到暫存區(qū)的文件從暫存區(qū)移除
git restore --staged .
// 把加入git管理并放入暫存區(qū)的README吧兔、README2從暫存區(qū)移除 README文件路徑為:v1/v2/README2
git restore --staged README v1
// 把工作區(qū)的修改重置 同:git checkout -- README
git restore README
10.rm
// 把加入暫存區(qū)的v1目錄及子目錄及文件從暫存區(qū)移除并刪除目錄
git rm -rf v1
// 把加入暫存區(qū)的README從暫存區(qū)移除,同 git restore --staged README
git rm --cached README
// 把加入暫存區(qū)的README從暫存區(qū)移除并刪除
git rm -f README
11.commit
// 把添加到暫存區(qū)的文件進(jìn)行提交
git commit -m "init"
// 跳過暫存區(qū)把未暫存的文件提交(只會(huì)提交已被git管理的文件)(新增的文件不會(huì)提交)
git commit -a -m "init"
// 跳過暫存區(qū)把未暫存的文件提交(只會(huì)提交已被git管理的文件)(新增的文件不會(huì)提交)
git commit -am "init"
--amend命令會(huì)將暫存區(qū)中的文件提交袍嬉。 如果自上次提交以來你還未做任何修改(例如境蔼,在上次提交后馬上執(zhí)行了此命令), 那么快照會(huì)保持不變伺通,而你所修改的只是提交信息箍土。
// 重新提交
git commit --amend
提交后發(fā)現(xiàn)忘記了暫存某些需要的修改,可以像下面這樣操作罐监,最終只會(huì)有一個(gè)提交:第二次提交將代替第一次提交的結(jié)果吴藻。
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
12.mv
// 把README重命名為readme.md
git mv README readme.md
// 等價(jià)于下面三條命令
mv README readme.md
git rm README
git add readme.md
13.branch
// 查看本地分支
git branch
// 查看本地分支及對應(yīng)的提交
git branch -v
// 查看本地分支與跟蹤的遠(yuǎn)程分支
git branch -vv
// 查看本地分支與跟蹤的遠(yuǎn)程分支及遠(yuǎn)程分支
git branch -avv
// 查看遠(yuǎn)程所有分支
git branch -r
// 查看本地和遠(yuǎn)程所有分支
git branch -a
// 查看哪些分支已經(jīng)合并到當(dāng)前分支
git branch --merged
// 查看所有包含未合并工作的分支
git branch --no-merged
// 創(chuàng)建dev分支
git branch dev
// 刪除本地dev分支,如無法刪除(該分支未合并)弓柱,使用 -D
git branch -d dev
// 刪除本地暫存的遠(yuǎn)端dev分支沟堡,如無法刪除侧但,使用 -D
git branch -d -r origin/dev
// 刪除遠(yuǎn)端dev分支 方式1
git push origin -d dev
git push origin --delete dev
// 刪除遠(yuǎn)端dev分支 方式2
git push origin :dev
// 讓本地master分支跟蹤遠(yuǎn)端main分支。(如當(dāng)前在master分支弦叶,可省略最后的master參數(shù))
// 可以為一個(gè)本地分支設(shè)置多個(gè)跟蹤俊犯。設(shè)置跟蹤前應(yīng)先調(diào)用:git pull origin main 把遠(yuǎn)程的索引更新到本地。
git branch -u origin/main master
// 取消本地分支與遠(yuǎn)端分支的跟蹤伤哺,先取消跟蹤才能設(shè)置跟蹤
git branch --unset-upstream
// 把本地master分支重命名為main
git branch -m master main
// 創(chuàng)建并切換bugfix分支
git checkout -b bugfix
// 設(shè)置bugfix分支跟蹤遠(yuǎn)程dev分支
git branch -u origin/dev
// 查找包含當(dāng)前提交的本地分支
git branch --contains 0f0e9c938721
// 查找包含當(dāng)前提交的本地分支與遠(yuǎn)程分支
git branch -a --contains 0f0e9c938721
14.remote
默認(rèn)clone的倉庫會(huì)有個(gè)遠(yuǎn)程倉庫:origin(別名)燕侠。
// 查看遠(yuǎn)程倉庫別名
git remote
// 查看遠(yuǎn)程倉庫別名及對應(yīng)URL
git remote -v
git remote add <遠(yuǎn)程簡寫> <遠(yuǎn)程地址>
// 添加遠(yuǎn)程倉庫../next_remot,命名為pb
git remote add pb ../next_remot
// 添加遠(yuǎn)程倉庫并命名為pb
git remote add pb https://github.com/paulboone/ticgit
// 查看遠(yuǎn)程倉庫origin詳細(xì)信息(可看到遠(yuǎn)程分支情況及遠(yuǎn)程分支與本地分支跟蹤情況立莉。)
git remote show origin
// 查看遠(yuǎn)程倉庫pb更多信息
git remote show pb
// 把遠(yuǎn)程倉庫pb重命名為paul
git remote rename pb paul
// 把遠(yuǎn)程倉庫paul移除
git remote remove paul
15.pull
git pull的默認(rèn)行為是git fetch + git merge
git pull --rebase則是git fetch + git rebase
// 拉取遠(yuǎn)端origin的master分支(fetch)绢彤,并把本地master與遠(yuǎn)端master代碼合并(merge)。
git pull origin master
// 假設(shè)當(dāng)前分支為master蜓耻,且與遠(yuǎn)端分支建立了關(guān)聯(lián)茫舶。拉取遠(yuǎn)端origin的master分支(fetch),并把本地master與遠(yuǎn)端master代碼合并(merge)刹淌。同 git pull origin master
git pull
// 允許本地與遠(yuǎn)程沒有共同父節(jié)點(diǎn)的合并拉取操作(常見于倉庫初始化饶氏,但本地遠(yuǎn)端都有倉庫時(shí))
git pull --allow-unrelated-histories origin master
16.push
// 推送tag到遠(yuǎn)程倉庫
git push origin v1.5
// 所有不在遠(yuǎn)程倉庫服務(wù)器上的標(biāo)簽全部傳送到那里
git push origin --tags
// 刪除遠(yuǎn)程倉庫中的tag
git push origin --delete v1.5
// 推送本地master分支到遠(yuǎn)端
git push origin master
// 推送當(dāng)前分支到遠(yuǎn)端
git push
17.fetch
// 獲取當(dāng)前分支跟蹤的遠(yuǎn)程分支的更新
git fetch
// 獲取遠(yuǎn)程分支dev的更新
git fetch origin dev
// 獲取所有遠(yuǎn)端更新(不合并)
git fetch --all
18.merge
// 切換到master分支
git checkout master
// 把dev分支合并到master分支
git merge dev
如合并發(fā)生沖突,需要解決沖突有勾,然后執(zhí)行
git add .
git commit -m "解決沖突"
19.rebase
dev分支是基于master分支新建的疹启。如想把dev的修改變基到master,需要執(zhí)行以下操作:
// 1.切換到dev分支
git checkout dev
// 2.以master作為基底蔼卡,把dev分支的修改變基到master(此時(shí)dev上已有master的修改喊崖,且在共同父節(jié)點(diǎn)后,master的修改在前雇逞,dev的修改在后荤懂。)
git rebase master
// 3.切換到master分支
git checkout master
// 4.把dev的代碼以快進(jìn)的方式合并到master分支
git merge dev
或者使用簡化代碼:
// 1.以master作為基底,把dev分支的修改變基到master(此時(shí)dev上已有master的修改塘砸,且在共同父節(jié)點(diǎn)后节仿,master的修改在前,dev的修改在后谣蠢。)
git rebase master dev
// 2.把dev的代碼以快進(jìn)的方式合并到master分支
git merge dev
// 變基發(fā)生沖突后粟耻,修改沖突并執(zhí)行以下代碼
git add .
// 繼續(xù)變基
git rebase --continue
// 取消變基
git rebase --abort
20.log
// 樹狀形式、每個(gè)提交一行 顯示歷史記錄
git log --graph --pretty=oneline
// 查看當(dāng)前分支提交記錄
git log
// 最近的兩次提交及所引入的差異
git log -p -2
// 每個(gè)提交放在一行顯示
git log --pretty=oneline
// 以特定格式顯示
git log --pretty=format:"%h - %an, %ar : %s"
// 樹狀形式顯示提交歷史
git log --graph
git log --pretty=format:"%h %s" --graph
// 僅顯示添加或刪除內(nèi)容匹配指定字符串function_name的提交眉踱。
git log -S function_name
常用選項(xiàng):
%H:提交的完整哈希值
%h:提交的簡寫哈希值
%T:樹的完整哈希值
%t:樹的簡寫哈希值
%P:父提交的完整哈希值
%p:父提交的簡寫哈希值
%an:作者名字
%ae:作者的電子郵件地址
%ad:作者修訂日期(可以用 --date=選項(xiàng) 來定制格式)
%ar:作者修訂日期挤忙,按多久以前的方式顯示
%cn:提交者的名字
%ce:提交者的電子郵件地址
%cd:提交日期
%cr:提交日期(距今多長時(shí)間)
%s:提交說明
-p:按補(bǔ)丁格式顯示每個(gè)提交引入的差異。
--stat:顯示每次提交的文件修改統(tǒng)計(jì)信息谈喳。
--shortstat:只顯示 --stat 中最后的行數(shù)修改添加移除統(tǒng)計(jì)册烈。
--name-only:僅在提交信息后顯示已修改的文件清單。
--name-status:顯示新增、修改赏僧、刪除的文件清單大猛。
--abbrev-commit:僅顯示 SHA-1 校驗(yàn)和所有 40 個(gè)字符中的前幾個(gè)字符。
--relative-date:使用較短的相對時(shí)間而不是完整格式顯示日期(比如“2 weeks ago”)淀零。
--graph:在日志旁以 ASCII 圖形顯示分支與合并歷史挽绩。
--pretty:使用其他格式顯示歷史提交信息〖葜校可用的選項(xiàng)包括 oneline唉堪、short、full肩民、fuller 和 format(用來定義自己的格式)唠亚。
--oneline:--pretty=oneline --abbrev-commit 合用的簡寫。
21.reset
--hard:不保存修改持痰。--soft:保存修改灶搜。
// 把暫存區(qū)中的README從暫存區(qū)中移除 同:git restore --staged README
git reset HEAD README
// 會(huì)重置所有在工作區(qū)、暫存區(qū)中的內(nèi)容(可以省略HEAD)到最后一次提交工窍,不保留修改
git reset --hard
git reset --hard HEAD
// 重置代碼到上一個(gè)提交(HEAD代表當(dāng)前提交割卖,HEAD^代表上一次提交)
git reset --hard HEAD^
// 重置代碼到指定提交
git reset --hard 0f0e9c938721
// 重置代碼到最后一次提交,并保留修改
git reset --soft
22.checkout
// 切換到dev分支
git checkout dev
// 創(chuàng)建dev分支并切換到該分支(省略了HEAD患雏,基于當(dāng)前HEAD)
git checkout -b dev
// 創(chuàng)建dev分支并切換到該分支(基于d74bfcf的提交)
git checkout -b dev d74bfcf
git checkout -b dev
// 是以下命令的簡寫
git branch dev
git checkout dev
// 把工作區(qū)的修改重置 同:git restore README
git checkout -- README
// 檢出到tag:v1.5究珊,此時(shí)處于分離頭指針(detached HEAD)
git checkout v1.5
// 基于tag:v1.5創(chuàng)建分支tagBranch1_5并切換到該分支
git checkout -b tagBranch1_5 v1.5
// 基于當(dāng)前分支創(chuàng)建本地分支(如遠(yuǎn)端有origin/dev分支,需要手動(dòng)創(chuàng)建關(guān)聯(lián))
git checkout -b dev
// 基于遠(yuǎn)程dev分支創(chuàng)建本地分支(自動(dòng)創(chuàng)建本地與遠(yuǎn)端的關(guān)聯(lián))
git checkout -b dev origin/dev
// 如遠(yuǎn)端有origin/dev分支纵苛,自動(dòng)創(chuàng)建關(guān)聯(lián)并切換到dev分支
git checkout dev
// 創(chuàng)建本地serverfix分支并切換到serverfix分支,且跟蹤遠(yuǎn)端serverfix分支
git checkout --track origin/serverfix
23.tag
// 列出標(biāo)簽
git tag
// 列出匹配v1.8.5*的tag
git tag -l "v1.8.5*"
// 標(biāo)簽信息和與之對應(yīng)的提交信息
git show v1.4
// 打v1.4的tag并為tag添加描述
git tag -a v1.4 -m "the tag version:1.4"
// 在9fceb02提交打tag
git tag -a v1.2 9fceb02
// 刪除本地tag
git tag -d v1.2
git push origin v1.5
// 檢出到tag:v1.5言津,此時(shí)處于分離頭指針(detached HEAD)
git checkout v1.5
// 基于tag:v1.5創(chuàng)建分支tagBranch1_5并切換到該分支
git checkout -b tagBranch1_5 v1.5
24.stash
// 已被跟蹤但未被commit的修改暫存(未被跟蹤的需要執(zhí)行g(shù)it add才能被暫存)
git stash
// 暫存修改并命名
git stash save "第一次暫存"
// 查看暫存列表
git stash list
// 把最后一次暫存應(yīng)用到當(dāng)前工作區(qū)
git stash apply
// 把第二次暫存(下標(biāo)從0開始)應(yīng)用到當(dāng)前工作區(qū)
git stash apply stash@{1}
// 把最后一次暫存應(yīng)用到當(dāng)前工作區(qū)攻人,并刪除暫存
git stash pop
// 把第二次暫存(下標(biāo)從0開始)應(yīng)用到當(dāng)前工作區(qū),并刪除暫存
git stash pop stash@{1}
// 刪除單個(gè)緩存
git stash drop stash@{0}
// 清除所有暫存
git stash clear
// 顯示與當(dāng)前分支具體差異
git stash show stash@{0} -p
25.reflog
git log
是顯示當(dāng)前的HEAD和它的祖先的悬槽,遞歸是沿著當(dāng)前指針的父親怀吻,父親的父親,這樣的原則初婆。
git reflog
根本不遍歷HEAD的祖先蓬坡。它是HEAD所指向的一個(gè)順序的提交列表:它的undo歷史。
reflog并不是repo(倉庫)的一部分磅叛,它單獨(dú)存儲(chǔ)屑咳,而且不包含在pushes,fetches或者clones里面弊琴,它純屬是本地的兆龙。
reflog可以很好地幫助你恢復(fù)你誤操作的數(shù)據(jù),例如你錯(cuò)誤地reset了一個(gè)舊的提交敲董,或者rebase紫皇,這個(gè)時(shí)候你可以使用reflog去查看在誤操作之前的信息慰安,并且使用 git reset --hard 去恢復(fù)之前的狀態(tài)。
git reflog show
26.revert
revert能在不修改commit歷史下聪铺,讓代碼回滾到某次提交化焕。
例如有A、B铃剔、C三個(gè)提交∪鼋埃現(xiàn)在想把代碼修改回到B,但是保留之前的commit番宁,可以用revert元莫。
A(hash:01457d561cd177)B(hash:7ece6165996e0d)C(hash:85cb8fc446f585)
兩個(gè)點(diǎn)
X..Y :等價(jià)于 (X, Y] 左開右閉區(qū)間。也就是從X開始到Y(jié)結(jié)束蝶押,不包括X踱蠢。
三個(gè)點(diǎn)
X...Y:不同時(shí)在X與Y中的。也就是X與Y的交集以外的部分棋电。
// HEAD:C HEAD^:B(倒數(shù)第二次提交)
git revert HEAD~2..HEAD
// 與上面等價(jià)
git revert 01457d561cd177..85cb8fc446f585
// 與上面等價(jià)(注意順序茎截,最后提交的在最前面)
git revert HEAD HEAD^
// 與上面等價(jià)
git revert 7ece6165996e0d 85cb8fc446f585
// 只把代碼回退,不提交
git revert --no-commit HEAD^ HEAD
HEAD~1等價(jià)于HEAD^
HEAD~2等價(jià)于HEAD~1^
27.cherry-pick
28.blame
git blame 能顯示任何文件中每行最后一次修改的提交記錄赶盔。
// 顯示README每一行的最后一次提交記錄
git blame ~/Desktop/test/README
// 顯示README第69行到第82行的最后一次提交記錄
git blame -L 69,82 ~/Desktop/test/README
結(jié)果如下:
b8b0618cf6fab (Cheng Renquan 2009-05-26 16:03:07 +0800 69) ifeq ("$(origin V)", "command line")
b8b0618cf6fab (Cheng Renquan 2009-05-26 16:03:07 +0800 70) KBUILD_VERBOSE = $(V)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 71) endif
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 72) ifndef KBUILD_VERBOSE
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 73) KBUILD_VERBOSE = 0
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 74) endif
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 75)
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 76) ifeq ($(KBUILD_VERBOSE),1)
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 77) quiet =
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 78) Q =
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 79) else
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 80) quiet=quiet_
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 81) Q = @
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 82) endif
注意一下 ^1da177e4c3f4
這個(gè)提交的幾行企锌,其中的前綴 ^
指出了該文件自第一次提交后從未被修改過。
29.grep
30.不同倉庫代碼合并
場景:A于未、B兩個(gè)倉庫撕攒,現(xiàn)需要把B倉庫的代碼(分支:b_dev)合并到A倉庫(分支:a_dev)。
1.在A倉庫下添加遠(yuǎn)端索引
git remote add b_remote http://xxx/code.git(b倉庫地址)
2.將倉庫B代碼下載到本地
git fetch b_remote
3.在本地創(chuàng)建B的分支
git checkout -b b_dev b_remote/b_dev
4.切換到A倉庫分支
git checkout a_dev
5.合并B分支
--allow-unrelated-histories:允許沒有關(guān)聯(lián)的分支合并
git merge b_local --allow-unrelated-histories
6.覆蓋合并
覆蓋合并相當(dāng)于刪除了被覆蓋分支的內(nèi)容烘浦。
假設(shè)當(dāng)前處于A倉庫a_dev分支抖坪,以下命令是把B倉庫的b_dev分支代碼覆蓋到了A倉庫a_dev分支
git reset -hard devOld
31.倉庫遷移
倉庫遷移不僅會(huì)將所有代碼遷移到新倉庫,而且會(huì)保留所有的commit和tag闷叉。
隨便cd到一個(gè)目錄擦俐,然后執(zhí)行:
// 1、從原地址克隆一份裸倉庫
git clone --bare xxx/oldproject
// 2握侧、進(jìn)入到裸倉庫
cd oldproject.git
// 3蚯瞧、推送到新地址
git push --mirror xxx/newproject
32.指定分支推送到其他倉庫
如果需要把repA的branchA推送到repB的branchB中
1、把repB的git地址添加到repA
// 查看repA當(dāng)前的遠(yuǎn)程地址
git remote -v
// 如果已有repB的地址品擎,則不用再次添加埋合,沒有則執(zhí)行:
git remote add repBOrigin master
// 關(guān)聯(lián)repB的git地址
git remote set-url repBOrigin https://xxx.git
2、repA切換到branchA
git checkout branchA
3孽查、推送repA的branchA分支到repB的branchB分支
git push repBOrigin branchA:branchB