天天看點

GIT 復原 revert 和 reset 差別

背景

git 是一個龐大的工具,我們要開始掃盲一些常用的指令。復原代碼在項目中必然會遇到,下面我們介紹在 git 中如何復原代碼。

revert

假設有如下 commit 記錄

A <- B <- C <- D      

說明:尖頭方向表示 parent 節點,及​

​A <- B​

​ 表示先送出了 A,再送出了 B

情況一:現在不想要 D 了

git revert hash(D)      

執行指令後會讓填寫 message, 相當于一次 commit, 此時多了一次送出 E,如下

A <- B <- C <- D <- E(revert)      

D 這次的送出不會包含在 E 裡面,于是復原成功。

回到之前,

A <- B <- C <- D      

情況二:然後這次想復原到 C(注意是復原到 C,及 C、D 都不要了)

git revert hash(B)..HEAD      

注意這個 hash 的取值,是 B, 不是 C 的 commit hash

執行指令後會讓你填寫 2 次 message, 最後送出記錄也有兩次

A <- B <- C <- D <- E(revert) <- F(revert)      

回到之前

A <- B <- C <- D      

情況三:然後這次想復原 C(注意是復原 C,及 C 不要了,但是 D 還需要),其實跟情況一是同樣的

git revert hash(C)      

執行指令後填寫 1 次 message

A <- B <- C <- D <- E(revert)      

小結:

​revert hash​

​ 這個 hash 為對應想删除的 commit

​revert hash..HEAD​

​ 這個 hash 對應的 commit 不會被删除,會删除到它的後一次 commit

​revert​

​ 會産生新的送出,并不會真正删除 history。

reset

同樣,假設有如下 commit 記錄

A <- B <- C <- D      

想删除到 C(及 C、D 都不要了)

git reset hash(B) --hard      

注意,這裡 B 的 hash,而非 C 的。

執行指令後本地的 commit history 就被幹掉了

A <- B      

當執行 ​

​git push​

​​ 的時候,會被提示不能送出。但凡修改曆史跟 origin 有沖突的,都必須強項覆寫送出,這時大膽執行​

​git push -f​

​同步到 origin.

這裡 reset –hard 表示暫存區,工作區都不需要保留復原回來的代碼。如果不加,會出現這種情況,比如 ​

​git reset hash(B) --hard​

​, 那麼删除掉的 C, D 的檔案會進入工作區。

小節:

總結