iT邦幫忙

1

Git reset & restore & .gitignore

  • 分享至 

  • xImage
  •  

當我們創建資料會放到working directory,而這時候我們不能夠commit,資料需要透過
git add xxx放到staging area,而後我們才能commit,並且可由git log查詢到我們的commit紀錄。

這邊要來介紹一些的操作:

1.git restore --staged (指定檔案): 可對當前在staging area的檔案的修改回復至前一個狀態

https://ithelp.ithome.com.tw/upload/images/20200706/20126182OHZu2k70zK.png

再透過git restore (指定檔案) 遺棄掉在working directory的修改。

https://ithelp.ithome.com.tw/upload/images/20200706/20126182BdQBNFuKXJ.png

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的狀態。

https://ithelp.ithome.com.tw/upload/images/20200530/20126182x1AmMtWEFO.png

接著我們利用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。

https://ithelp.ithome.com.tw/upload/imageㄗ26182tB1SAHhcjk.png

https://ithelp.ithome.com.tw/upload/images/20200530/20126182Hfj5MjqE5O.png

而當我們使用 git add * 會發現系統提示,如果要將ignored的files也給add進去的話,就要使用git add -f <file> 強制 add 被ignore的files

若有一些情況,我們必須要提交這些被 git 忽略的檔案,就可以使用這個 -f 參數,強制加入檔案-f 同等於 --force,表示強制的意思

https://ithelp.ithome.com.tw/upload/images/20200530/20126182xpKejoAIVk.png

而有個特殊情況如,我們創建了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

https://ithelp.ithome.com.tw/upload/images/20200530/20126182VYEKQ95s2E.png

再來是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。

https://ithelp.ithome.com.tw/upload/images/20200530/20126182rH9c6K7Dda.png

此外,我們還可利用git reset <hashvalue>~n:在指定commit,取消 n 個commit,如下例從7716313(line5)回復到前兩個的commit 也就是我們的12ab628(line3)。

而如果不加上~n,git reset <hashvalue>:代表回復至特定 Commit

https://ithelp.ithome.com.tw/upload/images/20200530/20126182RQLpzARyQK.png

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。

https://ithelp.ithome.com.tw/upload/images/20200530/20126182XPvDm25Edc.png

3.git reset --hard:取消指定的commit,並直接丟掉其commit的修改,working directory以及staging area的file都會discard

首先我們先創建三個file,並都git add且commit -m 'line1' , 'line2' , 'line3',而後git log,
查詢我們commit的紀錄。

https://ithelp.ithome.com.tw/upload/images/20200530/20126182t62McIAMl7.png

而此刻我們如果使用git reset --hard HEAD(master)~:
可以將最新的(HEAD)commit給取消,並把其檔案所做的所有修改給復原(discard)
可以發現原為HEAD的line 3 已經不在commit上面,代表其修改已被移除,而由第二新的commit為HEAD。

https://ithelp.ithome.com.tw/upload/images/20200530/20126182JXXqHsv5Sq.png

其餘關於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 去遠端。

盡量避免用hard,建議用預設或soft較為安全,且盡量避免在master使用 git reset。

微調用 git commit --amend 大改用 git reset ~HEAD。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言