背景
在多人協作時,對代碼的管理,難免會出現錯誤。如果出現錯誤,我們分析下來是要進行一些回退操作,那么解決辦法有如下兩種:
git reset
git revert
兩種方式
git reset
在使用git reset命令前,需要先了解一個概念:HEAD
HEAD 是當前分支引用的指針,它總是指向該分支上的最后一次提交。這表示 HEAD 將是下一次提交的父結點。
通常,理解 HEAD 的最簡方式,就是將它看做 你的上一次提交 的快照。
查看快照的操作如下:
下例就顯示了 HEAD 快照實際的目錄列表,以及其中每個文件的 SHA-1 校驗和
git cat-file -p HEAD git ls-tree -r HEAD
git reset的作用就是修改HEAD的位置,即將HEAD指向的位置改變為之前存在的某個版本。
適用場景:
如果我們想直接回到之前的某一版本,但是不想保留該目標版本后面的版本,就可以用這種方法。
分支操作者, 操作如下:
git checkout <branch_name> # 切換到目標分支上 git reset --hard <commit_id> # 本地目標分支上重置代碼到上面指定的commit_id, # 注意:該commit_id之后的所有提交都會丟失。 # 執行完后,HEAD的位置已經在該commit_id的位置 git reset --hard HEAD^ # 回到最新的一次提交 git push -f 等同於 git push --force # 在上一條命令中,已經在本地分支中reset好,接下來讓遠程分支也有相同的效果,可以直接運行這條命令。 # 執行后,可以去代碼托管網站查看 git push -f origin <branch_name> # 如果目標分支和遠程分支沒有關聯上,可以用這條命令,指出遠程分支
其他分支使用者:
git checkout <branch_name> # 切換到目標分支上 git reset --hard origin/branch_name # 這步就是其他同事把自己本地branch_name重置到與origin/branch_name一致, # 注意 # --hard參數會丟棄超過origin的所有commit # 如果不想丟棄可以用 --mixed 或 --soft,具體用哪個根據自己情況來
git revert
Git的 “還原” 操作。
Git 給你一個生成一個新提交的選項,提交將會撤消一個已存在提交的所有修改。
適用場景:
如果我們想撤銷之前的某一版本,但是又想保留該目標版本后面的版本,記錄下這整個版本變動流程,就可以用這種方法。
git revert -n <commit_id> # 本地目標分支撤銷指定的commit_id # 注意:做完上面的操作后,可能會出現沖突,需要先解決沖突,在git add, # 然后使用 git commit 提交 git push # 在上一條命令中,已經在本地分支中revert好,接下來讓遠程分支也有相同的效果,可以直接運行這條命令。 # 執行后,可以去代碼托管網站查看
注意,git revert后填的commit_id不能是 merge操作產生的commit_id.