git版本回退的不一樣場景操做

http://blog.csdn.net/aguangg_...前端

本地分支版本回退(只是commit,尚未push到遠程分枝的狀況)

git reflog // 找到要回退的版本的commit id
git reset --hard 84686b426c3a8a3d569ae56b6788278c10b27e5b // 回退版本

本身的遠程分支版本回退(遠程分支只有本身一我的火車其餘人沒有新的操做的狀況)

首先要回退本地分支:git

git reflog  // 找到要回退的版本的commit id
git reset --hard 84686b426c3a8a3d569ae56b6788278c10b27e5b // 回退版本

緊接着強制推送到遠程分支:
本地分支回滾後,版本將落後遠程分支,必須使用強制推送覆蓋遠程分支,不然沒法推送到遠程分支安全

git push -f // 將本地master push 到遠程版本庫中, -f 強制覆蓋。

公共遠程分支版本回退(多人一期開發,其餘人有新的操做的狀況)

git reflog  // 找到要回退的版本的commit id

撤銷到某個版本以前,以前的修改退回到暫存區。soft 和 hard參數的區別就是,hard修改記錄都沒了,soft則會保留修改記錄。.net

git reset --hard 84686b426c3a8a3d569ae56b6788278c10b27e5b // 回退版本

也能夠用3d

git reset –-soft 72bd6304c3c6e1cb7034114db1dd1b8376a6283a // 回退版本
git stash // 暫存爲了安全起見

push到遠程的提交默認是不能修改的,可是必定要修改就要強制覆蓋code

git push -f // 將本地master push 到遠程版本庫中, -f 強制覆蓋。

若是你作了上面的操做,回退公共遠程分支,把別人的提交給丟掉了

假如你的遠程master分支狀況是這樣的:
A1–A2–B1
其中A、B分別表明兩我的,A一、A二、B1表明各自的提交。而且全部人的本地分支都已經更新到最新版本,和遠程分支一致。blog

這個時候你發現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

也就是說,你的隊友B的分支並無主動回退,而是比遠程分支超前了兩次提交,由於遠程分支回退了get

若是一看到界面上顯示的是推送的提示就直接點了推送,回滾的版本就會又被還原,遠程master又變成了:A1 – A2 – B1同步

隊友B的作法:

1.使用下面的命令來找出你回退版本後覆蓋掉的他的提交,也就是B1那次提交:

git reflog   //在master分支找到B1那次提交的commit id,例如:B1

另一種方法來回退版本

2.把本身的分支回退到那次提交,而且拉個分支:

git checkout tony_branch        //先回到本身的分支tony_branch  
git reflog                      //接着在分枝tony_branch看看當前的commit id,例如:0bbbbb    
git reset --hard B1             //回到被覆蓋的那次提交B1
git checkout -b tony_backup     //拉個分支,用於保存以前由於回退版本被覆蓋掉的提交B1
git checkout tony_branch        //拉完分支,迅速回到本身分支
git reset --hard 0bbbbbb        //立刻回到本身分支的最前端0bbbbb HEAD@{0}

3.接着隊友B要把本身的本地master分支和遠程master分支保持一致:

git reset --hard origin/master

執行了上面這條命令後,隊友B的master分支才真正的回滾了,隊友B的本地maser變成了A1

4.接着隊友B要再次合併那個被丟掉的B1提交:

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

這個時候隊友B的master分支A1 -> B1

5.接着隊友B push一下,你pull拉取也能同步

git push // 隊友B push

若是該隊友沒有提交被你丟掉,那麼他拉完代碼git pull以後,只須要強制用遠程master覆蓋掉本地master就能夠了:

git reset --hard origin/master

另一種方法來回退公共遠程分支版本(提倡公共分支回滾用revert這種方法)

使用git reset回退公共遠程分支的版本後,須要其餘全部人手動用遠程master分支覆蓋本地master分支,顯然,這不是優雅的回退方法
另個一個命令來回退版本:

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

git revert 命令意思是撤銷某次提交。它會產生一個新的提交,雖然代碼回退了,可是版本依然是向前的,因此,當你用revert回退以後,全部人pull以後,他們的代碼也自動的回退了。

可是,要注意如下幾點:

  1. revert 是撤銷一次提交,因此後面的commit id是你須要回滾到的版本的前一次提交

  2. 使用revert HEAD是撤銷最近的一次提交,若是你最近一次提交是用revert命令產生的,那麼你再執行一次,就至關於撤銷了上次的撤銷操做,換句話說,你連續執行兩次revert HEAD命令,就跟沒執行是同樣的

  3. 使用revert HEAD~1 表示撤銷最近2次提交,這個數字是從0開始的,若是你以前撤銷過產生了commi id,那麼也會計算在內的。

  4. 若是使用 revert 撤銷的不是最近一次提交,那麼必定會有代碼衝突,須要你合併代碼,合併代碼只須要把當前的代碼所有去掉,保留以前版本的代碼就能夠了.

git revert 命令的好處就是不會丟掉別人的提交,即便你撤銷後覆蓋了別人的提交,他更新代碼後,能夠在本地用 reset 向前回滾,找到本身的代碼,而後拉一下分支,再回來合併上去就能夠找回被你覆蓋的提交了。

使用revert命令,若是不是撤銷的最近一次提交,那麼必定會有衝突
把衝突的代碼去掉就能夠了,而後再提交一次代碼就能夠解決衝突了。

錯的太遠了直接將代碼所有刪掉,用正確代碼替代

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

這個時候,可使用簡單粗暴的辦法:

  1. 直接從那個錯誤的提交的前一次拉取一份代碼放到其餘目錄

  2. 而後將master代碼所有刪除,把那份新代碼方進去

  3. 而後提交

雖然這種方法不入流,可是,實踐中發現很好使啊,因此,實踐是檢驗真理的惟一標準。遇到問題仍是要靈活應對。

相關文章
相關標籤/搜索