當我們創建資料會放到working directory,而這時候我們不能夠commit,資料需要透過
git add xxx放到staging area,而後我們才能commit,並且可由git log查詢到我們的commit紀錄。
這邊要來介紹一些的操作:
1.git restore --staged
(指定檔案): 可對當前在staging area的檔案的修改回復至前一個狀態
。
再透過git restore (指定檔案) 遺棄掉在working directory的修改。
2.Ignoring files忽略文件。
3.reset復原commit之修改。
.gitignore:
因為他是初始化代碼倉庫就有的檔案,故所有共享使用的人都可以看到有什麼檔案被
ignore,且可進行編輯ignore(可以忽略untracked的files
,也就是沒有git add的檔案)
指定檔案。
我們先在folder(git-test3)下創建,c.in , a.index , b.index,且將c.in,git add進staging area,利用git status得知目前folder的狀態。
接著我們利用vim .gitignore去編輯我們所要ignore的file
,此處我們ignore所有結尾為.index的files( * .index),並git add * ,在git status,發現working directory區塊的file都不見了(被ignore),但唯獨發現.gitignore還在working directory,這是因為git add * 不會添加.開頭的檔案
,所以要直接 git add .gitignore,此時我們在git status,發現.gitignore也已進入staging area。
而當我們使用 git add * 會發現系統提示,如果要將ignored的files也給add進去的話,就要使用git add -f <file> 強制 add 被ignore的files
。
若有一些情況,我們必須要提交這些被 git 忽略的檔案,就可以使用這個 -f 參數,強制加入檔案-f 同等於 --force,表示強制的意思
而有個特殊情況如,我們創建了a.py並git add進去,而後我們在創建b.py但不git add進去,然後在gitignore去ignore * .py,git status後可以發現,b.py被ignore了,但a.py並沒有被ignore,仍然待在staging area裡面,而我們要把她拿出來並ignore就可以利用這git rm --cached <file> 將已經在staging裡面的file給ignore
。
再來是reset的部分,共分為三種模式:
1.git reset --mixed
:取消指定的commit,並將其修改留在working directory
,而不在staging area
。若沒有指定 Reset 模式就是預設為 Mixed 模式
。
首先我們分別commit6次,而後git log,查詢我們commit的紀錄,利用git log --oneline
,可拿掉作者,日期相關資訊,並且只保留hash值(驗證字串)的七碼、commit message
。
發現HEAD指向efdb707的commit,而當我們git reset efdb707^,在git log --oneline,發現HEAD已經指向下一個commit 7716313,並發現當前efdb707的commit已經消失,再利用git status,發現efdb707 commit所做的修改已經被保留在working directory。
此外,我們還可利用git reset <hashvalue>~n
:在指定commit,取消 n 個commit
,如下例從7716313(line5)回復到前兩個的commit 也就是我們的12ab628(line3)。
而如果不加上~n,git reset <hashvalue>:代表回復至特定 Commit
。
2.git reset --soft
:介於mixed及hard之間,取消指定的commit,其修改會留在staging area
,讓我們日後好方便修改或再次commit。
首先,HEAD指向最新的commit 12ab628,我們利用git reset 12ab628^(如果不加上^,會將指定commit 之前的commit全部取消
) --soft將,其commit取消,並將其修改放進staging area,我們再次git log --oneline,發現HEAD已指向下一個commit,並且git status,被取消的commit之修改已經放進staging area。
3.git reset --hard
:取消指定的commit,並直接丟掉其commit的修改,working directory以及staging area的file都會discard
。
首先我們先創建三個file,並都git add且commit -m 'line1' , 'line2' , 'line3',而後git log,
查詢我們commit的紀錄。
而此刻我們如果使用git reset --hard HEAD(master)~
:
可以將最新的(HEAD)commit給取消
,並把其檔案所做的所有修改給復原(discard)
。
可以發現原為HEAD的line 3 已經不在commit上面,代表其修改已被移除,而由第二新的commit為HEAD。
其餘關於reset的指令如:
git commit -c ORIG_HEAD
:在commit後,會返回當前我們在commit所傳入的message,可以方便對其修改。
git commit --amend
:如果我們想修改檔案,但又不想再增加一個commit,想要覆蓋掉當前commit,就可以用這個,如我們要修改最後一次commit,且不產生額外的commit,首先修改其文件的錯誤,並git add,接著在git commit --amend(不會產生額外commit,但會修改當前commit的hash value)
即可。
但當有其他人已經將我們commit --amend前的文件拿去做修改並且commit
,就不宜在使用git commit --amend
因為會發生衝突。
但如果當前分支(自己另外創建的分支)是只有我們在操作
,並且我們想做微調、修改等,就可以使用
git commit --amend,修改完 add, commit ,push 去遠端。