Git版本回退方式(一)

一、前序

在之前學習編程的時候,只是會敲代碼,有時候代碼寫的出問題了,相會推到之前的某個樣子,一種都是用Ctrl+z,方法笨,而且在保存不同版本的時候,都是自己打成壓縮包,到最後把自己也給搞暈了.在前幾天,因爲自己的粗心,搞錯了遠程的兩條分支的具體用處,將他們直接merge了.結果你們可以想象的到,成片的衝突,解決這些衝突必定花費大部分時間,索性直接將他們都回退.
[廖雪峯的Git的教程](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
我git學習入門的時候也是從這裏開始的,但是入門畢竟是入門,在使用過程中遇到的問題還是不夠的,所以想總結一下實際工作和學習中遇到的問題.

二、常用流程

ps:以下的長單橫線均爲雙橫線(markdown編輯器的問題)
1.git clone XX(XX是已經fork他人的或者是自己的profile).
2.git add XX(XX爲自己要提交的文件).
3.git commit -m “XX(爲本次提交的目的)” 或者 直接git commit也可以.
4.git push 加對應的遠程分支.
git reset –hard origin/master回退如果想刪除遠程的錯誤提交,可以用git push –force 來避免服務器拒絕…落後…的情況.

reset命令的3種方式

1.git reset –mixed:此方式爲默認方式,不帶任何參數的git reset,即時使用這種方式,他會會退到某個版本,只保留源碼,回退commit和index信息.
2:git reset –soft:回退到某個版本,只回退了commit的信息,不會恢復到index file一級。如果還要提交,直接commit即可
3:git reset –hard:徹底回退到某個版本,本地的源碼也會變爲上一個版本的內容

回退所有內容到上一個版本

git reset HEAD^

回退某個文件到上一個版本

git reset HEAD^ XXX

向前回退到第三個版本

git reset –soft HEAD~3

將本地的狀態會退到和遠程一樣

git reset –hard origin/master(easy way)
這裏origin是上文的somemarks,項目持有者的別稱
之後再
git rebase FETCH_HEAD

回退到某個版本

git reset <版本號>

回退到上次提交的狀態,按照某一次的commit完全反向的進行一次commit

簡單方式:git revert HEAD

如果我們某次修改了某些內容,並且已經commit到本地倉庫,而且已經push到遠程倉庫了

這種情況下,我們想把本地和遠程倉庫都回退到某個版本,該怎麼做呢?

前面講到的git reset只是在本地倉庫中回退版本,而遠程倉庫的版本不會變化

這樣,即時本地reset了,但如果再git pull,那麼,遠程倉庫的內容又會和本地之前版本的內容進行merge

這並不是我們想要的東西,這時可以有幾種辦法來解決這個問題:

1:直接在遠程server的倉庫目錄下,執行git reset –soft 10efa來回退。注意:在遠程不能使用mixed或hard參數

2:在本地直接把遠程的master分支給刪除,然後再把reset後的分支內容給push上去,(俗稱暴力回退法)如下:

新建old_master分支做備份

git branch old_master

push到遠程

git push origin old_master:old_master

本地倉庫回退到某個版本

git reset –hard bae168

刪除遠程的master分支

git push origin :master

重新創建master分支

git push origin master

在刪除遠程master分之的時候,可能會出現以下問題:

$ git push origin :master
error: By default, deleting the current branch is denied, because the next
error: ‘git clone’ won’t result in any file checked out, causing confusion.
error:
error: You can set ‘receive.denyDeleteCurrent’ configuration variable to
error: ‘warn’ or ‘ignore’ in the remote repository to allow deleting the
error: current branch, with or without a warning message.
error:
error: To squelch this message, you can set it to ‘refuse’.
error: refusing to delete the current branch: refs/heads/master
To [email protected]:gitosis_test
! [remote rejected] master (deletion of the current branch prohibited)
error: failed to push some refs to ‘[email protected]:gitosis_test’

需要你在遠程倉庫的目錄下,設置git的receive.denyDeleteCurrent參數

git receive.denyDeleteCurrent warn

然後,就可以刪除遠程的master分支了
雖然說有以上2種方法可以回退遠程分支的版本,但這2種方式,都挺危險的,需要謹慎操作……

3:
1. 首先執行git log查看需要回退的commit id
2. 然後執行git reset –hard commit_id,回退本地版本
3. 最後執行git push orgin master –force,將遠程版本回退

需要注意的是,這種方法徹底丟失了commit_id後的修改.

4:(有選擇的改寫提交歷史的方法)
1. git rebase -i commit_id~1,進入交互式rebase
2. 在git自動打開的編輯器中將該commit行首的pick命令修改爲edit並保存
3. 修改相應的file,在這個例子中即刪除相應“私有”代碼
4. git add file
5. git commit –amend
6. 如果有衝突,解決衝突後git add file
7. git rebase –continue
8. git push [host] [branch] -f

如果想捨棄掉整個提交,在第二部中,將pick改爲drop,然後進入第6不
這樣就在不影響其他提交的情況下改寫了歷史(這裏的commit_id指的是錯誤提交的那次).

發佈了45 篇原創文章 · 獲贊 30 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章