git reset vs git revert

  sonic0002        2019-02-02 08:26:39       106,645        14          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

當使用像是 git 的版本控制系統維護程式碼時,我們難免會需要回滾一些錯誤的提交,可能是因為錯誤或暫時性的程式碼還原。在這種情況下,新手開發者會非常緊張,因為他們可能會迷失在應該如何回滾變更而不影響其他人的情況下,但對於資深開發者來說,這是他們的例行工作,他們可以向您展示不同的方法。

在這篇文章中,我們將介紹開發人員經常使用的兩種主要方法。

  • git reset
  • git revert

它們的差異和對應的使用案例是什麼?我們將在下面詳細討論。

git reset

假設我們有以下幾個提交。

Commit A 和 B 是有效的提交,但 commit C 和 D 是錯誤的提交。現在我們想要回滾到 commit B 並捨棄 commit C 和 D。目前 HEAD 指向 commit D 5lk4er,我們只需要將 HEAD 指向 commit B a0fvf8 即可達到我們的目的。 

使用 git reset 命令很容易。

git reset --hard a0fvf8

執行上述命令後,HEAD 將指向 commit B。

但現在遠端 origin 的 HEAD 仍然指向 commit D,如果我們直接使用 git push 來推送變更,它將不會更新遠端儲存庫,我們需要新增一個 -f 選項來強制推送變更。

git push -f

這種方法的缺點是,一旦完成重置,HEAD 之後的所有提交都將消失。萬一有一天我們發現某些提交是好的,並且想要保留它們,那就太晚了。因此,許多公司禁止使用此方法來回滾變更。

git revert

使用 git revert 是為了建立一個新的提交,該提交會還原先前的提交。HEAD 將指向新的還原提交。 

對於上面的 git reset 範例,我們需要做的就是還原 commit D,然後還原 commit C。 

git revert 5lk4er
git revert 76sdeb

現在它會建立兩個新的提交 D' 和 C', 

在上面的範例中,我們只有兩個提交要還原,因此我們可以逐一還原。但是,如果要還原的提交很多怎麼辦?我們確實可以還原一個範圍。

git revert OLDER_COMMIT^..NEWER_COMMIT

這種方法不會有 git reset 的缺點,它會將 HEAD 指向新建立的還原提交,並且可以直接將變更推送至遠端,而無需使用 -f 選項。

現在讓我們看看一個更困難的範例。假設我們有三個提交,但錯誤的提交是第二個提交。 

使用 git reset 來回滾 commit B 並不是一個好主意,因為我們需要保留 commit C,因為它是一個好的提交。現在我們可以還原 commit C 和 B,然後使用 cherry-pick 再次提交 C。 

從上面的解釋中,我們可以發現 git resetgit revert 之間最大的差異在於,git reset 會透過捨棄所需提交之後的所有變更,將分支的狀態重置為先前的狀態,而 git revert 會透過建立新的還原提交並保留原始提交來重置為先前的狀態。建議在企業環境中使用 git revert 而不是 git reset。 

參考資料: https://kknews.cc/news/4najez2.html

GIT  GIT RESET  GIT REVERT 

       

  RELATED


  14 COMMENTS


Anonymous [Reply]@ 2019-02-03 08:11:41

Really hard to take anything you say seriously when you use the entire aplhabet for your hexadecimal SHA1 examples.

Anonymous [Reply]@ 2019-02-04 21:52:35

No need for that

Anonymous [Reply]@ 2019-02-05 07:25:42

On the contrary, it’s a good decision, since those strings are never going to match any actual SHAs. Sort of like how it’s good practice to use “example.com” in example URLs since it’s been reserved for that purpose. Since we don’t have any reserved SHAs (at least that I’m aware of) it’s better to use illegal ones.

Alan [Reply]@ 2019-02-03 08:46:00

Given a lot of commits to cherry pick, the more efficient way to handle this is a basic interactive git rebase of the last X commits, and you delete the line(s) of the commit(s) to be deleted. Easy!

Anonymous [Reply]@ 2019-02-03 15:26:14

The drawback of force pushing is not that some commits get lost. It's that you change the history of a public repositor, breaking everyone else's local copy and forcing them to fix it on their side. It's such a bad idea that most tools and hosting services don't even allow it by default.

Anonymous [Reply]@ 2019-02-03 19:25:49
yes, good point
Anonymous [Reply]@ 2024-03-10 06:51:25

That's what --force-with-lease is for and that is perfectly okay to do, even in a production environment.

cmbuckley [Reply]@ 2019-02-04 12:02:25
There’s absolutely no reason to revert C, B and then re-apply C in your last example. You can simply revert B.
Ke Pi [Reply]@ 2019-02-04 19:41:20

yes, agreed

Anonymous [Reply]@ 2019-02-04 21:53:21

https://google.com

Anonymous [Reply]@ 2019-02-04 22:12:51

You can also use `git checkout a1b2c3d4 -- filename` to check out older revisions and then recommit those changes. It works great for shared state files that shouldn't be stored in version control but sometimes are

Anonymous [Reply]@ 2019-11-18 13:30:02

Had a hard time finding a good explanation of either revert or reset - then I found yours that not only explains each one, but compares and contrasts the two. Excellent article, thanks for the information!

Anonymous [Reply]@ 2020-03-27 18:40:17

Found this really helpful ! Thank you so much !

Ke Pi [Reply]@ 2020-03-28 05:29:48

thank you for liking it :)



  RANDOM FUN

Welcome to hell