git 必看,各種撤銷操作
場景概念說明
首先說明一個概念, git是一個分布式的版本控制工具,分布式即 git 管理的項目是有多個大緻平等的倉庫的。通過一個例子來說明這個東西。
舉一個最簡單的使用場景: 你在github 建立了一個項目, 然後把已經初始化的項目拉到了本地(或者從本地push了内容到github)。 即: 此時github 和你本地都有了項目,且二者,已經建立了聯系。
此時這一個項目既有了兩個倉庫,一個在github 的遠端倉庫,一個在本地的本地倉庫。 如果是兩人合作,則會有兩個本地倉庫。 雖然主觀上,把github上的倉庫視為主倉庫,但是我們可以通過一些操作,把任一倉庫變更為新的主倉庫。 即: 這些倉庫的地位沒有實質上的差别。可以做如下轉換
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIx0DciV2dmADM30zd-cGcq5ydRpWT4hTekZXS6xUejhlWwplVa5mRXJGcOBjTsFEWhlnUzMmdR5mYsxWbjZXM5JGMWhVW2lkaj5WOXRFbkdVW0xmMQ5WNHNWdNdVW4VFRahXVtllMZJTT1UERahXTUx0MFR1TxEFVNRDO5NGbkdVW0xmMYtmRyI2cChFZ2hzVhVXVIFme1cVWwBXbMpnVyoFaxcVY0F1VZZHeHNWM5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
不熟練就先備份
不熟練的話,做感覺有危險的操作前,先備份。
可以使用 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
歡迎批評與指正。