Git - 回滾與撤銷


必要的概念

  • 當前編輯界面:工作區(workspace)
  • “git add”命令:將改動加入到緩存區(Index)
  • ”git commit”命令:提交代碼到本地庫(Local Repository)
  • ”git push”命令:提交代碼到遠程庫(Remote Repository)

未使用“git add”命令緩存代碼時

git checkout

git checkout -- <filepathname>  # 丟棄工作區某個文件的修改
git checkout .  # 丟棄工作區所有文件的修改

注意:此命令不會刪除掉新建的文件,需要手動刪除。

已使用“git add”命令緩存代碼

git reset

git reset HEAD <filepathname>  # 撤銷暫存區某個文件的修改,重新放回工作區
git reset HEAD .  # 撤銷暫存區所有文件的修改,重新放回工作區

注意:相當於撤銷“git add”命令,但只是將本地的修改從暫存區回退到工作區。

已使用“git commit”命令提交代碼

git reset

git reset --hard HEAD^ <filepathname>   // 回退某個文件到上一次commit的狀態
git reset --hard HEAD^    // 回退所有文件到上一次commit的狀態
git reset --hard  <commit id>   // 回退所有文件到某個commit

git commit --amend

重做上一次commit,並包括指定文件的新變化。
合並緩存區的修改和最近的一次commit,並嘗試重新commit。可以理解為,用一個全新的commit整個替換了最近一次commit。
如果緩存區沒有內容, 可以用來編輯上一次的commit描述。
不要對一個公共的commit使用amend。如果amend了一個被其他開發者使用的commit, 可能會嚴重影響其他開發者。

git rebase

重新定義分支的起點,也就是將當前分支從一個commit移動到另一個commit作為起點。
分支上的老commit將被刪除,保持了項目歷史的干凈。建議不要在一個公共的分支中使用rebase。

git rebase <base>   # 將<base>做為當前分支的新起點, <base>可以是任何一種commit引用(如ID,branch name,tag,HEAD~N等)。
git rebase -i <base>    # 交互式地將<base>做為當前分支的新起點,過程中可以對要rebase的commit做一定的修改。

"git reset"命令

用來撤銷本地的修改。建議不要reset一個公共的項目歷史。

主要參數:

  • --soft 回退后a分支修改的代碼被保留並標記為add的狀態(git status 是綠色的狀態)
  • --mixed 重置索引,但不重置工作樹,更改后的文件標記為未提交(add)的狀態。默認操作。
  • --hard 重置索引和工作樹。
git reset  # 回退版本庫到上一個commit的狀態, 工作區不變。
git reset <commit>  # 回退版本庫到指定的<commit>,  工作區不變。

git reset --hard  # 回退版本庫和工作區到上一次commit的狀態。 --hard表明覆蓋所有的修改,  而且是不可逆的, 因此使用之前要謹慎。
git reset --hard <commit>  # 回退版本庫和工作區到指定的<commit>。

git reset --hard origin/master  # 將版本庫和工作區回退到和遠程的一樣。

回退到上個版本:git reset --hard HEAD^ <filepathname> git reset --hard HEAD^ git reset --hard HEAD~
回退到上上個版本:git reset --hard HEAD^^ git reset --hard HEAD~1
以此類推。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM