讀git書籍筆記(精通git - 第二版)第四節(jié): Git工具

選擇修訂版本

1.單個(gè)修訂版本

git log:查看提交日志

$ git log
commit 1a679675596f01d05ec390ed6149cafe06251012 (HEAD -> master, origin/master)
Author: xx
Date:   Mon Dec 10 20:30:06 2018 +0800
    new1
commit d23004ca822c476bc70d393e0da0375784f27810
Merge: ef85a7d a02a7a4
Author: xx
Date:   Mon Dec 10 20:27:56 2018 +0800
    Merge branch 'testing'
commit ef85a7d22a759366e9ce3f776aa4039509a4f041
Author: xx
Date:   Mon Dec 10 20:07:42 2018 +0800
    新的提交
commit a02a7a4c9256f549734e977a39e01fb052d2c207
Author: xx
Date:   Mon Dec 10 20:06:17 2018 +0800

git show: 查看單次提交日志
項(xiàng)目中8-10個(gè)字符的版本號(hào)就可以避免重復(fù)了。

// 三個(gè)命令相同
$git show a02a7a4c9256f549734e977a39e01fb052d2c207
$git show a02a7a4c9256f549734e9 
$git show a02a7a4c925

2.reflog簡稱

git reflog: 最近幾個(gè)月的HEAD 和分支引用的日志

$git reflog
1a67967 (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from testing to master
0c28926 (origin/testing, testing) HEAD@{1}: commit: new2
a02a7a4 HEAD@{2}: checkout: moving from master to testing
1a67967 (HEAD -> master, origin/master) HEAD@{3}: commit: new1
d23004c HEAD@{4}: merge testing: Merge made by the 'recursive' strategy.
ef85a7d HEAD@{5}: commit: 新的提交
1f40fa9 (tag: v1.3, tag: v1.1) HEAD@{6}: checkout: moving from testing to master
a02a7a4 HEAD@{7}: commit: 新的
1f40fa9 (tag: v1.3, tag: v1.1) HEAD@{8}: checkout: moving from master to testing
1f40fa9 (tag: v1.3, tag: v1.1) HEAD@{9}: commit: 新提交
e9b0c95 HEAD@{10}: commit: 新的
0fcdd63 HEAD@{11}: commit (initial): init project

git show HEAD@{3}查看倉庫中HEAD在之前第3次的值,可以使用@{n}帶來引用reflog的輸出
git show HEAD@{2.month.ago}:僅在項(xiàng)目克隆至少兩個(gè)月才會(huì)生效。
git show master@{yesterday}查看master分支昨天在哪個(gè)位置(該命令僅對(duì)仍包含在reflog中的數(shù)據(jù)有效)
git log -g master:git log格式的reflog信息

注意??:reflog數(shù)據(jù)僅保存在本地

3.祖先的引用

在引用尾部添加^,Git會(huì)將其解釋為此次提交的父提交。
git show HEAD^:查看當(dāng)前提交的上一次提交
^后面加數(shù)字:代表此次提交的第幾個(gè)父提交,該命令僅在合并提交時(shí)有效,因?yàn)橹挥泻喜⑻峤徊艜?huì)有多個(gè)父提交,首個(gè)提交是指你合并時(shí)所在的分支,第二個(gè)提交時(shí)你所合并的分支。
git show HEAD^2:此次提交的第2個(gè)父提交
git show HEAD~ === git show HEAD^
git show HEAD~2 === git show HEAD^^:指首個(gè)父提交的首個(gè)父提交

4.提交范圍

雙點(diǎn)號(hào)

這種語法可以讓Git找出那些不在同一個(gè)分支上的提交。
git log master..testing:想要知道分支testing中哪些沒有合并到master分支上、

$ git log master..testing
commit 0c28926960cca461468f7ffeea7c7f8b4564e032 (origin/testing, testing)
Author: xx
Date:   Mon Dec 10 20:31:01 2018 +0800

    new2

git log testing..master所有在master分支上,但不在testing分支上。
git log origin/master..HEAD:如果想使testing分支處于最新狀態(tài),需要看看接下來要合并哪些提交.

多點(diǎn)

