git 撤銷回滾學習

開發過程當中,你確定會遇到這樣的場景:git

場景一:緩存

糟了,我剛把不想要的代碼,commit到本地倉庫中了,可是尚未作push操做!spa

場景二:.net

完全完了,剛線上更新的代碼出現問題了,須要還原此次提交的代碼!指針

場景三:code

剛纔我發現以前的某次提交太愚蠢了,如今想要幹掉它!blog

撤銷

上述場景一,在未進行git push前的全部操做,都是在「本地倉庫」中執行的。咱們暫且將「本地倉庫」的代碼還原操做叫作「撤銷」!ci

狀況一:文件被修改了,但未執行git add操做(working tree內撤銷)開發

git checkout fileName
git checkout .
  •  

狀況二:同時對多個文件執行了git add操做,但本次只想提交其中一部分文件get

$ git add *
$ git status
# 取消暫存
$ git reset HEAD <filename>
  •  

狀況三:文件執行了git add操做,但想撤銷對其的修改(index內回滾)

# 取消暫存
git reset HEAD fileName
# 撤銷修改
git checkout fileName
  •  

狀況四:修改的文件已被git commit,但想再次修改再也不產生新的Commit

# 從新提交 
$ git add sample.txt
$ git commit --amend -m"說明"
  •  

狀況五:已在本地進行了屢次git commit操做,如今想撤銷到其中某次Commit

git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
  •  

具體參數和使用說明,請查看:Git Pro深刻淺出(二)中的重置揭祕部分

回滾

上述場景二,已進行git push,即已推送到「遠程倉庫」中。咱們將已被提交到「遠程倉庫」的代碼還原操做叫作「回滾」!注意:對遠程倉庫作回滾操做是有風險的,需提早作好備份和通知其餘團隊成員!

若是你每次更新線上,都會打tag,那恭喜你,你能夠很快的處理上述場景二的狀況

git checkout <tag>
  •  

若是你回到當前HEAD指向

git checkout <branch_name>
  •  

狀況一:撤銷指定文件到指定版本

# 查看指定文件的歷史版本
git log <filename>
# 回滾到指定commitID
git checkout <commitID> <filename>
  •  

狀況二:刪除最後一次遠程提交

方式一:使用revert

git revert HEAD
git push origin master
  •  

方式二:使用reset

git reset --hard HEAD^
git push origin master -f
  •  

兩者區別:

  • revert是放棄指定提交的修改,可是會生成一次新的提交,須要填寫提交註釋,之前的歷史記錄都在;
  • reset是指將HEAD指針指到指定提交,歷史記錄中不會出現放棄的提交記錄。

狀況三:回滾某次提交

# 找到要回滾的commitID
git log
git revert commitID

 

刪除untrackd 的file

git clean命令用來從你的工做目錄中刪除全部沒有tracked過的文件.

git clean常常和git reset --hard一塊兒結合使用. 記住reset隻影響被track過的文件, 因此須要clean來刪除沒有track過的文件. 結合使用這兩個命令能讓你的工做目錄徹底回到一個指定的<commit>的狀態.

用法

1

git clean -n

是一次clean的演習, 告訴你哪些文件會被刪除. 記住他不會真正的刪除文件, 只是一個提醒.

1

git clean -f  

刪除當前目錄下全部沒有track過的文件. 他不會刪除.gitignore文件裏面指定的文件夾和文件, 無論這些文件有沒有被track過.

1

git clean -f <path>

刪除指定路徑下的沒有被track過的文件.

1

git clean -df

刪除當前目錄下沒有被track過的文件和文件夾.

git clean -xf

刪除當前目錄下全部沒有track過的文件. 無論他是不是.gitignore文件裏面指定的文件夾和文件.

討論

git reset --hard和git clean -f是一對好基友. 結合使用他們能讓你的工做目錄徹底回退到最近一次commit的時候.

 

git clean對於剛編譯過的項目也很是有用. 如, 他能輕易刪除掉編譯後生成的.o和.exe等文件. 這個在打包要發佈一個release的時候很是有用.

例子

下面的例子要刪除全部工做目錄下面的修改, 包括新添加的文件. 假設你已經提交了一些快照了, 並且作了一些新的開發.

1

2

git reset --hard

git clean -df

運行後, 工做目錄和緩存區回到最近一次commit時候一摸同樣的狀態, git status會告訴你這是一個乾淨的工做目錄, 又是一個新的開始了.

 

刪除本地和提交到遠程的文件

git rm filename
相關文章
相關標籤/搜索