Git筆記02(Git基礎(chǔ)命令)

本文將介紹本地倉庫的基本操作:

  • 文件操作命令
  • 代碼回滾命令

掌握好這些命令之后,就能完成大部分個(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

我們可以通過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ù)

  1. 如果不帶任何參數(shù),它會列出所有歷史記錄,最近的排在最上方付枫,顯示提交對象的哈希值烹玉,作者、提交日期阐滩、和提交說明
  2. 如果記錄過多二打,則按Page Up、Page Down掂榔、↓继效、↑來控制顯示
  3. 按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ù)

  1. --graph 顯示ASCII圖形表示的分支合并歷史
  2. --p 按補(bǔ)丁顯示每個(gè)更新間的差異装获,比下一條- -stat命令信息更全
  3. --stat 顯示每次更新的修改文件的統(tǒng)計(jì)信息瑞信,每個(gè)提交都列出了修改過的文件,以及其中添加和移除的行數(shù)穴豫,并在最后列出所有增減行數(shù)小計(jì)
  4. --pretty=oneline 一行顯示凡简,只顯示哈希值和提交說明(--online本身也可以作為單獨(dú)的屬性)
  5. -n 顯示前n條log記錄
  6. --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è)例子:

拷貝文件到緩存區(qū)和工作區(qū)
$ 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è)匿名分支巧号。)

image

一旦此后你切換到別的分支族奢,比如說master,那么這個(gè)提交節(jié)點(diǎn)(可能)再也不會被引用到丹鸿,然后就會被丟棄掉了越走。注意這個(gè)命令之后就不會有東西引用2eecb。

image

但是靠欢,如果你想保存這個(gè)狀態(tài)廊敌,可以用命令git checkout -b name來創(chuàng)建一個(gè)新的分支。

image

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ū)和工作目錄都同步到你指定的提交
The scope of git reset's modes

這些標(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 --hardgit 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é)作的可靠性來說是很重要的图仓。

Reverting the 2nd to last commit

$ 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 的選擇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市煤禽,隨后出現(xiàn)的幾起案子铐达,更是在濱河造成了極大的恐慌,老刑警劉巖檬果,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓮孙,死亡現(xiàn)場離奇詭異,居然都是意外死亡选脊,警方通過查閱死者的電腦和手機(jī)杭抠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恳啥,“玉大人偏灿,你說我怎么就攤上這事《鄣模” “怎么了翁垂?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硝桩。 經(jīng)常有香客問我沿猜,道長,這世上最難降的妖魔是什么碗脊? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任邢疙,我火速辦了婚禮,結(jié)果婚禮上望薄,老公的妹妹穿的比我還像新娘。我一直安慰自己呼畸,他們只是感情好痕支,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛮原,像睡著了一般卧须。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儒陨,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天花嘶,我揣著相機(jī)與錄音,去河邊找鬼蹦漠。 笑死椭员,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笛园。 我是一名探鬼主播隘击,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼侍芝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了埋同?” 一聲冷哼從身側(cè)響起州叠,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凶赁,沒想到半個(gè)月后咧栗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虱肄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年致板,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浩峡。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡可岂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翰灾,到底是詐尸還是另有隱情缕粹,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布纸淮,位于F島的核電站平斩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咽块。R本人自食惡果不足惜绘面,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侈沪。 院中可真熱鬧揭璃,春花似錦、人聲如沸亭罪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽应役。三九已至情组,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箩祥,已是汗流浹背院崇。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袍祖,地道東北人底瓣。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像盲泛,于是被迫代替她去往敵國和親濒持。 傳聞我的和親對象是個(gè)殘疾皇子键耕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容