IDEA中Git版本回退的兩種實(shí)現(xiàn)方案
一、版本回退前置知識(shí)
在操作前需明確三個(gè)核心概念:工作區(qū) vs 暫存區(qū) vs 倉(cāng)庫(kù)
區(qū)域 | 本質(zhì) | 操作指令 | 場(chǎng)景舉例 |
---|---|---|---|
工作區(qū) | 你正在編輯的代碼文件 | 直接修改文件 | 在 UserService.java 中新增代碼 |
暫存區(qū) | 已標(biāo)記待提交的修改 | git add | 將 UserService.java 添加到提交隊(duì)列 |
倉(cāng)庫(kù) | 已永久保存的歷史版本 | git commit | 生成一個(gè)版本號(hào)為 a1b2c3d 的提交 |
二、Reset方案:整體改寫(xiě)歷史
通過(guò)移動(dòng)HEAD指針直接回退到目標(biāo)版本,會(huì)刪除后續(xù)提交記錄
,適用于本地或需強(qiáng)制同步遠(yuǎn)程的場(chǎng)景。
1、IDEA圖形化操作(推薦)
1.1、查看提交歷史
右鍵項(xiàng)目 → Git → Show History
,或在Log標(biāo)簽頁(yè)查看所有提交記錄。
1.2、選擇目標(biāo)版本
右鍵要回退的提交 → Reset Current Branch to Here
(將當(dāng)前分支重置到此處)。
1.3、選擇回退模式
單擊如上將當(dāng)前分支重置到此處就會(huì)彈窗如下。
解析每個(gè)選項(xiàng)前先看下當(dāng)前項(xiàng)目在所有狀態(tài)的文件
好,四種狀態(tài)文件已經(jīng)準(zhǔn)備完成,開(kāi)始展示
1.3.1、Soft(推薦)
選擇Soft回退后,僅移動(dòng)HEAD指針,所有文件內(nèi)容沒(méi)變化
。Test1變?yōu)樾薷臓顟B(tài),后續(xù)push遠(yuǎn)程版本回退后,可以選擇第一次和第二次的修改內(nèi)容是否再次提交到遠(yuǎn)程倉(cāng)庫(kù)。
1.3.2、Mixed
選擇Mixed回退后,所有文件內(nèi)容沒(méi)變化
(與Soft一樣),只是將暫存區(qū)Test3移除到工作區(qū)
,這樣看來(lái)Soft和Mixed的區(qū)別就是清空暫存區(qū)。
1.3.3、Hard(慎用)
選擇Hard回退后,文件內(nèi)容被還原為第一次提交的狀態(tài)
(Test1第二三提交內(nèi)容和Test3沒(méi)提交的內(nèi)容丟失了),然后暫存區(qū)的整個(gè)文件Test3丟失(沒(méi)有像Soft和Mixed轉(zhuǎn)移到工作區(qū)),總得來(lái)說(shuō)就是所有本地修改都會(huì)丟失
(當(dāng)然不包括工作區(qū)Test4,因?yàn)檫€沒(méi)被git管理)。
此時(shí)還沒(méi)有push到倉(cāng)庫(kù)(后面講),可以更新代碼
將Test1第二三提交的內(nèi)容找回,但是Test2添加的a和Test3的內(nèi)容則找不回了(因?yàn)楫?dāng)時(shí)這些內(nèi)容都在暫存區(qū),然而Hard已經(jīng)清空暫存區(qū),丟棄了所有修改
)
1.3.4、Keep
選擇Keep回退后,回退版本的文件內(nèi)容被還原為第一次提交的狀態(tài)
(Test1第二三提交內(nèi)容沒(méi)了),其他狀態(tài)的文件內(nèi)容沒(méi)有變化(也就是本地修改內(nèi)容沒(méi)丟失
),但是暫存區(qū)文件被移除到工作區(qū)
。
這種方式如果回退版本的時(shí)候Test1有修改內(nèi)容,那么回退的時(shí)候會(huì)彈窗讓你選擇Test1修改沒(méi)提交的內(nèi)容如何處理,類(lèi)似于解決沖突。(麻煩不推薦)
總結(jié)
- Soft 回退:當(dāng)你只想撤回 commit,但不影響文件內(nèi)容,適用于你希望修改提交內(nèi)容或者重新提交時(shí)使用(
推薦
) - Mixed 回退:當(dāng)你想撤銷(xiāo)提交并清理暫存區(qū),但保留文件修改,適用于需要重新整理提交時(shí)使用(感覺(jué)沒(méi)用,想保留文件修改可以使用Soft)
- Hard 回退:當(dāng)你完全不需要當(dāng)前工作和暫存區(qū)的修改,并且想徹底恢復(fù)到某個(gè)提交時(shí)使用,慎用,因?yàn)闊o(wú)法恢復(fù)丟失的內(nèi)容(
保證本地所有修改內(nèi)容都沒(méi)用可以使用
) - Keep 回退:當(dāng)你希望恢復(fù)到某個(gè)提交的版本,但又不丟失本地修改時(shí)使用(恢復(fù)版本的文件的本地內(nèi)容需要手動(dòng)選擇要還是丟,麻煩不推薦)
1.4、強(qiáng)制推送遠(yuǎn)程倉(cāng)庫(kù)
- 回退后本地倉(cāng)庫(kù)版本低于遠(yuǎn)程,需執(zhí)行
強(qiáng)制推送
- 在強(qiáng)制推送遠(yuǎn)程倉(cāng)庫(kù)前,都可以通過(guò)
更新代碼
恢復(fù)上面的版本回退
方式一(不推薦)
git push --force
是強(qiáng)制推送命令,它會(huì)將本地分支的內(nèi)容強(qiáng)行推送到遠(yuǎn)程倉(cāng)庫(kù),覆蓋遠(yuǎn)程分支的歷史記錄。使用此命令時(shí),如果遠(yuǎn)程分支的提交歷史與本地分支不同,推送操作仍會(huì)進(jìn)行
,并且不會(huì)進(jìn)行任何檢查,可能會(huì)丟失遠(yuǎn)程倉(cāng)庫(kù)中的更改。因此,這個(gè)命令需要小心使用,尤其在多人協(xié)作的情況下,可能會(huì)覆蓋他人的更改。
git push --force # 等同于 git push -f
方式二(推薦)
git push --force-with-lease
是 --force
的更安全版本。它會(huì)先檢查遠(yuǎn)程分支是否被其他人更新,若有變動(dòng)則推送失敗并提示,避免覆蓋他人更改
。該命令會(huì)自動(dòng)推送當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù)對(duì)應(yīng)的分支。
git push --force-with-lease # 推薦,避免覆蓋他人提交
2、命令行操作
2.1、查看提交記錄
方式一
git log
方式二
git log --oneline # 獲取目標(biāo)commit_id(前7位即可)
方式三
idea中直接選擇歷史版本右擊選擇復(fù)制修訂號(hào)
2.2、執(zhí)行回退
三種不同的回退模式,上面已經(jīng)詳細(xì)介紹了
# 徹底回退(刪除工作區(qū)+暫存區(qū)修改) git reset --hard 62b47d9 # 回退到上一個(gè)提交(保留工作區(qū)修改) git reset --soft HEAD\~1 # 回退到前2個(gè)版本(保留工作區(qū),暫存區(qū)重置) git reset --mixed HEAD^^
2.3、強(qiáng)制同步遠(yuǎn)程
這里與IDEA圖形化操作命令一樣
git push --force-with-lease # 推薦,避免覆蓋他人提交 git push -f origin master # 強(qiáng)制覆蓋遠(yuǎn)程分支
三、Revert方案:部分撤銷(xiāo)提交
生成新的提交記錄逆向操作目標(biāo)版本,保留完整歷史鏈
,適合團(tuán)隊(duì)協(xié)作或需審計(jì)的場(chǎng)景。
1、IDEA圖形化操作
1.1、撤銷(xiāo)目標(biāo)提交
僅僅撤銷(xiāo)本次提交歷史的內(nèi)容,如果此版本后面又添加了b,此次撤銷(xiāo)就需要解決沖突了。
1.2、提交新版本
自動(dòng)生成Revert "原提交信息"
的新提交,需要推送至遠(yuǎn)程(相當(dāng)于我們手動(dòng)點(diǎn)進(jìn)這個(gè)文件,把添加a的代碼刪除,然后提交推送)
2、命令行操作
# 撤銷(xiāo)單個(gè)提交 git revert 62b47d9 # 推送當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù) git push origin 分支
總結(jié)
Git版本回退有兩種主要方案:Reset
通過(guò)移動(dòng)HEAD指針直接回退,適用于本地或強(qiáng)制同步遠(yuǎn)程,Revert
通過(guò)生成新的提交逆向撤銷(xiāo),適合團(tuán)隊(duì)協(xié)作并保留歷史記錄;根據(jù)需求選擇合適方式并謹(jǐn)慎操作。
以上就是IDEA中Git版本回退的兩種實(shí)現(xiàn)方案的詳細(xì)內(nèi)容,更多關(guān)于IDEA Git版本回退的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn)功能(實(shí)例代碼)
這篇文章主要介紹了Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn),實(shí)現(xiàn)代碼很簡(jiǎn)單,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08java實(shí)現(xiàn)短信驗(yàn)證碼5分鐘有效時(shí)間
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)短信驗(yàn)證碼5分鐘有效時(shí)間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07JVM內(nèi)存模型知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享了關(guān)于JVM內(nèi)存模型的學(xué)習(xí)心得以及相關(guān)知識(shí)點(diǎn)總結(jié),有興趣的朋友們跟著學(xué)習(xí)下。2019-05-05Hibernate Validator實(shí)現(xiàn)更簡(jiǎn)潔的參數(shù)校驗(yàn)及一個(gè)util
這篇文章主要介紹了Hibernate Validator實(shí)現(xiàn)更簡(jiǎn)潔的參數(shù)校驗(yàn)及一個(gè)util,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05java實(shí)現(xiàn)從網(wǎng)上下載圖片到本地的方法
這篇文章主要介紹了java實(shí)現(xiàn)從網(wǎng)上下載圖片到本地的方法,涉及java針對(duì)文件操作的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-07-07詳解spring-cloud與netflixEureka整合(注冊(cè)中心)
這篇文章主要介紹了詳解spring-cloud與netflixEureka整合(注冊(cè)中心),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02淺談byte和長(zhǎng)度為8的boolean數(shù)組互相轉(zhuǎn)換
下面小編就為大家?guī)?lái)一篇淺談byte和長(zhǎng)度為8的boolean數(shù)組互相轉(zhuǎn)換。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11SpringBoot中的五種對(duì)靜態(tài)資源的映射規(guī)則的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot中的五種對(duì)靜態(tài)資源的映射規(guī)則的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12