一、背景:
偶爾會遇到git的版本分支的檔案被誤改的情況,需要還原,此篇文章可能會幫助到你。
PS:
來理解下 Git 工作區、暫存區和版本庫概念,可以更好的理解以下的還原操作。
* 工作區:就是你在電腦裡能看到的目錄。
* 暫存區:英文叫 stage 或 index。一般存放在 .git 目錄下的 index 檔案(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
* 版本庫:工作區有一個隱藏目錄 .這個不算工作區,而是 Git 的版本庫。
詳解的流程圖如下:
二、git常用命令詳解
1.git status:
檢視工作區程式碼相對於暫存區的差別
2.git add .:
將當前目錄下修改的所有程式碼從工作區新增到暫存區,.代步當前目錄
3.git commit -m 'message':
將快取區的內容新增至本地倉庫
4.git pull orgin master:
先將遠端倉庫master中的資訊同步到本地倉庫master中
5.git push orgin master:
orgin是遠端主機,master表示是遠端伺服器上的master分支和本地分支重名的簡寫,分支名是可以修改的
6.git checkout -- test001.txt (或還原全部 git checkout -- *)
將工作區修改的檔案直接還原為最新版本
7.git reset HEAD
回退至當前版本(本地倉庫,並移出暫存區)
8.git reset HEAD^
回退至上個版本(本地倉庫,並移出暫存區)
9.git reset --hard HEAD^
回退至上一個版本(本地倉庫,並移出暫存區,同時更新工作區的檔案)
10.git reset --hard HEAD^^
回退至上上個版本(本地倉庫,並移出暫存區,同時更新工作區的檔案)
11.git reset –hard commitID
回退到某一次提交記錄(不可逆,之前的提交記錄會清除)
12.git revert commitID -m 1
復原某一次的提交記錄
三、還原至上一次的提交後(工作區修改了檔案,未提交至暫存區)
1.舉例說明,git倉庫內修改檔案test001.txt從 001 -> 001modify
此時介面檢視檔案包含感嘆號.未入暫存區
echo -e 001modify > test001.txt
2.使用git checkout -- test001.txt 將工作區修改的檔案直接還原.
此時檢視:介面檔案為綠色標記,命令列git status狀態正常,無提交內容
git checkout -- test001.txt
四、還原至上一次的提交後(工作區修改了檔案,並提交至暫存區,未提交到本地倉庫)
1.舉例說明,git倉庫內修改檔案test001.txt從 001 -> 001modify,並add加入暫存區:
echo -e 001modify > test001.txt
2.回退當前的版本:
介面檔案為感嘆號標記, 檢視狀態暫存區內容被移出,本地檔案任為修改後.
3.使用git checkout -- test001.txt 將工作區修改的檔案直接還原.
此時介面檔案為綠色標記,檢視狀態無提交內容.
git checkout -- test001.txt
五、還原至上一次的提交後(工作區修改了檔案,並提交至暫存區,已提交到本地倉庫,未推播遠端倉庫)
1.舉例說明,git倉庫內修改檔案test001.txt從 001 -> 001modify,並add加入暫存區:
此時介面檔案為感嘆號標記
echo -e 001modify > test001.txt
2.使用git commit將修改提交至本地倉庫,此時檔案狀態無感嘆號,提示未push遠端倉庫
3.使用git reset HEAD^回退到上一個版本:
此時檔案狀態為感嘆號,修改移出暫存區
4. 使用git checkout -- test001.txt 將工作區修改的檔案直接還原.
此時檔案狀態綠色
git checkout -- test001.txt
5.git push無法將本地倉庫推播至遠端倉庫
使用git push提示報錯,因為本地倉庫與遠端倉庫不一致
此時需要推播的話使用強制提交
六、還原至上一次的提交後(工作區修改了檔案,並提交至暫存區,已提交到本地倉庫,並已推播遠端倉庫)
1.本地檔案修改,add加入暫存區,commit提交至本地倉庫,push推播到遠端倉庫
此時檔案內容被修改,windows檔案為綠色標記,狀態無提交內容.
2.使用git reset HEAD^直接回退至上個版本:
此時工作區檔案仍為修改後,檔案狀態顯示已移出暫存區
3.使用git checkout -- test001.txt 將工作區修改的檔案直接還原.
此時介面檔案為綠色標記,檢視狀態無提交內容.
git checkout -- test001.txt
4.使用git push --force強制提交本地倉庫至遠端倉庫
七、還原至上一次的提交後(當前版本已push,一步操作)
1.本地檔案修改,add加入暫存區,commit提交至本地倉庫,push推播到遠端倉庫
此時檔案內容被修改,windows檔案為綠色標記,狀態無提交內容.
2.使用git reset --hard HEAD^還原至上一個版本
此時同時將檔案從暫存區移除,並替換工作區為上個版本,介面標記為綠色
3.使用git push --force強制提交本地倉庫至遠端倉庫
八.還原至上上次的提交的版本
1.兩次提交記錄檔案修改test001.txt與test002.txt,並分別push遠端倉庫
通過git log檢視提交的記錄:
2.使用git reset --hard HEAD^^還原至上一個版本
此時同時將檔案從暫存區移除,並替換工作區為上個版本
3.如需要將本地倉庫推播至遠端倉庫使用強制提交
九、還原至某一次提交記錄
1.使用git log檢視提交的記錄資訊
2. 使用git reset –hard commitID 還原到某一次提交
git reset --hard 508523eb52ffd6ca274cb01605503fb8bd6bc65a
此時只會把遠端版本(對應的commitId)覆蓋到本地倉庫,然後如果本地做了修改想要提交現修改後的版本到遠端就必須強行推播
3.git push -f強制推播本地倉庫直遠端倉庫
4.注意:操作不可逆,此時檢視git log,還原版本後的記錄不復存在
十.還原掉其中一次提交併保留其餘的提交
1.git log檢視紀錄檔並找到需要復原的記錄
2.使用git revert commitID -m 1 命令來複原某一次的提交
git revert 44e1cf32e0d914865d3476d3a765a83a7253586c -m 1
進入對話方塊儲存後記錄被複原
3.檢視git log已經復原,無需推播
ps:當存在分支合併的情況下慎用git revert,會還原已經合併記錄的提交.