[Git高級教程(二)] 遠程倉庫版本回退方法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

1 簡介
最近在使用git時遇到了遠程分支需要版本回滾的情況,于是做了一下研究,寫下這篇博客。

2 問題
如果提交了一個錯誤的版本,怎么回退版本?

如果提交了一個錯誤的版本到遠程分支,怎么回退遠程分支版本?

如果提交了一個錯誤的版本到公共遠程分支,又該怎么回退版本?

3 本地分支版本回退的方法
如果你在本地做了錯誤提交,那么回退版本的方法很簡單?
先用下面命令找到要回退的版本的commit id:

git reflog?

接著回退版本:

git reset --hard Obfafd

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

4 自己的遠程分支版本回退的方法
如果你的錯誤提交已經推送到自己的遠程分支了,那么就需要回滾遠程分支了。?
首先要回退本地分支:

git reflog
git reset --hard Obfafd

緊接著強制推送到遠程分支:

git push -f

注意:本地分支回滾后,版本將落后遠程分支,必須使用強制推送覆蓋遠程分支,否則無法推送到遠程分支

5 公共遠程分支版本回退的問題
看到這里,相信你已經能夠回滾遠程分支的版本了,那么你也許會問了,回滾公共遠程分支和回滾自己的遠程分支有區別嗎??
答案是,當然有區別啦。

一個顯而易見的問題:如果你回退公共遠程分支,把別人的提交給丟掉了怎么辦?

下面來分析:

假如你的遠程master分支情況是這樣的:

A1–A2–B1

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

這個時候你發現A2這次提交有錯誤,你用reset回滾遠程分支master到A1,那么理想狀態是你的隊友一拉代碼git pull,他們的master分支也回滾了,然而現實卻是,你的隊友會看到下面的提示:

$ 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

也就是說,你的隊友的分支并沒有主動回退,而是比遠程分支超前了兩次提交,因為遠程分支回退了嘛。

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

git reflog

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

git checkout tony_branch ? ? ? ?//先回到自己的分支 ?
git reflog ? ? ? ? ? ? ? ? ? ? ?//接著看看當前的commit id,例如:0bbbbb ? ?
git reset --hard B1 ? ? ? ? ? ? //回到被覆蓋的那次提交B1
git checkout -b tony_backup ? ? //拉個分支,用于保存之前因為回退版本被覆蓋掉的提交B1
git checkout tony_branch ? ? ? ?//拉完分支,迅速回到自己分支
git reset --hard 0bbbbbb ? ? ? ?//馬上回到自己分支的最前端

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

git reset --hard origin/master

執行了上面這條命令后,Tony的master分支才真正的回滾了,也就是說你的回滾操作才能對Tony生效,這個時候Tony的本地maser是這樣的:

A1

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

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

好了,Tony終于長舒一口氣,這個時候他的master分支是下面這樣的:

A1 – B1

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

同理對于所有隊友也要這樣做,但是如果該隊友沒有提交被你丟掉,那么他拉完代碼git pull之后,只需要強制用遠程master覆蓋掉本地master就可以了:

git reset --hard origin/master

(2) 然而很不幸的是,現實中,我們經常遇到的都是豬一樣的隊友,他們一看到下面提示:

$ 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

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

A1 – A2 – B1

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

注意:博主是在虛擬機中實驗的,用于模擬兩個人的操作,如果你在一個機器上,用同一個賬號在不同的目錄下克隆兩份代碼來實驗的話,回退遠程分支后,另外一個人是不會看到落后遠程分支兩次提交的,所以請務必使用虛擬機來模擬A、B兩個人的操作

6 公共遠程分支版本回退的方法
使用git reset回退公共遠程分支的版本后,需要其他所有人手動用遠程master分支覆蓋本地master分支,顯然,這不是優雅的回退方法,下面我們使用另個一個命令來回退版本:

git revert HEAD ? ? ? ? ? ? ? ? ? ? //撤銷最近一次提交
git revert HEAD~1 ? ? ? ? ? ? ? ? ? //撤銷上上次的提交,注意:數字從0開始
git revert 0ffaacc ? ? ? ? ? ? ? ? ?//撤銷0ffaacc這次提交

git revert 命令意思是撤銷某次提交。它會產生一個新的提交,雖然代碼回退了,但是版本依然是向前的,所以,當你用revert回退之后,所有人pull之后,他們的代碼也自動的回退了。?
但是,要注意以下幾點:

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

7 revert 合并代碼,解決沖突
使用revert命令,如果不是撤銷的最近一次提交,那么一定會有沖突,如下所示:

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