針對(duì)兩個(gè)以上分支指明修訂版本
git log refA..refB === git log ^refA refB === git log refB --not refA
想要查看包含refA refB但不包含refC中的提交git log refA refB ^refC===git log refA refB --not refC`

三點(diǎn)

查看屬于refA或 refB分支的非共有引用
git log refA...refB

交互式暫存

git add -i ===git add --interactive:git會(huì)進(jìn)入交互模式,顯示類似信息

         staged     unstaged path
  1:        +4/-0      nothing README.md

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now
暫存和取消暫存文件

在What now后面輸入對(duì)應(yīng)1-8編號(hào),會(huì)進(jìn)入緩存,輸入需要緩存的文件的編號(hào)1,則1文件前面會(huì)帶有*,表示README.md文件已被選中暫存,Update>>后繼續(xù)回車鍵,Git會(huì)暫存選中的文件。

What now> 2 
           staged     unstaged path
  1:        +4/-0        +1/-4 README.md
Update>> 1
           staged     unstaged path
* 1:        +4/-0        +1/-4 README.md
Update>> 
updated 1 path

如果想要取消暫存README.md,可以使用3或者r,繼續(xù)輸入README.md文件的編號(hào),繼續(xù)回車,則會(huì)取消對(duì)文件的暫存。

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> r
           staged     unstaged path
  1:        +2/-1      nothing README.md
Revert>> 1
           staged     unstaged path
* 1:        +2/-1      nothing README.md
Revert>> 
reverted 1 path

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> 

使用6(diff),會(huì)顯示已暫存文件的列表,執(zhí)行文件編號(hào)->回車 === git diff --cache

What now> 6
           staged     unstaged path
  1:        +2/-1      nothing README.md
Review diff>> 

暫存補(bǔ)丁git add -p

Git也可以只暫存文件的某一部分,例如對(duì)README.md文件進(jìn)行了兩處修改,只希望對(duì)其中一次進(jìn)行暫存,可以在交互式提示符中輸入5/p(代表patch補(bǔ)丁)。Git會(huì)詢問您部分暫存哪些文件,然后對(duì)于所選擇文件的每一個(gè)區(qū)域,都會(huì)逐個(gè)顯示出文件的差異并詢問是否需要暫存。
輸入?會(huì)顯示操作列表

儲(chǔ)藏與清理

git stash在處理項(xiàng)目的某一部分時(shí),想轉(zhuǎn)到其他分支,并不想提交這部分。
儲(chǔ)藏:能過獲取工作目錄的中間狀態(tài),也就是修改過的被跟蹤的文件以及暫存的變更,并在該中間狀態(tài)保存在一個(gè)包含未完成變更的棧中,隨后在恢復(fù)這些狀態(tài)。

On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   README.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   README.md5r45

想要切換分支到testing,但是不想提交,則可以執(zhí)行git stash === git stash save

git stash
Saved working directory and index state WIP on master: 1a67967 new1

查看保存列表git stash list

stash@{0}: WIP on master: 1a67967 new1

通過git stash apply stash{0}來指定應(yīng)用那次儲(chǔ)藏。
git stash apply默認(rèn)應(yīng)用最近那次儲(chǔ)藏。
git stash pop應(yīng)用儲(chǔ)藏,然后立即從棧中丟棄。
git stash --keep-index不要存儲(chǔ)已經(jīng)用git add命令暫存過的內(nèi)容
git status -s如果做了若干處修改,但是只想提交其中的一部分,隨后再來處理余下的改動(dòng),那么這個(gè)命令的功能相當(dāng)有用。

從儲(chǔ)藏中創(chuàng)建分支

如果已經(jīng)儲(chǔ)藏過文件之后,又更改了儲(chǔ)藏的文件,又想要應(yīng)用儲(chǔ)藏成果,就會(huì)產(chǎn)生沖突,可以執(zhí)行git stash branch,會(huì)創(chuàng)建一個(gè)新的分支,檢出在儲(chǔ)藏時(shí)的所在的提交,重新應(yīng)用成果,如果應(yīng)用成功應(yīng)用,就會(huì)丟掉儲(chǔ)藏。

清理工作目錄(不要輕易使用)

git clean:注意??該操作會(huì)從工作目錄中刪除所有為跟蹤過的文件
git stash --all刪除全部內(nèi)容,同時(shí)儲(chǔ)藏。
git clean -f -d會(huì)將文件全部刪除并清空所有子目錄,-f表示強(qiáng)制force.

搜索

git grep

該命令可以在 任何提交樹工作目錄中方便地查找某個(gè)字符串或正則表達(dá)式。
在默認(rèn)情況下grep只查找工作目錄下的文件,可以使用-n來輸出匹配位置的行號(hào)。

$ git grep -n [search]

例如

$ git grep -n icon-left
src/components/common/menu/Menu.vue:18:          <div class="menu-item-icon menu-item-icon-left">
src/components/common/menu/Menu.vue:37:            <div class="menu-item-icon menu-item-icon-left"></div>
src/components/common/menu/menu.scss:66:    .menu-item-icon.menu-item-icon-left {

可以使用--count選項(xiàng)讓Git輸出總信息:匹配到了哪些文件,每個(gè)匹配文件中有多少處匹配。

$git grep --count [search]

例如

$ git grep --count icon-left
src/components/common/menu/Menu.vue:2
src/components/common/menu/menu.scss:1

如果想要看看查找到的匹配屬于哪個(gè)方法和函數(shù),可以使用-p選項(xiàng)。

$ git grep -P icon-left

Git日志搜索

如果想知道常量icon-left是在什么時(shí)候出現(xiàn)的,可以使用-S(注意是大寫)選項(xiàng)讓Git只顯示出添加過或刪除過字符串的那些提交

$ git log -S icon-left --oneline
ed0c891 菜單樣式優(yōu)化
行日志搜索

git log -L:可以展示代碼苦衷某個(gè)函數(shù)或代碼行的歷史
例如項(xiàng)看文件。menu.vue中函數(shù)getSubMenuPermission的所有改動(dòng)紀(jì)錄,可以執(zhí)行git log -L :getSubMenuPermission:menu.vue

重寫歷史

修改最近一次的提交

修改最近的提交信息和修改由于文件添加,改動(dòng),刪除記錄下的快照。
git commit --amend只是想修改最近的提交信息

修改多個(gè)提交信息

可以通過變基操作來實(shí)現(xiàn)
git base -i:可以進(jìn)入變基命令的交互操作,但是使用命令需要知道變基到哪次提交
如果想要改變最近三次或其中任意一次的提交信息,需要將待修改的最近一次提交的父提交座位參數(shù)傳給git rebase -i, 也就是HEAD^2或者HEAD~3,

$git rebase -i HEAD~3
pick 57341bf 修改創(chuàng)建時(shí)清空信息順序
pick f130554 變更資源部分接口 + consumer
pick a04736f update
pick 57f8f64 修改v1.3.1新建用戶時(shí)顯示問題

這個(gè)展示的順序,于提交的順序時(shí)相反的,最近一次的提交在最下面。

步驟:esc鍵是退出,u鍵是后退,i鍵是進(jìn)入編輯

將以上git信息中的pick改為edit保存并退出后,git會(huì)倒回帶列表中最后一次提交并使你返回到命令行中,同時(shí)顯示如下信息

$ git rebase -i HEAD~3
xxxxxxx
  git commit --amend // 修改提交信息,并退出編輯器
XXXXXXX
  git rebase --continue // 這條命令會(huì)自動(dòng)應(yīng)用到其他兩次提交中。

重排提交

可以通過交互變基的形式,進(jìn)行重排提交或刪除提交 added cat-file,改變另外兩次提交的次序

pick 57341bf 修改創(chuàng)建時(shí)清空信息順序
pick f130554 變更資源部分接口 + consumer
pick a04736f update
pick 57f8f64 修改v1.3.1新建用戶時(shí)顯示問題

可以將兩次提交更改順序?yàn)椋ù藢?shí)例沒有成功)


pick f130554 變更資源部分接口 + consumer
pick 57341bf 修改創(chuàng)建時(shí)清空信息順序

壓縮提交

將一系列提交壓縮成單個(gè)提交
如果將pick改為squash,如果想將三次提交變成單個(gè)提交,將

pick 57341bf 修改創(chuàng)建時(shí)清空信息順序
squash f130554 變更資源部分接口 + consumer
squash a04736f update

保存退出之后就會(huì)合并3次提交信息

拆分提交

拆分提交會(huì)撤銷一次提交,然后根據(jù)需要提交的次數(shù)進(jìn)行多次部分暫存和提交。。。。。

重置的作用

例子:重新修改文件并提交到master

  • 第一步移動(dòng)HEADreset:移動(dòng)HEAD所指向的分支:執(zhí)行g(shù)it reset [提交版本號(hào)] 會(huì)將master分支指向該提交版本。
  • 第二步更新索引(--mixed):現(xiàn)在執(zhí)行g(shù)it status 就會(huì)看到綠色的索引與新的HEAD之間的差異。reset的作用就是使用HEAD當(dāng)前所指向的快照的內(nèi)容來更新索引。
    如果制定了--mixed選項(xiàng),reset會(huì)再次停止,即執(zhí)行g(shù)it reset HEAD~命令會(huì)在這里停下來。
    git reset [--mixed] HEAD~:會(huì)撤銷最近的提交,也會(huì)撤銷暫存所有東西,回滾到了執(zhí)行g(shù)it add 和git commit 命令之前的狀態(tài)。
  • 第三步:更新工作目錄(git reset hard HEAD~):會(huì)撤銷git add 和git commit 命令以及工作目錄中所做的全部工作。(注意!這步是比較危險(xiǎn)的操作)
    回顧:
    reset命令會(huì)以特定的次序重寫這三棵樹,并在你指定一下操作時(shí)停止。
    (1)移動(dòng)HEAD分支的指向(如果指定了--soft,則再次停止)
    (2)使索引看起來像HEAD(除非制定了--hard,則在此停止)
    (3)使工作目錄看起來像索引。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Git常用語法 [TOC] Git簡介 描述 ? Git(讀音為/g?t/。)是一個(gè)開源的分布式版本控制系統(tǒng),...
    君惜丶閱讀 3,963評(píng)論 0 13
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,863評(píng)論 9 163
  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,893評(píng)論 1 26
  • Git 是目前最流行的分布式版本控制系統(tǒng)之一。 版本控制指的是,記錄每次版本變更的內(nèi)容和時(shí)間等細(xì)節(jié),保留各版本之間...
    神齊閱讀 1,520評(píng)論 0 7
  • 元認(rèn)知 所謂元認(rèn)知就是對(duì)認(rèn)知的認(rèn)知,具體地說,是關(guān)于個(gè)人自己認(rèn)知過程的知識(shí)和調(diào)節(jié)這些過程的能力:對(duì)思維和學(xué)習(xí)活動(dòng)的...
    鴨梨山大哎閱讀 655評(píng)論 0 2

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