Git如何優(yōu)雅地回退代碼
來源:cnblogs.com/zhenbianshu/p/12018714.html
前言
基礎(chǔ)試探
revert
git revert commit_id
能產(chǎn)生一個 與 commit_id 完全相反的提交,即 commit_id 里是添加, revert 提交里就是刪除。
mainline
Reset
reset
了, reset 也能使代碼回到某次提交,但跟 revert 不同的是, reset 是將提交的 HEAD 指針指到某次提交,之后的提交記錄會消失,就像從沒有過這么一次提交。
--hard
選項完全拋棄這些舊代碼,reset 后再強制推到遠端。
master> git reset --hard commit_id
master> git push --force origin master
reflog
恢復(fù),但也是一番折騰。
升級融合
rebase
rebase
把多個提交合并成一個提交,再使用 revert 產(chǎn)生一次反提交,這種方法的思路非常清晰,把 revert 和 rebase 兩個命令搭配得很好,相當于使用 revert 回退的升級版。
-
首先,切出一個新分支 F,使用 git log 查詢一下 要回退到
的 commit 版本 N。 -
使用命令 git rebase -i N
, -i 指定交互模式后,會打開 git rebase 編輯界面,形如:pick 6fa5869 commit1
pick 0b84ee7 commit2
pick 986c6c8 commit3
pick 91a0dcc commit4 這些 commit 自舊到新由上而下排列,我們只需要在 commit_id 前添加操作命令即可。
在合并 commit 這個需求里,我們可以選擇
pick(p)
最舊的 commit1,然后在后續(xù)的 commit_id 前添加squash(s)
命令,將這些 commits 都合并到最舊的 commit1 上。-
保存 rebase 結(jié)果后,再編輯 commit 信息,使這次 rebase 失效,git 會將之前的這些 commit 都刪除,并將其更改合并為一個新的 commit5 如果出錯了,也可以使用
git rebase --abort/--continue/--edit-todo
-
這個時候,主分支上的提交記錄是 older, commit1, commit2, commit3, commit4
而 F 分支上的提交記錄是 older, commit5
,由于 F 分支的祖先節(jié)點是 older,明顯落后于主分支的 commit4,將 F 分支向主分支合并是不允許的所以我們需要執(zhí)行
git merge master
將主分支向 F 分支合并,合并后 git 會發(fā)現(xiàn) commit1 到 commit4 提交的內(nèi)容和 F 分支上 commit5 的修改內(nèi)容是完全相同的,會自動進行合并,內(nèi)容不變,但多了一個 commit5。 再在 F 分支上對 commit5 進行一次 revert 反提交,就實現(xiàn)了把 commit1 到 commit4 的提交全部回退。
文件操作
從主分支上切出一個跟主分支完全相同的分支 F。
從文件管理系統(tǒng)復(fù)制項目文件夾為 bak,在 bak 內(nèi)使用
git checkout N
將代碼切到想要的歷史提交,這時候 git 會將 bak 內(nèi)的文件恢復(fù)到 N 狀態(tài)。在從文件管理系統(tǒng)內(nèi),將 bak 文件夾下
除了 .git
文件夾下的所有內(nèi)容復(fù)制粘貼到原項目目錄下。git 會純從文件級別識別到變更,然后更新工作區(qū)。在原項目目錄下執(zhí)行
add 和 commit
,完成反提交。
小結(jié)
revert 適合需要回退的歷史提交不多,且無合并沖突的情景。
如果你可以向 master 強推代碼,且想讓 git log 里不再出現(xiàn)被回退代碼的痕跡,可以使用
git reset --hard + git push --force
如果你有些 geek,追求用”正規(guī)而正統(tǒng)”的方式來回退代碼,rebase + revert 滿足你的需求。
如果你不在乎是否優(yōu)雅,想用最簡單,最直接的方式,文件操作正合適。
-END-
推薦閱讀
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!