解決沖突很簡單,因為我們只想回到某次提交,因此需要把當前最新的代碼去掉即可,也就是HEAD標記的代碼:

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

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

8 繼續擴展,簡單粗暴的回滾方法
看到這里也許你已經覺得學會了遠程倉庫版本回滾方法了,但是實踐中總是會遇到很多不按套路來的問題,考慮下面一種情況:

如果你們開發中,忽然發現前面很遠的地方有一次錯誤的合并代碼,把本來下一次才能發的功能的代碼合并到了這一次來了,這個時候全體成員都覺得直接回滾比較快,因為他們都有備份,覆蓋了無所謂,這個時候用reset的話對隊友的要求比較高,用revert的話呢要大面積的解決沖突,也很麻煩呀,怎么辦呢?

這個時候,可以使用簡單粗暴的辦法,直接從那個錯誤的提交的前一次拉取一份代碼放到其他目錄,然后將master代碼全部刪除,把那份新代碼方進去,然后提交,果然簡單粗暴啊,雖然這種方法不入流,但是,實踐中發現很好使啊,所以,實踐是檢驗真理的唯一標準。遇到問題還是要靈活應對。?
?

9 總結
遠程分支回滾的三種方法:

自己的分支回滾直接用reset
公共分支回滾用revert
錯的太遠了直接將代碼全部刪掉,用正確代碼替代
?

轉自”梧桐那時雨”的博客:http://blog.csdn.net/fuchaosz/article/details/52170105
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448307.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448307.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448307.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uplift model學習筆記

一、解決的問題&#xff1a; 通常的 Propensity Model 和 Response Model 只是給目標用戶打了個分&#xff0c;并沒有確保模型的結果可以使得活動的提升最大化&#xff1b;它沒有告訴市場營銷人員&#xff0c;哪個用戶最有可能提升活動響應&#xff1b; 因此&#xff0c;需要另…

必須看透的50個錯覺 人生要看透而不看破!

我們應該感謝命運的多喘&#xff0c;是它用歷練使一顆脆弱心的漸漸變得堅強&#xff0c;變得對一切都充滿了向往。無可否認&#xff0c;只有真正的經歷了一些事物之后&#xff0c;你才會對人生看得更加透徹&#xff0c;才會對世間真情感悟的更加真切。 1、個人只能被現實改變…

設計模式之依賴倒置原則

在傳統的過程式中&#xff0c;上層依賴于底層&#xff0c;當底層變化&#xff0c;上層也得跟著做出相應的變化。這就是面向過程的思想&#xff0c;弊端就是導致程序的復用性降低并且提高了開發的成本。 而面向對象的開發則很好的解決了這個問題&#xff0c;讓用戶程序依賴于抽象…

@Transactional 詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Transactional 是聲明式事務管理 編程中使用的注解 1 .添加位置 1&#xff09;接口實現類或接口實現方法上&#xff0c;而不是接口類中…

LiveGBS高性能GB28181國標流媒體服務流傳輸模式支持UDP、TCP被動、TCP主動模式

LiveGBS國標(GB28181)流媒體服務軟件&#xff1a; 提供用戶管理及Web可視化頁面管理&#xff1b; 提供設備狀態管理&#xff0c;可實時查看設備是否掉線等信息&#xff1b; 實時流媒體處理&#xff0c;PS&#xff08;TS&#xff09;轉ES&#xff1b; 設備狀態監測、云臺控制、錄…

通過人行橫道線

學車中的通過人行橫道線 人行橫道線&#xff0c;俗稱斑馬線&#xff0c;是由一條一條的白色線組成的&#xff0c;主要是用來讓行人穿越馬路的。 駕駛員駕駛車輛通過人行橫道時應該減速緩行&#xff0c;注意禮讓行人。 考核要求 當駕車進入路面有施劃人行橫道線的&#xf…

python學習-38迭代器和生成器

迭代器和生成器---- 迭代器協議和for循環工作機制1.迭代器協議&#xff1a;對象必須提供一個next方法&#xff0c;執行該方法要么返回迭代中的下一項&#xff0c;要么引起一個Stoplteration異常&#xff0c;以終止迭代&#xff08;只能往后走&#xff0c;不能往前走&#xff09…

[轉載]基于Aaf的數據拆分

(本文適于使用Aaf框架的開發者閱讀) 1. 基本原理 在Aaf框架中&#xff0c;“對象”和“存儲”的關系映射有一個關鍵的紐帶StorageAlias&#xff0c;即“存儲別名”&#xff0c;同樣一個類型&#xff0c;在不同的存儲別名下&#xff0c;可以自由映射到任意存儲“位置”。  “位…

