天天看點

Git代碼復原送出分支

在項目中會出現目前版本的代碼倉出現問題,或者其它的一些情況,需要将目前的代碼復原到之前的某個指定版本上去。

一、git reset復原到指定的commit_id版本,之後所送出的内容會被全部丢棄

如下圖有4筆 commit,現在需要從目前的fourth commit---->4復原到second commit----->02版本

Git代碼復原送出分支
  1. 使用

    git log

    檢視目前送出的曆史内容,如上圖所示的。
  2. 根據復原版本所對應的 commit SHA-1值(commit後面的一串數字)來進行復原操作:
git reset --hard 7ca0f0f296
           
  1. 目前本地倉庫就會復原到指定版本處,如下圖所示,指定版本之後所送出的内容全部被丢棄。
    Git代碼復原送出分支
  2. 此時本地代碼落後于遠端代碼,如果需要将復原後的本地代碼Push到遠端代碼倉,需要使用–force以強制Push到遠端代碼倉:
git push --force
           

二、git revert撤銷指定的commit内容,相當于進行一次反向commit,以抵消指定commit_id版本所送出的内容,不影響指定commit_id版本之後所送出的内容

如代碼倉中有如下的送出history,HEAD指向C。現在需要撤銷B的操作,但是保留C的操作。

Git代碼復原送出分支
  1. 根據log的SHA-1的值來确認要撤銷哪一筆 commit的内容,如上圖B所對應的Commit_id 。
  2. 根據 B 所對應的 Commit_id 來進行revert操作:
git revert 6205ee287085
           
  1. revert之後的 log 如下圖所示:
    Git代碼復原送出分支
  2. 此時本地相當于新增了一筆Commit,在進行修改之後可以git push到遠端倉庫保持同步。
  3. 流程圖如下:此時 HEAD指向的Commit中,已經沒有B所送出的内容,但是C所送出的内容依然保留。
Git代碼復原送出分支

【注意】

git revert相當于撤銷某一筆Commit,它隻能對一個檔案的最後一次Commit進行revert操作。如果對同一個檔案,如file.txt分别進行多次編輯,并Commit,産生如下的History。現在想 revert b的commit,則将會産生沖突。主要原因是c的内容和b的内容在同一個檔案上。

Git代碼復原送出分支

總結:

git reset

git revert

差別:

  1. git reset

    相當于直接删除某一指定Commit_id之後的所有送出,來實作復原到指定版本處。其後的所有Commit都被丢棄。
    Git代碼復原送出分支
  2. git revert

    相當于撤銷某一處Commit的操作,一般隻用來撤銷上一步的Commit。若撤銷的Commit之間有多個其它的Commit,則很有可能出現Conflict。因為連續多個Commit可能會對同一個檔案進行編輯。
    Git代碼復原送出分支
  3. git reset

    則相當于回退到某一指定的Commit版本,将其後的所有送出都清除掉。

    git revert

    常用于團隊開發中,有多人送出代碼,需要撤銷自己的某一筆 Commit操作,而不影響别人的Commit内容。

本文轉載自 https://www.cnblogs.com/Jeffxu/p/16375957.html