天天看點

Git-撤銷(回退)已經add,commit或push的送出

本文隻闡述如何解決問題,不會對git的各種概念多做介紹,如果有興趣可以點選下面的連結,進行詳細的學習:

Pro Git

本文适用的環境

現在先假設幾個環境,本文将會給出相應的解決方法:

1. 本地代碼(或檔案)已經add但是還未commit;

2. 要回退的commit的代碼已經commit了,但是還未push到遠端個人repository

3. 要回退的commit的代碼已經push到遠端的個人分支,但是還未merge到公共的repository

4. 要回退的commit的代碼已被merge(合入)到公共的repository

關鍵的幾個指令

git reset [commit]
git revert [commit]      

git reset有三個參數soft,mixed,hard分别對應head的指針移動,index(暫存區)、以及工作目錄的修改,當預設時,預設為mixed參數。

git revert與reset的差別是git revert會生成一個新的送出來撤銷某次送出,此次送出之前的commit都會被保留,也就是說對于項目的版本曆史來說是往前走的。而git reset 則是回到某次送出,類似于穿越時空。

相應的解決方法

1、 對于上面的前兩種情況,我們可以直接使用git reset指令。根據需要的不同使用,不同的參數。但是要注意

git reset –hard      

是一個危險的指令,他是git少數幾個會銷毀資料的指令之一,如果你不小心放了錯,你也許可以使用

git reflog      

指令來找回你的資料。

2、 對于第三種情況,如果你的遠端分支隻有你一個人用的話,那麼可以在先使用git reset [commit]回退,如何使用git push -f [commit]來強制更新你的遠端庫2

3、 對于最後一種情況,考慮到其他人的版本曆史,使用git reset [commit]是不建議的,此時我們應該使用git revert [commit]改指令不會修改之前的送出曆史,相當于對資料做了一次逆操作,然後再執行add,commit等指令。