靠邊停車

什么是靠邊停車 靠邊停車是大路考中一個指標很明確的考核項目&#xff0c;要求學員駕駛車輛使之靠邊停下。 操作方法 1、停車前&#xff0c;要通過內、外后視鏡觀察后方和右側交通情況&#xff0c;開右轉向燈。 2、適量踩下制動踏板。 3、向右轉動方向盤(第一把輪…

RuntimeException 和 Exception 區別、異常的子父級關系

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.java 將所有的錯誤封裝為一個對象&#xff0c;其根本父類為Throwable, Throwable 有兩個子類&#xff1a;Error 和 Exception。 2.Err…

通過路口

操作方法 1、讓車減速 2、觀察路口的情況 3、通過路口 注意事項 1、不要搶黃燈 2、不要開英雄車&#xff0c;即紅燈亮起時通過路口的最后一輛車 3、控制車速&#xff0c;控制在50km/h以下 4、看到左右車都減速時&#xff0c;也馬上減速 5、要左轉…

C語言筆記(關鍵字)

gdb調試 gcc 源程序 -g&#xff1b;加gdb調試信息gdb可執行程序&#xff1b;&#xff08;gdb調試&#xff09;l&#xff08;ist&#xff09;&#xff1a;查看源碼&#xff0c;按一下從main開始10行以此往后l n&#xff1a;查看n處上下10行的源碼run&#xff1a;運行程序b&…

自定義 Git - Git 鉤子 (自動部署)

Git 鉤子 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 和其它版本控制系統一樣&#xff0c;Git 能在特定的重要動作發生時觸發自定義腳本。 有兩組這樣的鉤子&#xff1a;客戶端的和…

變更車道

操作方法 1、觀察與判斷觀察車輛后方、側方和準備變更的車道上的交通流情況&#xff1b; 2、確認安全后&#xff0c;打開轉向指示燈示意&#xff0c;并再次通過后視鏡觀察兩側道路上有無車輛超越&#xff0c;確認準備駛入的車道是否允許留有安全距離&#xff1b; 3…

C語言筆記(符號)

注釋符號 幾個似非而是的注釋問題 例子&#xff1a; (A) int / * ... * /i; (B) char * s "abcdefgh //hijklmn"; (C) //Is it a \valid comment? (D) in/ * ... * /t i; 我們知道C語言里可以有兩種注釋方式&#xff1a;“/* */” 和 “ // ”。那么上面幾條…

直線行駛

考核要求 保證跟車安全速度和安全距離&#xff0c;了解車輛行駛速度、注意觀察路面狀況&#xff0c;采取相應措施。不能有左右擺動、方向不穩的現象。 考試口訣 一.尋找中心 二.雙眼鎖定本車能通行的中心 三.心理想著走中間 四.雙眼從本車前面最突出點的.中心…

java 命令: jmap 命令使用 ( 查看內存使用、設置 )

jdk安裝后會自帶一些小工具&#xff0c;jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節。 jmap命令可以獲得運行中的jvm的堆的快照&#xff0c;從而可以離線分析堆&#xff0c;以檢查內存泄漏&am…

第一節 接口概述 [轉貼]

接口&#xff08;interface&#xff09;用來定義一種程序的協定。實現接口的類或者結構要與接口的定義嚴格一致。有了這個協定&#xff0c;就可以拋開編程語言的限制&#xff08;理論上&#xff09;。接口可以從多個基接口繼承&#xff0c;而類或結構可以實現多個接口。接口可以…

獲取本機用戶名、MAC地址、IP地址、硬盤ID、CPU序列號、系統名稱、物理內存

我們在利用C#開發桌面程序&#xff08;Winform&#xff09;程序的時候&#xff0c;經常需要獲取一些跟系統相關的信息&#xff0c;例如用戶名、MAC地址、IP地址、硬盤ID、CPU序列號、系統名稱、物理內存等。 首先需要引入命名空間&#xff1a; using System.Management; //…

只用一套解決方案,就可解決80%的交通物流行業信息難題

行業背景 新中國成立70多年來&#xff0c;中國交通運輸總體上已經形成了多節點、全覆蓋的綜合運輸網絡&#xff0c;“五縱五橫”綜合運輸大通道基本貫通&#xff0c;一大批綜合客運、貨運樞紐站場&#xff08;物流園區&#xff09;投入運營&#xff0c;取得了一系列矚目成果&am…