使用Git后10件你可能需要“反悔”的事
云棲號(hào)資訊:【點(diǎn)擊查看更多行業(yè)資訊】
在這里您可以找到不同行業(yè)的第一手的上云資訊,還在等什么,快來(lái)!
Git是目前世界上最優(yōu)秀最流行的分布式版本控制系統(tǒng),也是程序員們?nèi)粘J褂米铑l繁的工具之一(幾乎每天都需要使用它來(lái)對(duì)源代碼進(jìn)行版本管理)。
使用Git的過(guò)程,難免由于手快或者別的什么原因,需要對(duì)做過(guò)的事情進(jìn)行“反悔”或者多次“反悔”。不用擔(dān)心,Git強(qiáng)大到幾乎任何操作都是可以“反悔”的,讓我們一起來(lái)看看吧。
1. 在未暫存前,撤銷本地修改
在介紹Git“反悔”操作之前,先簡(jiǎn)單提及下Git的一些基礎(chǔ)知識(shí)。
Git項(xiàng)目有3個(gè)區(qū)域:工作區(qū)、暫存區(qū)和Git倉(cāng)庫(kù)(分成本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù))。如下圖:
?
本地編寫(xiě)的代碼,不執(zhí)行任何Git命令,處于工作區(qū)。
執(zhí)行g(shù)it add命令時(shí),會(huì)將工作區(qū)的文件標(biāo)記為已暫存,保存在暫存區(qū)。
執(zhí)行g(shù)it commit命令時(shí),會(huì)將標(biāo)記為已暫存的文件保存都本地Git倉(cāng)庫(kù),并生成一個(gè)快照。
在沒(méi)有暫存之前(沒(méi)有執(zhí)行g(shù)it add命令),我們可以通過(guò)以下命令查看本地修改:
git diff顯示的格式如下圖所示:
?
如果我們不想要這些代碼本地代碼(比如一些臨時(shí)的測(cè)試代碼),可以通過(guò)以下命令一次性撤銷所有本地修改:
git checkout -- .?
注意:該命令不可二次“反悔”,本地操作一旦撤銷,將無(wú)法通過(guò)Git找回。
撤銷之后再次執(zhí)行g(shù)it diff命令將沒(méi)有任何輸出,代表沒(méi)有文件在暫存區(qū)。
我們也可以指定具體的文件路徑,撤銷該文件的修改:
git checkout -- [filename]2. 在暫存之后,撤銷暫存區(qū)的修改
本地寫(xiě)完代碼,提交到本地倉(cāng)庫(kù)之前,需要先將修改的文件添加到暫存區(qū),執(zhí)行以下命令將本地所有已修改的文件添加到暫存區(qū)(當(dāng)然也可以指定具體的文件):
git add .此時(shí)我們執(zhí)行g(shù)it diff命令,將不會(huì)有任何輸出(因?yàn)槲募驯惶砑拥綍捍鎱^(qū)),想要查看暫存區(qū)的修改,可以執(zhí)行以下命令:
git diff --staged看到的效果和之前為暫存前,通過(guò)git diff看到的一模一樣。
如果這時(shí)我們想要一次性撤銷暫存區(qū)的全部修改,可以執(zhí)行以下命令(當(dāng)然也可以撤銷暫存區(qū)指定文件的修改):
git reset .注意:
該命令可以二次“反悔”,通過(guò)git add .命令可以將文件再一次添加到暫存區(qū)。
這里的“撤銷暫存區(qū)的修改”是指撤銷git add .這個(gè)命令,回到執(zhí)行g(shù)it add .之前的狀態(tài),即已修改未暫存狀態(tài)。
此時(shí),如果執(zhí)行g(shù)it diff --staged命令,將沒(méi)有任何輸出,執(zhí)行g(shù)it diff命名將看到已修改未暫存狀態(tài)的輸出。
1和2的兩個(gè)命令可以合并成一個(gè):
git reset --hard<=>git reset . git checkout --即:如果已暫存,但未提交本地倉(cāng)庫(kù)之前,想把所有文件直接拋棄(而不是從暫存區(qū)刪除),可以直接執(zhí)行以上命令。
3. 提交到本地倉(cāng)庫(kù)之后(但未推送到遠(yuǎn)程倉(cāng)庫(kù)),撤銷本次提交
執(zhí)行以下命令,可以將暫存區(qū)的所有文件保存到本地Git倉(cāng)庫(kù),并生成文件快照(便于之前的回退等操作):
git commit -m "modify some files"此時(shí)提交歷史里面會(huì)有一條記錄f8651ff(Commit ID):
?
如果我們不想要這次修改的內(nèi)容,有以下2種方法:
方法一
回到當(dāng)前提交的父對(duì)象a18c6fa(即上一次提交,通過(guò)git log查看),就等于撤銷了本次提交:
git checkout a18c6fa?
執(zhí)行g(shù)it log命令,發(fā)現(xiàn)已經(jīng)回到之前的提交:
?
方法二
重置之前的提交:
git reset --hard HEAD~1效果和方法一一樣:
注意:該命令是可以二次“反悔”的,具體步驟如下:
- 找到被重置的提交 git reflog,發(fā)現(xiàn)是 f8651ff
- 使用reset回到該提交 git reset --hard f8651ff
4. 修改提交
考慮以下場(chǎng)景:
原本打算修改兩個(gè)文件,結(jié)果只提交了一個(gè)文件,但又不想生成兩個(gè)提交記錄(Commit ID),具體執(zhí)行的命令如下:
git add src/app/app.component.html git commit -m "add test block" git log?
這樣其實(shí)只提交了app.component.html一個(gè)文件,不是我們想要的。
可以通過(guò)以下命令“反悔”(添加遺漏文件,又不重新生成新的Commit ID):
git add src/app/app.component.css git commit --amend還有一種場(chǎng)景可能更加常見(jiàn),沒(méi)有遺漏的文件,只是提交信息里有一個(gè)單詞寫(xiě)錯(cuò)了,可以使用以下命令進(jìn)行修補(bǔ):
git commit --amend -m "add test container"注意:--amend修補(bǔ)參數(shù)會(huì)將改變之前的Commit ID,但不會(huì)生成新的Commit ID。
5. 撤銷提交歷史中的某一次指定的提交
第3小結(jié)提到回退最近一次提交的方法(使用git reset命令),該方法只能針對(duì)連續(xù)的提交,如果只想撤銷提交歷史中的某一次提交(比如:),該怎么辦呢?
比如:Commit ID為711bb0b的提交,該次提交將標(biāo)簽的target屬性由"_blank"改成了"_self"。
可以使用以下命令撤銷該次提交(將提交的內(nèi)容“反操作”),并生成一個(gè)新的提交在最前面:
git revert 711bb0b?
revert之后,會(huì)在提交歷史的最前面生成一個(gè)新的Commit ID(1f49a42),該次提交將標(biāo)簽的target屬性由"_self"改回了"_blank"。
?
6. 合并出現(xiàn)沖突時(shí),撤銷合并操作
兩個(gè)分支改了同一個(gè)文件的同一個(gè)地方,合并時(shí)將出現(xiàn)沖突:
?
如果不想解決沖突,想撤銷這個(gè)合并,可以使用以下命令:
git merge --abortabort之后,將恢復(fù)合并之前的狀態(tài)。
7.暫存區(qū)的文件加多了,想移除,又不想刪掉本地的文件
git rm --cached src/test.pptx8.分支重命名
git br -m [old_br] [new_br]9. 撤銷變基操作
將rebase_test分支的修改變基到master上:
git co rebase_test git rebase master?
撤銷的步驟如下:
- 使用git reflog命令找到變基前的提交09b0adc
- 使用git reset --hard 09b0adc重置到該提交
?
10. 以腳本方式改寫(xiě)提交
考慮以下場(chǎng)景,在一次很早的提交中,將一個(gè)儲(chǔ)存密碼的文件passwords.txt提交到了遠(yuǎn)程倉(cāng)庫(kù),這時(shí)如果只是從遠(yuǎn)程倉(cāng)庫(kù)中刪除該文件,別人依然可以通過(guò)提交歷史找到這個(gè)文件。
因此我們需要從每一個(gè)快照中移除該密碼文件,用以下命令就可以做到:
git filter-branch --tree-filter 'rm -f passwords.txt' HEAD該命令執(zhí)行完會(huì)將提交歷史中所有提交的passwords.txt文件徹底刪除,永遠(yuǎn)沒(méi)法通過(guò)Git找回。
除了以上“反悔”操作,還有一個(gè)很強(qiáng)大的命令,也可以以某種形式對(duì)過(guò)去做過(guò)的事情進(jìn)行“反悔”,那就是交互式變基:
git rebase -i該命令非常強(qiáng)大。
【云棲號(hào)在線課堂】每天都有產(chǎn)品技術(shù)專家分享!
課程地址:https://yqh.aliyun.com/live
立即加入社群,與專家面對(duì)面,及時(shí)了解課程最新動(dòng)態(tài)!
【云棲號(hào)在線課堂 社群】https://c.tb.cn/F3.Z8gvnK
原文發(fā)布時(shí)間:2020-07-14
本文作者:aoxiang
本文來(lái)自:“dockone”,了解相關(guān)信息可以關(guān)注“dockone”
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的使用Git后10件你可能需要“反悔”的事的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端如何快速上手 Web 3D 游戏的开
- 下一篇: 全民加速节:全站加速在互联网媒体应用上的