git回滾

git作為版本控制肯定是常見的了,對于git有一個版本回滾的功能是我們在開發(fā)過程中應(yīng)該用到比較多,掌握它對于我們開發(fā)來說是非常重要的。

引言

什么叫做git的回滾尼?

我先來解釋下使用場景吧!

比如我們在開發(fā)過程中有這樣的需求,這里的需求是對于代碼的托管,而并非開發(fā)的業(yè)務(wù)需求。
在用git做版本控制的時候,肯定會有提交錯誤的情況,想回到提交前的版本,或者我回到提交前的版本了,又想回到剛剛修改的版本,那么我該怎么辦?
或者還有這樣那樣的奇葩的需求,在對于分布式的版本控制都能夠滿足你的需求;

在之前,我是假設(shè)我們都會git的基本語法了,如果不會,飛機(jī)票到git指南

首先,引入三個問題

  • commit了一個錯誤版本,應(yīng)該怎么回退版本?
  • commit+push了一個錯誤版本,怎么回退遠(yuǎn)程分之的版本?
  • commit+push了一個錯誤版本到公共遠(yuǎn)程分支,該怎么回退?

接下里,我就來解決這三個問題。

本地分支回退

現(xiàn)在我們來YY一下我們有一個文件叫做tjun.txt,然后目前它有三個版本的提交記錄,分別是:

  1. create a file

create a file

  1. add content

add content

  1. change file

change

假設(shè)這就是我們的提交記錄,我們可以使用git log查看我們的提交記錄,

$git log
commit 834ab3343cc23e43c2435e43a324b43545e23430(commit id)
Author asw (commit author)
Date Thu Nov 30 15:55:20 2017 +0800
change file

commit 84acd3434b3348a80989ce8e3437341e23240243(commit id)
Author asw (commit author)
Date Thu Nov 30 15:50:20 2017 +0800
add content

commit 99bf354c43544542b48f9e909c05226233bf755030(commit id)
Author asw (commit author)
Date Thu Nov 30 15:49:20 2017 +0800
create a file
git log就是用來查看最近的提交記錄,如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上--pretty=oneline參數(shù):

$ git log --pretty=oneline
834ab3343cc23e43c2435e43a324b43545e23430 change file
84acd3434b3348a80989ce8e3437341e23240243 add content
99bf354c43544542b48f9e909c05226233bf755030 create a file

在git中使用HEAD表示當(dāng)前版本,HEAD^HEAD~0 表示上一個版本,當(dāng)然也可以根據(jù)commitId來確定版本。
重點(diǎn)來了:
有了這些鋪墊,就可以開始操作版本回退了。

git reset --hard 834ab3343cc23e43c2435e43a324b43545e23430
這一操作就可以回退到commit id為834ab3343cc23e43c2435e43a324b43545e23430的這個版本去。
或者還有一個辦法,就是根據(jù)HEAD來指定回退到哪個版本去。
git reset --hard HEAD^ 或者 git reset --hard HEAD~0 即回退到上個版本

但是,現(xiàn)在你又想回退到剛才未回退之前的版本,應(yīng)該怎么辦尼?你依然可以使用git reset --hard commitId的方式來操作,你可以使用git reflog來查看你想去的版本的commitId.
好了關(guān)于本地分支的回退操作就先說到這里。

遠(yuǎn)程分支回退

這種情況就是前面跟大家分析的第二種可能的問題,大家將本地的的分支推送到遠(yuǎn)程分支了,但是發(fā)現(xiàn)分支有錯誤,想要將遠(yuǎn)程分支回退。

git reflog
git reset --hard commit ID
git push -f origin //注意前面先操作本地分支回退,之后必須強(qiáng)制push,進(jìn)行覆蓋。

這里的有一個前提是:這個遠(yuǎn)程分支是你自己維護(hù)的遠(yuǎn)程分支,而并協(xié)作的遠(yuǎn)程分支。

最后,就來介紹下公共的遠(yuǎn)程分支,也就是協(xié)作開發(fā)時所用的遠(yuǎn)程分支。

公共遠(yuǎn)程分支回退

對于公共的遠(yuǎn)程分支,我介紹以下方式:

git revert HEAD //撤銷最近一次提交
git revert HEAD~1 //撤銷上上次的提交,
git revert commitId //撤銷commitId這次提交

這里git revert 命令意思是撤銷某次提交。但是它會產(chǎn)生一個新的提交,雖然代碼回退了,但是版本依然是向前的,所以,當(dāng)你用revert回退之后,所有人pull之后,他們的代碼也自動的回退了。

給點(diǎn)tips

  • revert 是撤銷一次提交,所以后面的commitId是你需要回滾到的版本的前一次提交.
  • 使用revert HEAD是撤銷最近的一次提交,如果你最近一次提交是用revert命令產(chǎn)生的,那么你再執(zhí)行一次,就相當(dāng)于撤銷了上次的撤銷操作,換句話說,你連續(xù)執(zhí)行兩次revert HEAD命令,就跟沒執(zhí)行是一樣的.
  • 使用revert HEAD~1表示撤銷最近2次提交,這個數(shù)字是從0開始的,如果你之前撤銷過產(chǎn)生了commitId,那么也會計算在內(nèi)的。
  • 如果使用 revert 撤銷的不是最近一次提交,那么一定會有代碼沖突,需要你合并代碼,合并代碼只需要把當(dāng)前的代碼全部去掉,保留之前版本的代碼就可以了.
    git revert 命令的好處就是不會丟掉別人的提交,即使你撤銷后覆蓋了別人的
    提交,他更新代碼后,可以在本地用 reset 向前回滾,找到自己的代碼,然后>拉一下分支,再回來合并上去就可以找回被你覆蓋的提交了。

這里提醒一下,使用revert命令,如果不是撤銷的最近一次提交,那么一定會有沖突,如下所示:

<<<<<<< HEAD      //start
全部清空
第一次提交
=======
全部清空
>>>>>>> parent of c24cde7... 全部清空   //end

解決沖突很簡單,但是這里和git rebase的解決沖突方式不同,因?yàn)槲覀冎幌牖氐侥炒翁峤唬虼诵枰旬?dāng)前最新的代碼去掉即可,也就是HEAD標(biāo)記的代碼給清除掉,然后再提交一次就解決沖突了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。