版本控制的關鍵是可撤銷性,便可以使項目回退到某些操做以前狀態。Git做爲一款很是優秀的版本控制軟件具有了豐富的撤銷的命令來應對不一樣的場景,下面咱們來學習一下。html
命令:`git commit --amend`
做用:本次提交覆蓋上次提交,以此達到修改上次提交的目的。
複製代碼
Git使用reset、revert和checkout三個命令來回退項目到某一個歷史快照。
回退有兩個影響級別:
1) commit級別:根據指定的commit來恢復項目總體到歷史的某一快照。
2) 文件級別:根據指定commit和文件路徑來恢復指定文件到某一歷史版本。
複製代碼
git reset --soft [commit]
git reset [commit]
/git reset --mixed [commit]
git reset --hard [commit]
git revert [commit]
做用:打補丁的形式撤銷某次歷史版本;git revert -n [commit]..[commit]
做用:撤銷一個commit區間命令 | git reset | git revert |
---|---|---|
原理 | 改變分支的commit的引用 | 對已有commit引用打反補丁 |
反作用 | 改變commit歷史 | 不會改變commit歷史 |
適用性 | 本地分支 | 公共分支 |
衝突 | 無衝突 | 會有衝突 |
優勢 | 無衝突的恢復到某次歷史快照 | 可針對中間的某次提交進行撤銷操做 |
本質 | 覆蓋操做 | 修補操做 |
git reset [commit] [file]
,如果commit是HEAD
可替換爲--
。git checkout file
git chekcout [commit] [file]
,如果commit是HEAD
可替換爲--
。Git中每次提交都會存儲在Git倉庫,只是有些提交通過reset、刪除分支、刪除儲藏等操做後不被分支和標籤引用,變成懸掛狀態(dangling)。咱們能夠經過如下命令查看這些提交(Git的提交樹和vim的undo樹殊途同歸)。node
git log -g
或git reflog
來查看git log
查看git fsck --lost-found
因爲revert、分支合併等場景下的操做會與工做區和暫存區的內容產生衝突,若不想提交當前工做區和暫存區的修改內容,能夠經過儲藏命令將其儲藏起來,而後在合適的時候恢復工做區和暫存區。git
git stash # 儲藏當前工做區和暫存區
git stash list # 查看當前的儲藏列表
git stash apply # 恢復上一次的儲藏內容
git stach pop # 恢復上一次的儲藏內容,並將其從儲藏區刪除
複製代碼
git clean -f
做用:刪除未跟蹤文件git clean -df
做用:刪除未跟蹤文件和目錄git reset --hard
命令搭配使用。git reset --hard commit # 恢復git倉庫、暫存區和工做區(不包含未跟蹤內容)到指定commit
git clean -df # 刪除當前處於未跟蹤狀態的文件和目錄
git status # 當前處於commit,且暫存區和工做區都處於clean狀態
複製代碼