日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

【git】远程仓库版本回退方法

發(fā)布時(shí)間:2024/8/26 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 【git】远程仓库版本回退方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 簡(jiǎn)介

最近在使用git時(shí)遇到了遠(yuǎn)程分支需要版本回滾的情況,于是做了一下研究,寫(xiě)下這篇博客。

2 問(wèn)題

如果提交了一個(gè)錯(cuò)誤的版本,怎么回退版本?

如果提交了一個(gè)錯(cuò)誤的版本到遠(yuǎn)程分支,怎么回退遠(yuǎn)程分支版本?

如果提交了一個(gè)錯(cuò)誤的版本到公共遠(yuǎn)程分支,又該怎么回退版本?

3 本地分支版本回退的方法

如果你在本地做了錯(cuò)誤提交,那么回退版本的方法很簡(jiǎn)單
先用下面命令找到要回退的版本的commit id:

git reflog 

接著回退版本:

git reset --hard Obfafd

0bfafd就是你要回退的版本的commit id的前面幾位

4 自己的遠(yuǎn)程分支版本回退的方法

如果你的錯(cuò)誤提交已經(jīng)推送到自己的遠(yuǎn)程分支了,那么就需要回滾遠(yuǎn)程分支了。
首先要回退本地分支:

git reflog
git reset --hard Obfafd

緊接著強(qiáng)制推送到遠(yuǎn)程分支:

git push -f

注意:本地分支回滾后,版本將落后遠(yuǎn)程分支,必須使用強(qiáng)制推送覆蓋遠(yuǎn)程分支,否則無(wú)法推送到遠(yuǎn)程分支

5 公共遠(yuǎn)程分支版本回退的問(wèn)題

看到這里,相信你已經(jīng)能夠回滾遠(yuǎn)程分支的版本了,那么你也許會(huì)問(wèn)了,回滾公共遠(yuǎn)程分支和回滾自己的遠(yuǎn)程分支有區(qū)別嗎?
答案是,當(dāng)然有區(qū)別啦。

一個(gè)顯而易見(jiàn)的問(wèn)題:如果你回退公共遠(yuǎn)程分支,把別人的提交給丟掉了怎么辦?

下面來(lái)分析:

假如你的遠(yuǎn)程master分支情況是這樣的:

A1–A2–B1

其中A、B分別代表兩個(gè)人,A1、A2、B1代表各自的提交。并且所有人的本地分支都已經(jīng)更新到最新版本,和遠(yuǎn)程分支一致。

這個(gè)時(shí)候你發(fā)現(xiàn)A2這次提交有錯(cuò)誤,你用reset回滾遠(yuǎn)程分支master到A1,那么理想狀態(tài)是你的隊(duì)友一拉代碼git pull,他們的master分支也回滾了,然而現(xiàn)實(shí)卻是,你的隊(duì)友會(huì)看到下面的提示:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

也就是說(shuō),你的隊(duì)友的分支并沒(méi)有主動(dòng)回退,而是比遠(yuǎn)程分支超前了兩次提交,因?yàn)檫h(yuǎn)程分支回退了嘛。

(1) 這個(gè)時(shí)候,你大吼一聲:兄弟們,老子回退版本了。如果你的隊(duì)友都是神之隊(duì)友,比如: Tony(騰訊CTO),那么Tony會(huì)冷靜的使用下面的命令來(lái)找出你回退版本后覆蓋掉的他的提交,也就是B1那次提交:

git reflog

然后冷靜的把自己的分支回退到那次提交,并且拉個(gè)分支:

git checkout tony_branch        //先回到自己的分支  
git reflog                      //接著看看當(dāng)前的commit id,例如:0bbbbb    
git reset --hard B1             //回到被覆蓋的那次提交B1
git checkout -b tony_backup     //拉個(gè)分支,用于保存之前因?yàn)榛赝税姹颈桓采w掉的提交B1
git checkout tony_branch        //拉完分支,迅速回到自己分支
git reset --hard 0bbbbbb        //馬上回到自己分支的最前端

通過(guò)上面一通敲,Tony暫時(shí)舒了一口氣,還好,B1那次提交找回來(lái)了,這時(shí)tony_backup分支最新的一次提交就是B1,接著Tony要把自己的本地master分支和遠(yuǎn)程master分支保持一致:

git reset --hard origin/master

執(zhí)行了上面這條命令后,Tony的master分支才真正的回滾了,也就是說(shuō)你的回滾操作才能對(duì)Tony生效,這個(gè)時(shí)候Tony的本地maser是這樣的:

A1

接著Tony要再次合并那個(gè)被丟掉的B1提交:

git checkout master             //切換到master
git merge tony_backup           //再合并一次帶有B1的分支到master

好了,Tony終于長(zhǎng)舒一口氣,這個(gè)時(shí)候他的master分支是下面這樣的:

A1 – B1

終于把丟掉的B1給找回來(lái)了,接著他push一下,你一拉也能同步。

同理對(duì)于所有隊(duì)友也要這樣做,但是如果該隊(duì)友沒(méi)有提交被你丟掉,那么他拉完代碼git pull之后,只需要強(qiáng)制用遠(yuǎn)程master覆蓋掉本地master就可以了

git reset --hard origin/master

(2) 然而很不幸的是,現(xiàn)實(shí)中,我們經(jīng)常遇到的都是豬一樣的隊(duì)友,他們一看到下面提示:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

就習(xí)慣性的git push一下,或者他們直接用的SourceTree這樣的圖形界面工具,一看到界面上顯示的是推送的提示就直接點(diǎn)了推送按鈕,臥&槽,你辛辛苦苦回滾的版本就這樣輕松的被你豬一樣的隊(duì)友給還原了,所以,只要有一個(gè)隊(duì)友push之后,遠(yuǎn)程master又變成了:

