GIT倉庫學習 本地 遠端倉庫版本回退

2021-07-27 06:44:16 字數 4669 閱讀 4221

最近在使用git時遇到了遠端分支需要版本回滾的情況,於是做了一下研究,寫下這篇部落格。

如果提交了乙個錯誤的版本,怎麼回退版本?

如果提交了乙個錯誤的版本到遠端分支,怎麼回退遠端分支版本?

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

如果你在本地做了錯誤提交,那麼回退版本的方法很簡單 

先用下面命令找到要回退的版本的commit id:

git reflog
接著回退版本:

git

reset--

hard

obfafd

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

如果你的錯誤提交已經推送到自己的遠端分支了,那麼就需要回滾遠端分支了。 

首先要回退本地分支:

git

reflog

gitreset--

hard

obfafd

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

git push -f
注意:本地分支回滾後,版本將落後遠端分支,必須使用強制推送覆蓋遠端分支,否則無法推送到遠端分支

看到這裡,相信你已經能夠回滾遠端分支的版本了,那麼你也許會問了,回滾公共遠端分支和回滾自己的遠端分支有區別嗎? 

答案是,當然有區別啦。

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

下面來分析:

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

a1–a2–b1

其中a、b分別代表兩個人,a1、a2、b1代表各自的提交。並且所有人的本地分支都已經更新到最新版本,和遠端分支一致。

$ git status

on branch master

your branch is ahead of

'origin/master'

by2 commits.

(use "git push"

to publish your local commits)

nothing to commit, working directory clean

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

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

$ git status

on branch master

your branch is ahead of

'origin/master'

by2 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兩個人的操作

使用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 向前回滾,找到自己的**,然後拉一下分支,再回來合併上去就可以找回被你覆蓋的提交了。

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

<<<<<<< head

全部清空

第一次提交

*****==

全部清空

>>>>>>> parent of c24cde7... 全部清空

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

<<<<<<< head

全部清空

第一次提交

*****==

把上面部分**去掉就可以了,然後再提交一次**就可以解決衝突了。

看到這裡也許你已經覺得學會了遠端倉庫版本回滾方法了,但是實踐中總是會遇到很多不按套路來的問題,考慮下面一種情況:

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

遠端分支回滾的三種方法:

自己的分支回滾直接用reset

公共分支回滾用revert

錯的太遠了直接將**全部刪掉,用正確**替代

Git本地倉庫關聯遠端倉庫

本地建立了乙個工程,開發完成後想要提交到github gitlab上 進入到工程目錄下 cd git demo初始化本地倉庫 git init初始化之後,可以通過ls al檢視本地倉庫檔案,發現此時工程內多出了乙個.git目錄 設定關聯遠端倉庫 git remote add origin命令執行之後...

本地Git倉庫對照多個遠端倉庫

1,新增 remote add origin push u origin master 其中origin就是git本地倉庫指向對應的的乙個本地標識,可以自定義,而push命令中的master指的是遠端倉庫的分支名稱 知道這點就可以狂躁了,因為不同的遠端倉庫,就會有不同的,也就是我們可以在本地取乙個名...

Git 本地遠端倉庫搭建

在日常工作中,如何用資料夾作為乙個git遠端倉庫?步驟1.新建乙個資料夾,假設為d testrepo,啟動git bash 我使用的是git window 32版本 步驟2 切換到目錄d testrepo下,使用git命令,git init bare 建立乙個乾淨的空倉庫 步驟3 從本地倉庫clon...