天天看點

git 必看,各種撤銷操作

git 必看,各種撤銷操作

場景概念說明

首先說明一個概念, git是一個分布式的版本控制工具,分布式即 git 管理的項目是有多個大緻平等的倉庫的。通過一個例子來說明這個東西。

舉一個最簡單的使用場景: 你在github 建立了一個項目, 然後把已經初始化的項目拉到了本地(或者從本地push了内容到github)。 即: 此時github 和你本地都有了項目,且二者,已經建立了聯系。

此時這一個項目既有了兩個倉庫,一個在github 的遠端倉庫,一個在本地的本地倉庫。 如果是兩人合作,則會有兩個本地倉庫。 雖然主觀上,把github上的倉庫視為主倉庫,但是我們可以通過一些操作,把任一倉庫變更為新的主倉庫。 即: 這些倉庫的地位沒有實質上的差别。可以做如下轉換

git 必看,各種撤銷操作

不熟練就先備份

不熟練的話,做感覺有危險的操作前,先備份。

可以使用 git stash,備份目前的修改,想要恢複的時候,直接使用 檢出即可。 或者幹脆 git checkout -b newBranch, 備份一個新分支。 備份 不是今天的主要話題,就不展開講了。

撤銷操作--僅變動本地的代碼

取消檔案的修改

git checkout fileName, 這個指令會從本地倉庫裡檢出檔案,覆寫掉 指定檔案的修改。 本地倉庫 即已經commit 送出到本地倉庫的代碼。把指定的檔案名換成‘ . ’ 即為選擇全部的意思。

取消 git add 操作

git reset --mixed 僅取消 git add 帶來的效果。 即本地的修改還在,但是取消了add 的狀态。

回退到指定到 commit号

git reset --hard commitId, 這個指令 回退到指定的commit,并且不會保留本地尚未送出的修改。是以一定要慎重使用。

取消commit時,更安全的操作: revert

更安全的操作, 使用 git revert

git revert commitId,會撤銷指定的commit,但是與 reset --hard 不同的是,revert 不會丢掉被撤銷的commit,而是會生成一個新的commit,其所有操作與指定的commit 相反,以此來覆寫掉該commit 的修改。

舉個栗子: 按序有三個commit: c1, c2, c3。 現在我們位于c3. 使用 git commit --hard c2, 則目前狀态會退回到 c2, git log, 隻會看到,c2、c1. 而 如果使用git revert c2,則會新添加一個c4的commit,c4的操作與c2 完全相反。 git log 可以看到 1 ~ 4 全部的commit。

如果你想撤銷遠端的代碼呢

如果使用了revert,直接 git push 即可。

如果使用的是git reset,或者 rebase到了之前的commit; 在更改了本地代碼以後,git push -f。

-f 一定慎用,如果涉及到遠端主分支,幹脆就不要用。

涉及遠端的,還是推薦用 revert

歡迎批評與指正。

git 必看,各種撤銷操作