2016年8月27日 星期六

[Git] reset 在不同commit之間跳來跳去,檔案變化

 git reset [commit ID] 和 git reset --hard [commit ID] 差別
PS: 如果不知道跳到哪裡了,請善用reflog
http://ithelp.ithome.com.tw/articles/10138150

狀況 1: 今天有5個commits,心血來潮想回去第3個commit
-- 確認工作目錄 git status 都乾淨
使用git reset [third commit ID] 或 git reset --hard [third commit ID]
結果:都順利回去第3個commit,沒有其他訊息。

狀況2.1:承上,在第3個commit裡面做檔案新增/修改,也沒git commit,再回去最新的commit
git reset [newest commit ID] :剛剛的檔案被保留並屬於unstaged狀態*(未放在索引)
             有git commit也一樣會被改成unstaged
git reset --hard [newest commit ID]:剛剛的檔案會被忽略(刪掉),強迫回到最新commit狀態

狀況2.2:反過來,在最新的commit做檔案新增/修改(沒commit),跳回第3個commit
git reset [third commit ID]:檔案會被帶進來屬於unstaged狀態;就算有commit也一樣會被變成unstaged狀態保留下來。

狀況3: 在第3個commit建立新分支,沒做任何動作就跳到第2個commit或回最新的commit
兩種指令結果: 分支自動被延伸到所跳到的commit
=>這種特性可以救回被刪掉的分支,如狀況4說明

狀況4: 在最新的commit刪掉分支  git branch -d(or -D) [被刪分支],後悔了想救回來
使用兩種 git reset 指令回到[被刪分支]存在的commit,這樣就救回來了。


狀況5:不知道跳到哪個commit了,想直接跳到最新的commit
=> 善用git reflog 找紀錄....它很強大,Git預設紀錄至少30天,刪除reflog也無法全刪,只能一筆一筆刪,刪了不會影響commit。



沒有留言:

張貼留言