觀念
只是看看 : checkout
從尚未commit的編輯文件退回到某個commit : restore
從現在commit倒退回某commit 資料會留在檔案 也會留在staging : reset
從現在commit倒退回某commit 資料會留在檔案 但不留在staging : reset --hard
想在undo某些commit的時候,從那一點開始修改不會影響到其他branch: revert
(1)git checkout
檢視某段過去的commit、file、branch ,僅檢視而沒有undo
一般來說Head都是指向最新的commit
checkout的功能就是能讓我們檢視過去那些舊的commit
我們可以用git log
找到commit的hash value
git checkout [commit hash]
就可以回去檢視commit
然而這時候想要更改資料是不行的 因為Head並不是真正為commit pointer
-->再Head上面新增branch再更改
(2) git restore
當我們在已經commit的文件中編輯,且新的編輯尚未commit
想要回到文件某個commit時就可以用restore倒退回去
git restore filename
--> 倒退到Head在的commit
!!倒退回去後不能再undo,因為剛剛的編輯沒有commit (把restore想成究極ctrl+z)
git restore --source HEAD~N file.txt
-->倒退到Head往後N的commit
git restore --staged filename
可以將staging裡面的file移除
(3) git reset ###
當我們想將commit後的檔案結果跳回過去某個commit,就可以使用
git reset ###
會退回到###的狀態,跟reset當下之間的改變會留在staging階段
git reset ### --hard
會回到###的狀態,跟reset當下之間的改變不會保留
(4) git revert
會在原本branch上建立一個新的commit,這個commit代表是undo某些commit
那這功能不能用原本的reset操作嗎?
如果reset的話繼續操作下去會影響到brand other的歷史紀錄
revert某點表示為某點undo且在本branch新增的commit point
如此一來從revert的這點開始修改也不會影響到其他branch
練習
checkout
在空白folder新增file.txt:
first commit
add/commit "first commit"
接下來file.txt:
first commit
second commit (新增)
add/commit "second commit"
third commit跟上述一樣
git log --oneline
Head目前在third commit現在我們想要查看second commit
那要回去third commit怎麼辦
restore
首先在原本file.txt裡面亂改一通,之後使用git restore file.txt
就變回third commit狀態
若要變回first commit狀態則git restore --source HEAD~2 file.txt
此時用git log --oneline
--> Head仍是third commit
從staging移除
現在創立兩個新檔案 file2.txt file3.txt並且加入staging, 之後移除file2.txt
reset
一如剛剛先建立file.txt的三個commit:
file.txt:
commit 1
commit 2
commit 3
接下來我們想要reset到commit 2 git reset ###of_commit2
--> commit 2 ~ commit 3之間的變動會留在staging中
文件部分commit3的變動在staging中
接下來修改file.txt:
commit 1
commit 2
update (modify)
add , commit "update"
現在強制reset到commit 2 git reset ### --hard
revert
一如剛剛先建立file.txt的三個commit:
file.txt:
commit 1
commit 2
commit 3
file.txt:
commit 1
commit 2
revert commit3 從commit3長出一個新的commit point就不會影響到別的branch