選擇修訂版本
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)HEAD
reset:移動(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)使工作目錄看起來像索引。