git checkout -- file 在工作區(qū)的修改全部撤銷
git reset HEAD <file> 可以把暫存區(qū)的修改撤銷掉(unstage)根盒,重新放回工作區(qū):
工作區(qū)和暫存區(qū)
工作區(qū)(Working Directory)
就是你在電腦里能看到的目錄钳幅,比如我的learngit文件夾就是一個(gè)工作區(qū)
版本庫(kù)(Repository)
工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū)炎滞,而是Git的版本庫(kù)敢艰。
Git的版本庫(kù)里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)册赛,還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master钠导,以及指向master的一個(gè)指針叫HEAD。
前面講了我們把文件往Git版本庫(kù)里添加的時(shí)候击奶,是分兩步執(zhí)行的:
第一步是用git add把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū)湃望;
第二步是用git commit提交更改证芭,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支担映。
因?yàn)槲覀儎?chuàng)建Git版本庫(kù)時(shí),Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支官硝,所以,現(xiàn)在傻咖,git commit就是往master分支上提交更改卿操。
你可以簡(jiǎn)單理解為孙援,需要提交的文件修改通通放到暫存區(qū)拓售,然后,一次性提交暫存區(qū)的所有修改
管理修改
第一次修改 -> git add -> 第二次修改 -> git commit
只把暫存區(qū)的第一次修改提交了,
第一次修改 -> git add -> 第二次修改 ->git add-> git commit
這樣就都提交了
撤銷修改
場(chǎng)景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容莹菱,想直接丟棄工作區(qū)的修改時(shí)吱瘩,用命令git checkout -- file
。
場(chǎng)景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容蜜徽,還添加到了暫存區(qū)時(shí)拘鞋,想丟棄修改矢门,分兩步祟剔,第一步用命令git reset HEAD <file>
,就回到了場(chǎng)景1宣旱,第二步按場(chǎng)景1操作浑吟。
場(chǎng)景3:已經(jīng)提交了不合適的修改到版本庫(kù)時(shí),想要撤銷本次提交组力,可以通過(guò)版本回退忿项,不過(guò)前提是沒(méi)有推送到遠(yuǎn)程庫(kù)轩触。
刪除文件
Git中家夺,刪除也是一個(gè)修改操作拉馋,我們實(shí)戰(zhàn)一下,先添加一個(gè)新文件test.txt到Git并且提交:
$ git add test.txt
$ git commit -m "add test.txt"
[master b84166e] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
一般情況下随闺,你通常直接在文件管理器中把沒(méi)用的文件刪了矩乐,或者用rm命令刪了:
$ rm test.txt
這個(gè)時(shí)候回论,Git知道你刪除了文件傀蓉,因此,工作區(qū)和版本庫(kù)就不一致了误甚,git status命令會(huì)立刻告訴你哪些文件被刪除了:
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
現(xiàn)在你有兩個(gè)選擇靶草,一是確實(shí)要從版本庫(kù)中刪除該文件岳遥,那就用命令git rm刪掉奕翔,并且git commit:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
另一種情況是刪錯(cuò)了浩蓉,因?yàn)榘姹編?kù)里還有呢宾袜,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:
$ git checkout -- test.txt