本文將介紹本地倉庫的基本操作:
- 文件操作命令
- 代碼回滾命令
掌握好這些命令之后,就能完成大部分個(gè)人作業(yè)了。
文件操作
1. 檢查狀態(tài) - git status
git status
是一個(gè)非常重要的命令,它顯示你的代碼在工作區(qū)和暫存區(qū)的狀態(tài)混萝。
$ git status
On branch master
Untracked files:
(use "git add ..." to include in what will be committed)
modified: readme.txt
可以加-s
參數(shù),以獲得簡短的結(jié)果輸出萍恕。若沒有這個(gè) 標(biāo)記逸嘀,則會有更多的提示與上下文提醒。
2. 查看改動(dòng) - git diff
我們可以通過git diff
命對比三個(gè)區(qū)之間的數(shù)據(jù)差別允粤。
命令 | 作用 |
---|---|
git diff | 工作區(qū)vs緩存區(qū) |
git diff HEAD | 工作區(qū)vs版本區(qū) |
git diff --cached | 緩存區(qū)vs版本區(qū) |
當(dāng)前三個(gè)區(qū)的數(shù)據(jù)是一致的崭倘,執(zhí)行命令都為空。
命令 | 結(jié)果 |
---|---|
git diff | image
|
git diff HEAD | image
|
git diff --cached | image
|
然后給 master.txt 添加一行內(nèi)容后类垫,現(xiàn)在工作區(qū)內(nèi)容發(fā)生變化司光,暫存區(qū)和版本庫內(nèi)容不變。
!()[]
命令 | 結(jié)果 |
---|---|
git diff | image
|
git diff HEAD | image
|
git diff --cached | image
|
執(zhí)行git add master.txt
之后悉患,修改同步到緩存區(qū)残家,現(xiàn)在工作區(qū)與緩存區(qū)數(shù)據(jù)一致。
命令 | 結(jié)果 |
---|---|
git diff | image
|
git diff HEAD | image
|
git diff --cached | image
|
執(zhí)行git commit
操作后售躁,修改已經(jīng)同步到版本庫坞淮,三區(qū)數(shù)據(jù)再次保持一致。
命令 | 結(jié)果 |
---|---|
git diff | image
|
git diff HEAD | image
|
git diff --cached | image
|
3. 查看版本庫提交記錄 - git log
簡而言之陪捷,就是查看版本庫中的提交歷史記錄回窘。
這條命令有很多參數(shù)選項(xiàng),我在下面只列舉幾個(gè)常用的參數(shù)揩局。
一毫玖、不帶參數(shù)
- 如果不帶任何參數(shù),它會列出所有歷史記錄,最近的排在最上方付枫,顯示提交對象的哈希值烹玉,作者、提交日期阐滩、和提交說明
- 如果記錄過多二打,則按Page Up、Page Down掂榔、↓继效、↑來控制顯示
- 按q退出歷史記錄列表
$ git log
commit 723ba27fbf4320237639151a4f44cf7b2cf93999 (HEAD -> master)
Author: ColleenKuang <colleenkuang@qq.com>
Date: Wed Jun 20 01:11:41 2018 +0800
add master.txt
commit b556edeab10f7f4365867e0172db4bfeee1b34e6
Author: ColleenKuang <colleenkuang@qq.com>
Date: Tue Jun 19 23:53:20 2018 +0800
add version number
二、帶參數(shù)
- --graph 顯示ASCII圖形表示的分支合并歷史
- --p 按補(bǔ)丁顯示每個(gè)更新間的差異装获,比下一條- -stat命令信息更全
- --stat 顯示每次更新的修改文件的統(tǒng)計(jì)信息瑞信,每個(gè)提交都列出了修改過的文件,以及其中添加和移除的行數(shù)穴豫,并在最后列出所有增減行數(shù)小計(jì)
- --pretty=oneline 一行顯示凡简,只顯示哈希值和提交說明(--online本身也可以作為單獨(dú)的屬性)
- -n 顯示前n條log記錄
- --author="author_name" 顯示名為author_name貢獻(xiàn)的commit。注意:作者名不需要精確匹配精肃,只需要包含就行了
4. 刪除未跟蹤文件 - git clean
git clean
命令將未跟蹤的文件從你的工作目錄中移除秤涩。它只是提供了一條捷徑,因?yàn)橛?git status
查看哪些文件還未跟蹤然后手動(dòng)移除它們也很方便司抱。和一般的 rm
命令一樣筐眷,git clean
是無法撤消的,所以在刪除未跟蹤的文件之前想清楚习柠,你是否真的要這么做匀谣。
$ git clean -n
執(zhí)行一次git clean的『演習(xí)』。它會告訴你那些文件在命令執(zhí)行后會被移除津畸,而不是真的刪除它振定。
$ git clean -f
移除當(dāng)前目錄下未被跟蹤的文件。-f
(強(qiáng)制)標(biāo)記是必需的肉拓,除非 clean.requireForce
配置項(xiàng)被設(shè)為了 false
(默認(rèn)為 true
)后频。它 不會 刪除 .gitignore
中指定的未跟蹤的文件。
$ git clean -df
移除未跟蹤的文件暖途,以及目錄卑惜。
$ git clean -xf
移除當(dāng)前目錄下未跟蹤的文件,以及 Git 一般忽略的文件驻售。
代碼回滾
1. 檢出之前的提交 - git checkout
版本控制系統(tǒng)背后的思想就是「安全」地儲存項(xiàng)目的拷貝露久,這樣你永遠(yuǎn)不用擔(dān)心什么時(shí)候不可復(fù)原地破壞了你的代碼庫。當(dāng)你建立了項(xiàng)目歷史之后欺栗,git checkout
是一種便捷的方式毫痕,來將保存的快照「加載」到你的開發(fā)機(jī)器上去征峦。
git checkout
這個(gè)命令有三個(gè)不同的作用:檢出文件、檢出提交和檢出分支消请。在這一章中栏笆,我們只關(guān)心前兩種用法。
檢出文件
git checkout <commit> <file>
執(zhí)行后臊泰,git會從指定的提交中拷貝文件到暫存區(qū)域和工作目錄蛉加,而工作區(qū)中剩下的文件不變,接下來看個(gè)例子:
$ git checkout da985 hello.py
將提交節(jié)點(diǎn)da985中的hello.py復(fù)制到工作區(qū)和緩存區(qū)中缸逃,你就可以查看da985節(jié)點(diǎn)的hello.py(如果命令中沒有指定提交節(jié)點(diǎn)针饥,則會從暫存區(qū)域中拷貝內(nèi)容。)注意當(dāng)前分支不會發(fā)生變化需频。
這里確實(shí)會影響你項(xiàng)目的當(dāng)前狀態(tài)丁眼。舊的文件版本會顯示為需要提交的更改,允許你回滾到文件之前的版本贺辰。如果你不想保留舊的版本户盯,你可以用下面的命令檢出到最近的版本:
$ git checkout HEAD hello.py
檢出提交
git checkout <commit>
執(zhí)行后,更新工作目錄中的所有文件饲化,使得和某個(gè)特定提交中的文件一致。與此同時(shí)吗伤,HEAD標(biāo)識會移動(dòng)指定的提交吃靠。這被稱為分離HEAD。
分離的頭指針(匿名分支提交) - Detached HEAD
當(dāng)HEAD處于分離狀態(tài)(不依附于任一分支)時(shí)足淆,提交操作可以正常進(jìn)行巢块,但是不會更新任何已命名的分支。(你可以認(rèn)為這是在更新一個(gè)匿名分支巧号。)
一旦此后你切換到別的分支族奢,比如說master,那么這個(gè)提交節(jié)點(diǎn)(可能)再也不會被引用到丹鸿,然后就會被丟棄掉了越走。注意這個(gè)命令之后就不會有東西引用2eecb。
但是靠欢,如果你想保存這個(gè)狀態(tài)廊敌,可以用命令git checkout -b name
來創(chuàng)建一個(gè)新的分支。
2. 重置提交歷史 - git reset
git reset
重設(shè)一個(gè)舊的提交门怪,你不得不移除那個(gè)提交后的所有提交骡澈,再移除那個(gè)提交眨业,然后重新提交后面的所有提交劝萤。不用說,這并不是一個(gè)優(yōu)雅的回滾方案以故。
此外,git reset
可以通過設(shè)置參數(shù)有選擇的變動(dòng)工作區(qū)护锤、緩存區(qū)和版本倉庫官地。
- --soft – 緩存區(qū)和工作目錄都不會被改變
- --mixed – 默認(rèn)選項(xiàng)。緩存區(qū)和你指定的提交同步蔽豺,但工作目錄不受影響
- --hard – 緩存區(qū)和工作目錄都同步到你指定的提交
這些標(biāo)記往往和HEAD
作為參數(shù)一起使用区丑。比如,git reset --mixed HEAD
將你當(dāng)前的改動(dòng)從緩存區(qū)中移除修陡,但是這些改動(dòng)還留在工作目錄中沧侥。另一方面,如果你想完全舍棄你沒有提交的改動(dòng)魄鸦,你可以使用git reset --hard HEAD
宴杀。這是git reset
最常用的兩種用法。
如果你在本地倉庫中作死之后想要?dú)瑴幺E拾因,git reset --hard
和 git clean -f
是你最好的選擇旺罢。記住,git reset
只影響被跟蹤的文件绢记,所以還需要一個(gè)單獨(dú)的命令來清理未被跟蹤的文件扁达。運(yùn)行這兩個(gè)命令使工作目錄和最近的提交相匹配,讓你在干凈的狀態(tài)下繼續(xù)工作蠢熄。
3. 撤銷已提交快照 - git revert
git revert
命令用來撤銷一個(gè)已經(jīng)提交的快照跪解。但是,它是通過搞清楚如何撤銷這個(gè)提交引入的更改签孔,然后在最后加上一個(gè)撤銷了更改的新提交叉讥,而不是從項(xiàng)目歷史中移除這個(gè)提交(重寫提交歷史)。這避免了Git丟失項(xiàng)目歷史饥追,這一點(diǎn)對于你的版本歷史和協(xié)作的可靠性來說是很重要的图仓。
$ git checkout hotfix
$ git revert HEAD~2
相比git reset
,它不會改變現(xiàn)在的提交歷史但绕。因此救崔,git revert
可以用在公共分支上,git reset
應(yīng)該用在私有分支上壁熄。
你也可以把git revert
當(dāng)作撤銷已經(jīng)提交的更改帚豪,而git reset HEAD
用來撤銷沒有提交的更改。
就像git checkout
一樣草丧,git revert 也有可能會重寫文件狸臣。所以,Git 會在你執(zhí)行 revert 之前要求你提交或者緩存你工作目錄中的更改昌执。
小總結(jié)
命令 | 作用域 | 常用情景 |
---|---|---|
git reset | 提交層面 | 在私有分支上舍棄一些沒有提交的更改 |
git reset | 文件層面 | 將文件從緩存區(qū)中移除 |
git checkout | 提交層面 | 切換分支或查看舊版本 |
git checkout | 文件層面 | 舍棄工作目錄中的更改 |
git revert | 提交層面 | 在公共分支上回滾更改 |
git revert | 文件層面 | 然而并沒有 |
參考鏈接:
廖雪峰Git教程
30分鐘git命令入門到放棄
圖解Git
代碼回滾:Reset烛亦、Checkout诈泼、Revert 的選擇