答案是,當然有區別啦。
乙個顯而易見的問題:如果你回退公共遠端分支,把別人的提交給丟掉了怎麼辦?下面來分析:
假如你的遠端master分支情況是這樣的:
a1–a2–b1其中a、b分別代表兩個人,a1、a2、b1代表各自的提交。並且所有人的本地分支都已經更新到最新版本,和遠端分支一致。
$ 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 reflog //先檢視a1的那次提交的版本號,再reset,並且拉乙個分支
$ 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_backup分支最新的一次提交就是b1,要把自己的本地master分支和遠端master分支保持一致:
$ git reset --hard origin/master
執行了上面這條命令後,他master分支才真正的回滾了,也就是說你的回滾操作才能對tony生效,這個時候tony的本地maser是這樣的:
a1接著tony要再次合併那個被丟掉的b1提交:
$ git checkout master //切換到master
$ git merge tony_backup //再合併一次帶有b1的分支到master
這個時候他的master分支是下面這樣的:
a1 – b1把丟掉的b1給找回來了,接著他push一下,你一拉也能同步。
同理對於所有隊友也要這樣做,但是如果該隊友沒有提交被你丟掉,那麼他拉完**git pull之後,只需要強制用遠端master覆蓋掉本地master就可以了:
$ git reset --hard origin/master
可以用下邊的方法來實現:
使用git reset回退公共遠端分支的版本後,需要其他所有人手動用遠端master分支覆蓋本地master分支,實際中根本不可能這麼做的,下面我們使用另個乙個命令來回退版本:
$ git revert head //撤銷最近一次提交
$ git revert head~1 //撤銷上上次的提交,注意:數字從0開始
$ git revert 0fadinf //撤銷0fadinf這次提交
git revert 命令意思是撤銷某次提交。它會產生乙個新的提交,雖然**回退了,但是版本依然是向前的,所以,當你用revert回退之後,所有人pull之後,他們的**也自動的回退了。
但是,要注意以下幾點:
revert 是撤銷一次提交,所以後面的commit id是你需要回滾到的版本的前一次提交git revert 命令的好處就是不會丟掉別人的提交,即使你撤銷後覆蓋了別人的提交,他更新**後,可以在本地用 reset 向前回滾,找到自己的**,然後拉一下分支,再回來合併上去就可以找回被你覆蓋的提交了。使用revert head是撤銷最近的一次提交,如果你最近一次提交是用revert命令產生的,那麼你再執行一次,就相當於撤銷了上次的撤銷操作,換句話說,你連續執行兩次revert head命令,就跟沒執行是一樣的
使用revert head~1 表示撤銷最近2次提交,這個數字是從0開始的,如果你之前撤銷過產生了commi id,那麼也會計算在內的。
如果使用 revert 撤銷的不是最近一次提交,那麼一定會有**衝突,需要你合併**,合併**只需要把當前的**全部去掉,保留之前版本的**就可以了.
使用revert命令,如果不是撤銷的最近一次提交,那麼一定會有衝突,如下所示:
<<<<<<< head
全部清空
第一次提交
*****==
全部清空
>>>>>>> parent of c24cde7... 全部清空
解決衝突很簡單,因為我們只想回到某次提交,因此需要把當前最新的**去掉即可,也就是head標記的**:
<<<<<<< head
全部清空
第一次提交
*****==
把上面部分**去掉就可以了,然後再提交一次**就可以解決衝突了。
看到這裡也許你已經覺得學會了遠端倉庫版本回滾方法了,但是實踐中總是會遇到很多不按套路來的問題,考慮下面一種情況:
如果你們開發中,忽然發現前面很遠的地方有一次錯誤的合併**,把本來下一次才能發的功能的**合併到了這一次來了,這個時候全體成員都覺得直接回滾比較快,因為他們都有備份,覆蓋了無所謂,這個時候用reset的話對隊友的要求比較高,用revert的話呢要大面積的解決衝突,也很麻煩呀,怎麼辦呢?這個時候,可以使用簡單粗暴的辦法,直接從那個錯誤的提交的前一次拉取乙份**放到其他目錄,然後將master**全部刪除,把那份新**方進去,然後提交,果然簡單粗暴啊,雖然這種方法不入流,但是,實踐中發現很好使啊,所以,實踐是檢驗真理的唯一標準。遇到問題還是要靈活應對。
遠端分支回滾的三種方法:
自己的分支回滾直接用reset公共分支回滾用revert
錯的太遠了直接將**全部刪掉,用正確**替代
用-r引數刪除目錄,git rm --cached a.txt刪除的是本地倉庫中的檔案,且本地工作區的檔案會保留且不再與遠端倉庫發生跟蹤關係,如果本地倉庫中的檔案也要刪除則用git rm a.txt
硬碟刪除檔案後,執行git status
會提示你仍然需要git rm 《檔案》 【同上】
此時如果是要刪除大批量檔案,這麼乙個乙個命令下去不得累死人啊
其實可以這樣(不管之前有沒有已經本地物理刪除)
執行 $ git rm * -r(記得,cd 到你要刪除的目錄下。當然 * 可以換成指定目錄)
這時刪除檔案已經進入本地快取區,
接下來就是正常的提交操作了
Git 快速入門
一種分布式版本控制系統。版本庫是集中存放在 伺服器的,而幹活的時候,用的都是自己的電腦,所以要先從 伺服器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給 伺服器。伺服器就好比是乙個圖書館,你要改一本書,必須先從圖書館借出來,然後回到家自己改,改完了,再放回圖書館。集中式版本控制系統最大的...
git快速入門
我們的 倉庫是用gitlab來管理的,要檢視自己能訪問哪些倉庫,以及倉庫的位址,請先熟悉一下gitlab系統的使用 gitlab入門 以下教程假設你已經知道如何在系統開啟終端視窗,並知道如何輸入shell命令。現在開啟終端,然後繼續。在提交 之前必須設定自己的使用者名稱和email git conf...
快速入門git
1.1 git是什麼 git是一種版本控制器.更直白說,團隊開發時,管理 用的軟體.面試時,容易被問到的乙個東西.1.2 安裝 ubuntu,debian sudo apt get install gitcentions,redhat系統 yum install git1.3報家門 人在江湖,豈能沒...