1.工作前先查看日誌
$ git log --oneline
2.修改已 commit 的版本
有時候我們總會忘了什麼, 比如已經提交了 commit 卻發現在這個 commit 中忘了附上另一個文件. 接下來我們模擬這種情況. 上節內容中, 我們最後一個 commit 是 change 2, 我們將要添加另外一個文件, 將這個修改也 commit 進 change 2. 所以我們複製 1.py 這個文件, 改名爲 2.py. 並把 2.py 變成 staged, 然後使用 --amend 將這次改變合併到之前的 change 2 中.
$ git add 2.py
$ git commit --amend --no-edit # "--no-edit": 不編輯, 直接合併到上一個 commit
$ git log --oneline # "--oneline": 每個 commit 內容顯示在一行
# 輸出
904e1ba change 2 # 合併過的 change 2
c6762a1 change 1
13be9a7 create 1.py
3.reset 回到 add 之前
有時我們添加 add 了修改, 但是又後悔, 並想補充一些內容再 add. 這時, 我們有一種方式可以回到 add 之前. 比如在 1.py 文件中添加這一行:
d = 3
文件從修改(modified)狀態到staged狀態
$ git add 1.py
$ git status -s # "-s": status 的縮寫模式
# 輸出
M 1.py # staged
接下來我們想回到modified狀態執行以下語句:
$ git reset 1.py
# 輸出
Unstaged changes after reset:
M 1.py
-----------------------
$ git status -s
# 輸出
M 1.py # unstaged
4.reset 回到 commit 之前
每個 commit 都有自己的 id 數字號, HEAD 是一個指針, 指引當前的狀態是在哪個 commit. 最近的一次 commit 在最右邊, 我們如果要回到過去, 就是讓 HEAD 回到過去並 reset 此時的 HEAD 到過去的位置.
# 不管我們之前有沒有做了一些 add 工作, 這一步讓我們回到 上一次的 commit
$ git reset --hard HEAD
# 輸出
HEAD is now at 7338690 change 2
-----------------------
# 看看所有的log
$ git log --oneline
# 輸出
7338690 (HEAD -> master) change 2
49f05cc change 1
4e6aee2 create 1.py
# 回到 49f05cc change 1
# 方式1: "HEAD^"
$ git reset --hard HEAD^
# 方式2: "commit id"
$ git reset --hard 49f05cc
-----------------------
# 看看現在的 log
$ git log --oneline
# 輸出
49f05cc (HEAD -> master) change 1
4e6aee2 create 1.py
怎麼 change 2 消失了!!! 還有辦法挽救消失的 change 2 嗎? 我們可以查看 $ git reflog 裏面最近做的所有 HEAD 的改動, 並選擇想要挽救的 commit id:
$ git reflog
# 輸出
49f05cc (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
7338690 HEAD@{1}: reset: moving to HEAD
7338690 HEAD@{2}: commit (amend): change 2
c911905 HEAD@{3}: commit: change 2
49f05cc (HEAD -> master) HEAD@{4}: commit: change 1
4e6aee2 HEAD@{5}: commit (initial): create 1.py
重複 reset 步驟就能回到 commit (amend): change 2 (id=904e1ba)這一步了
$ git reset --hard 7338690
#輸出
HEAD is now at 7338690 change 2
$ git log --oneline
#輸出
7338690 (HEAD -> master) change 2
49f05cc change 1
4e6aee2 create 1.py
我們又再次奇蹟般的回到了 change 2.