使用 Git 進(jìn)行版本管理時,肯定不只做提交,有時候也會需要回退修改,并且在回退的基礎(chǔ)上進(jìn)行重新提交,這時候有幾個常用的命令就需要用到了,下面分別做介紹。
成都創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計、成都網(wǎng)站制作與策劃設(shè)計,新蔡網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:新蔡等地區(qū)。新蔡做網(wǎng)站價格咨詢:18980820575首先,我們查看當(dāng)前提交記錄的命令:
$ git log
commit bfee9d6618bc1deae52ac4a7942b96990bbfe661 (HEAD -> master, origin/master, origin/HEAD)
Author: sylan215
Date: Thu Oct 19 15:19:30 2017 +0800
ddd
commit fbb28efb4e156031704abbf015b12c8ef16031c8
Author: sylan215
Date: Thu Oct 19 15:15:26 2017 +0800
revert
如果 log 太多,可以加上參數(shù) --pretty=oneline
使用:
$ git log --pretty=oneline
bfee9d6618bc1deae52ac4a7942b96990bbfe661 (HEAD -> master, origin/master, origin/HEAD) ddd
fbb28efb4e156031704abbf015b12c8ef16031c8 revert
ca0e36b485a3de75e6e11064aecc22ce100652dd new line
45dcf1bc797a773ca3dee07fc795ef986d10c346 t
5e29356aa7aea31e7e6bce302abbc2259324d806 test
查看本機(jī)命令的執(zhí)行記錄:
$ git reflog
bfee9d6 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: reset: moving to bfee9d6618bc1deae52ac4a7942b96990bbfe661
bfee9d6 (HEAD -> master, origin/master, origin/HEAD) HEAD@{1}: commit: ddd
fbb28ef HEAD@{2}: reset: moving to fbb28efb4e156031704abbf015b12c8ef16031c8
fbb28ef HEAD@{3}: reset: moving to fbb28efb4e156031704abbf015b12c8ef16031c8
fbb28ef HEAD@{4}: commit: revert
ca0e36b HEAD@{5}: reset: moving to ca0e36b485a3de75e6e11064aecc22ce100652dd
ca0e36b HEAD@{6}: commit: new line
45dcf1b HEAD@{7}: reset: moving to 45dcf1
我們可以通過上述兩種方式查看之前的記錄,并找到要回退的版本,回退的版本有兩種表示方法,一個是 commit id,就是那一串字符,一種是相對 HEAD 的序號,看下命令:
$ git reset --hard HEAD^^
HEAD is now at ca0e36b new line
$ git reset --har bfee9d
HEAD is now at bfee9d6 ddd
我們先使用 HEAD^^
回退了兩個版本,然后又使用 bfee9d
這個 commit id 回到了最新版本,注意 HEAD
方式只能回退到舊版本,沒法往新版本前進(jìn), commit id 的方式可以回退到任意有效 id 的版本,至于怎么查看版本對應(yīng)的 id 請看最開始介紹的 git log
和 git reflog
命令。
這個命令我們還可變相達(dá)成丟棄目前所有修改的效果,直接運(yùn)行
git reset --hard HEAD
就行。
回退版本后,我們重新進(jìn)行修改,并提交,會發(fā)現(xiàn)有如下報錯:
$ git add .
$ git commit -am "test reset"
[master 88b1dc8] test reset
1 file changed, 1 insertion(+), 1 deletion(-)
$ git push
To 192.168.252.130:/srv/myfiles.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@192.168.252.130:/srv/myfiles.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
解決方法是使用命令 git push -f
解決:
$ git push -f
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 286 bytes | 286.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 192.168.252.130:/srv/myfiles.git
+ bfee9d6...88b1dc8 master -> master (forced update)
注意:git push -f
是強(qiáng)制提交的意思,如果和 reset 結(jié)合使用,就會把最新版本到 reset 到的版本之間的所有 commit 全部抹掉了,這在多人協(xié)作時,要特別注意。
具體我們通過命令后 git long --pretty=oneline
看得更直觀:
$ git log --pretty=oneline
88b1dc8cb7228f7d1fe14d510a62201a9d584118 (HEAD -> master, origin/master, origin/HEAD) test reset
ca0e36b485a3de75e6e11064aecc22ce100652dd new line
45dcf1bc797a773ca3dee07fc795ef986d10c346 t
5e29356aa7aea31e7e6bce302abbc2259324d806 test
和最上面那一次的輸出對比,commit id ca0e36b485a3de75e6e11064aecc22ce100652dd 之后的兩個提交 id 都被回退了(fbb28efb4e156031704abbf015b12c8ef16031c8 和 bfee9d6618bc1deae52ac4a7942b96990bbfe661)。
使用 reset 是直接抹殺掉 commit 的方式,另外還有一種真正的「回退」命令,就是 revert,它的效果時,在當(dāng)前版本基礎(chǔ)上,刪掉要回退版本的修改內(nèi)容后新建一次提交。
我們看看效果:
$ git log --pretty=oneline
9eecd39b8e6a2109c3678c42dc034db2190840f6 (HEAD -> master, origin/master, origin/HEAD) change
e4f5e6920c22b748d765824e0be21015332fafa4 init
$ git revert 9eec
[master f7c9eb4] Revert "change"
1 file changed, 1 insertion(+), 2 deletions(-)
$ git log --pretty=oneline
f7c9eb4120d368915a6e5491bf85dc5cd87a424f (HEAD -> master) Revert "change"
9eecd39b8e6a2109c3678c42dc034db2190840f6 (origin/master, origin/HEAD) change
e4f5e6920c22b748d765824e0be21015332fafa4 init
我們在最新版本的基礎(chǔ)上,把最后一次提交的修改給回退了,同時用回退后版本生成了一次提交,并生成了新的 commit id,這樣所有的操作 log 均得到了正確的保留。
注意:命令 revert 是指回退指定版本的修改內(nèi)容,而不是指指定版本到當(dāng)前版本的所有內(nèi)容,所以如果給定的 commit id 不是當(dāng)前版本的最新 commit id,那么就會報錯:
$ git log --pretty=oneline
45734f3dc12f45e78504bd0fb52ba334c0ae2c9f (HEAD -> master, origin/master, origin/HEAD) test
7c82b777a40dfb24fc1bba404be0daa3b3923a95 test revert
f7c9eb4120d368915a6e5491bf85dc5cd87a424f Revert "change"
9eecd39b8e6a2109c3678c42dc034db2190840f6 change
e4f5e6920c22b748d765824e0be21015332fafa4 init
$ git revert 7c82b
error: could not revert 7c82b77... test revert
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add ' or 'git rm '
hint: and commit the result with 'git commit'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
You are currently reverting commit 7c82b77.
(fix conflicts and run "git revert --continue")
(use "git revert --abort" to cancel the revert operation)
Unmerged paths:
(use "git reset HEAD ..." to unstage)
(use "git add ..." to mark resolution)
both modified: test2.txt
no changes added to commit (use "git add" and/or "git commit -a")
如果上圖,我們跳過了 45734 的修改,想只回退 7c82b 的修改,這時候就提示沖突了,這時候要么手工修改沖突,要么取消 revert 后,一次指定多個 revert id 來實現(xiàn),下面是一次使用多個 revert id 進(jìn)行實現(xiàn):
$ git revert --abort
$ git log --pretty=oneline
45734f3dc12f45e78504bd0fb52ba334c0ae2c9f (HEAD -> master, origin/master, origin/HEAD) test
7c82b777a40dfb24fc1bba404be0daa3b3923a95 test revert
f7c9eb4120d368915a6e5491bf85dc5cd87a424f Revert "change"
9eecd39b8e6a2109c3678c42dc034db2190840f6 change
e4f5e6920c22b748d765824e0be21015332fafa4 init
$ git revert 45734 7c82b
[master 8140eb0] Revert "test"
1 file changed, 1 insertion(+), 3 deletions(-)
[master 191816d] Revert "test revert"
1 file changed, 1 insertion(+), 2 deletions(-)
$ git log --pretty=oneline
191816d84c02a4ba591d3739739ddd0df114d7f1 (HEAD -> master) Revert "test revert"
8140eb0f69493f1a6306b0e92822f07c049a7a50 Revert "test"
45734f3dc12f45e78504bd0fb52ba334c0ae2c9f (origin/master, origin/HEAD) test
7c82b777a40dfb24fc1bba404be0daa3b3923a95 test revert
f7c9eb4120d368915a6e5491bf85dc5cd87a424f Revert "change"
9eecd39b8e6a2109c3678c42dc034db2190840f6 change
e4f5e6920c22b748d765824e0be21015332fafa4 init
這時候如果我們查看文件,會發(fā)現(xiàn) 45734 和 7c82b 的內(nèi)容都被回退了,并新生成了兩次的 commit(每個 commit id 的回退會單獨生成一條記錄)。
特別說明一下,為了保證 revert 的效果,建議每次提交修改的時候,盡量減少非耦合文件的一起提交,分批提交可以更利于以后的 revert。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。