A1 – A2 – B1

這就是分布式,每個(gè)人都有副本。這個(gè)時(shí)候你連揍他的心都有了,怎么辦呢?你不能指望每個(gè)人隊(duì)友都是git高手,下面我們用另外一種方法來(lái)回退版本。

注意:博主是在虛擬機(jī)中實(shí)驗(yàn)的,用于模擬兩個(gè)人的操作,如果你在一個(gè)機(jī)器上,用同一個(gè)賬號(hào)在不同的目錄下克隆兩份代碼來(lái)實(shí)驗(yàn)的話(huà),回退遠(yuǎn)程分支后,另外一個(gè)人是不會(huì)看到落后遠(yuǎn)程分支兩次提交的,所以請(qǐng)務(wù)必使用虛擬機(jī)來(lái)模擬A、B兩個(gè)人的操作

6 公共遠(yuǎn)程分支版本回退的方法

使用git reset回退公共遠(yuǎn)程分支的版本后,需要其他所有人手動(dòng)用遠(yuǎn)程master分支覆蓋本地master分支,顯然,這不是優(yōu)雅的回退方法,下面我們使用另個(gè)一個(gè)命令來(lái)回退版本:

git revert HEAD                     //撤銷(xiāo)最近一次提交
git revert HEAD~1                   //撤銷(xiāo)上上次的提交,注意:數(shù)字從0開(kāi)始
git revert 0ffaacc                  //撤銷(xiāo)0ffaacc這次提交

git revert 命令意思是撤銷(xiāo)某次提交。它會(huì)產(chǎn)生一個(gè)新的提交,雖然代碼回退了,但是版本依然是向前的,所以,當(dāng)你用revert回退之后,所有人pull之后,他們的代碼也自動(dòng)的回退了。
但是,要注意以下幾點(diǎn):

revert 是撤銷(xiāo)一次提交,所以后面的commit id是你需要回滾到的版本的前一次提交
使用revert HEAD是撤銷(xiāo)最近的一次提交,如果你最近一次提交是用revert命令產(chǎn)生的,那么你再執(zhí)行一次,就相當(dāng)于撤銷(xiāo)了上次的撤銷(xiāo)操作,換句話(huà)說(shuō),你連續(xù)執(zhí)行兩次revert HEAD命令,就跟沒(méi)執(zhí)行是一樣的
使用revert HEAD~1 表示撤銷(xiāo)最近2次提交,這個(gè)數(shù)字是從0開(kāi)始的,如果你之前撤銷(xiāo)過(guò)產(chǎn)生了commi id,那么也會(huì)計(jì)算在內(nèi)的。
如果使用 revert 撤銷(xiāo)的不是最近一次提交,那么一定會(huì)有代碼沖突,需要你合并代碼,合并代碼只需要把當(dāng)前的代碼全部去掉,保留之前版本的代碼就可以了.

git revert 命令的好處就是不會(huì)丟掉別人的提交,即使你撤銷(xiāo)后覆蓋了別人的提交,他更新代碼后,可以在本地用 reset 向前回滾,找到自己的代碼,然后拉一下分支,再回來(lái)合并上去就可以找回被你覆蓋的提交了。

7 revert 合并代碼,解決沖突

使用revert命令,如果不是撤銷(xiāo)的最近一次提交,那么一定會(huì)有沖突,如下所示:

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

解決沖突很簡(jiǎn)單,因?yàn)槲覀冎幌牖氐侥炒翁峤唬虼诵枰旬?dāng)前最新的代碼去掉即可,也就是HEAD標(biāo)記的代碼:

<<<<<<< HEAD
全部清空
第一次提交
=======

把上面部分代碼去掉就可以了,然后再提交一次代碼就可以解決沖突了。

8 繼續(xù)擴(kuò)展,簡(jiǎn)單粗暴的回滾方法

看到這里也許你已經(jīng)覺(jué)得學(xué)會(huì)了遠(yuǎn)程倉(cāng)庫(kù)版本回滾方法了,但是實(shí)踐中總是會(huì)遇到很多不按套路來(lái)的問(wèn)題,考慮下面一種情況:

如果你們開(kāi)發(fā)中,忽然發(fā)現(xiàn)前面很遠(yuǎn)的地方有一次錯(cuò)誤的合并代碼,把本來(lái)下一次才能發(fā)的功能的代碼合并到了這一次來(lái)了,這個(gè)時(shí)候全體成員都覺(jué)得直接回滾比較快,因?yàn)樗麄兌加袀浞荩采w了無(wú)所謂,這個(gè)時(shí)候用reset的話(huà)對(duì)隊(duì)友的要求比較高,用revert的話(huà)呢要大面積的解決沖突,也很麻煩呀,怎么辦呢?

這個(gè)時(shí)候,可以使用簡(jiǎn)單粗暴的辦法,直接從那個(gè)錯(cuò)誤的提交的前一次拉取一份代碼放到其他目錄,然后將master代碼全部刪除,把那份新代碼方進(jìn)去,然后提交,果然簡(jiǎn)單粗暴啊,雖然這種方法不入流,但是,實(shí)踐中發(fā)現(xiàn)很好使啊,所以,實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。遇到問(wèn)題還是要靈活應(yīng)對(duì)。
如果你遇到問(wèn)題,歡迎給我留言,我CSDN博客———“梧桐那時(shí)雨”。

9 總結(jié)

遠(yuǎn)程分支回滾的三種方法:

自己的分支回滾直接用reset
公共分支回滾用revert
錯(cuò)的太遠(yuǎn)了直接將代碼全部刪掉,用正確代碼替代

總結(jié)

以上是生活随笔為你收集整理的【git】远程仓库版本回退方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。