使用Git,10件你可能須要「反悔」的事

DevUI是一支兼具設計視角和工程視角的團隊,服務於華爲雲 DevCloud平臺和華爲內部數箇中後臺系統,服務於設計師和前端工程師。
官方網站: devui.design
Ng組件庫: ng-devui(歡迎Star)
官方交流:添加 DevUI小助手(devui-official)

前言

Git是目前世界上最優秀最流行的分佈式版本控制系統,也是程序員們平常使用最頻繁的工具之一(幾乎天天都須要使用它來對源代碼進行版本管理)。css

使用Git的過程,不免因爲手快或者別的什麼緣由,須要對作過的事情進行「反悔」或者屢次「反悔」。不用擔憂,Git強大到幾乎任何操做都是能夠「反悔」的,讓咱們一塊兒來看看吧。html

1.在未暫存前,撤銷本地修改

在介紹Git「反悔」操做以前,先簡單說起下Git的一些基礎知識。前端

Git項目有3個區域:工做區、暫存區和Git倉庫(分紅本地倉庫和遠程倉庫)。以下圖:git

本地編寫的代碼,不執行任何git命令,處於工做區。程序員

執行git add命令時,會將工做區的文件標記爲已暫存,保存在暫存區。github

執行git commit命令時,會將標記爲已暫存的文件保存都本地Git倉庫,並生成一個快照。前端工程師

在沒有暫存以前(沒有執行git add命令),咱們能夠經過如下命令查看本地修改:app

git diff

顯示的格式以下圖所示:框架

若是咱們不想要這些代碼本地代碼(好比一些臨時的測試代碼),能夠經過如下命令一次性撤銷全部本地修改:編輯器

git checkout -- . 
注意:該命令不可二次「反悔」,本地操做一旦撤銷,將沒法經過Git找回。

撤銷以後再次執行git diff命令將沒有任何輸出,表明沒有文件在暫存區。

咱們也能夠指定具體的文件路徑,撤銷該文件的修改:

git checkout -- [filename]

2.在暫存以後,撤銷暫存區的修改

本地寫完代碼,提交到本地倉庫以前,須要先將修改的文件添加到暫存區,執行如下命令將本地全部已修改的文件添加到暫存區(固然也能夠指定具體的文件):

git add .

此時咱們執行git diff命令,將不會有任何輸出(由於文件已被添加到暫存區),想要查看暫存區的修改,能夠執行如下命令:

git diff --staged

看到的效果和以前爲暫存前,經過git diff看到的如出一轍。

若是這時咱們想要一次性撤銷暫存區的所有修改,能夠執行如下命令(固然也能夠撤銷暫存區指定文件的修改):

git reset .

注意:
該命令能夠二次「反悔」,經過git add .命令能夠將文件再一次添加到暫存區。
這裏的「撤銷暫存區的修改」是指撤銷 git add .這個命令,回到執行 git add .以前的狀態,即 已修改未暫存狀態。
此時,若是執行 git diff --staged命令,將沒有任何輸出,執行 git diff命名將看到 已修改未暫存狀態的輸出。

1和2的兩個命令能夠合併成一個:

git reset --hard


<=>


git reset .
git checkout -- 

即:若是已暫存,但未提交本地倉庫以前,想把全部文件直接拋棄(而不是從暫存區刪除),能夠直接執行以上命令。

3.提交到本地倉庫以後(但未推送到遠程倉庫),撤銷本次提交

執行如下命令,能夠將暫存區的全部文件保存到本地Git倉庫,並生成文件快照(便於以前的回退等操做):

git commit -m "modify some files"

此時提交歷史裏面會有一條記錄f8651ff(Commit ID):

若是咱們不想要此次修改的內容,有如下2種方法:

方法一

回到當前提交的父對象a18c6fa(即上一次提交,經過git log查看),就等於撤銷了本次提交:

git checkout a18c6fa

執行git log命令,發現已經回到以前的提交:

方法二

重置以前的提交

git reset --hard HEAD~1

效果和方法一同樣:

注意:該命令是能夠二次「反悔」的,具體步驟以下:

1.找到被重置的提交 git reflog,發現是 f8651ff
2.使用reset回到該提交 git reset --hard f8651ff

4.修改提交

考慮如下場景:

本來打算修改兩個文件,結果只提交了一個文件,但又不想生成兩個提交記錄(Commit ID),具體執行的命令以下:

git add src/app/app.component.html
git commit -m "add test block"
git log

這樣其實只提交了app.component.html一個文件,不是咱們想要的。

能夠經過如下命令「反悔」(添加遺漏文件,又不從新生成新的Commit ID):

git add src/app/app.component.css
git commit --amend

還有一種場景可能更加常見,沒有遺漏的文件,只是提交信息裏有一個單詞寫錯了,可使用如下命令進行修補:

git commit --amend -m "add test container"
注意:--amend修補參數會將改變以前的Commit ID,但不會生成新的Commit ID。

5.撤銷提交歷史中的某一次指定的提交

第3小結提到回退最近一次提交的方法(使用git reset命令),該方法只能針對連續的提交,若是隻想撤銷提交歷史中的某一次提交(好比:),該怎麼辦呢?

好比:Commit ID爲711bb0b的提交,該次提交將<a>標籤的target屬性由"_blank"改爲了"_self"。

可使用如下命令撤銷該次提交(將提交的內容「反操做」),並生成一個新的提交在最前面:

git revert 711bb0b

revert以後,會在提交歷史的最前面生成一個新的Commit ID(1f49a42),該次提交將<a>標籤的target屬性由"_self"改回了"_blank"。

6.合併出現衝突時,撤銷合併操做

兩個分支改了同一個文件的同一個地方,合併時將出現衝突:

若是不想解決衝突,想撤銷這個合併,可使用如下命令:

git merge --abort

abort以後,將恢復合併以前的狀態。

7.暫存區的文件加多了,想移除,又不想刪掉本地的文件

git rm --cached src/test.pptx

8.分支重命名

git br -m [old_br] [new_br]

9.撤銷變基操做

將 rebase_test 分支的修改變基到master上:

git co rebase_test
git rebase master

撤銷的步驟以下:

1.使用 git reflog 命令找到變基前的提交 09b0adc
2.使用 git reset --hard 09b0adc 重置到該提交

10.以腳本方式改寫提交

考慮如下場景,在一次很早的提交中,將一個儲存密碼的文件passwords.txt提交到了遠程倉庫,這時若是隻是從遠程倉庫中刪除該文件,別人依然能夠經過提交歷史找到這個文件。

所以咱們須要從每個快照中移除該密碼文件,用如下命令就能夠作到:

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD

該命令執行完會將提交歷史中全部提交的passwords.txt文件完全刪除,永遠無法經過Git找回。

 

除了以上「反悔」操做,還有一個很強大的命令,也能夠以某種形式對過去作過的事情進行「反悔」,那就是交互式變基:

git rebase -i

該命令很是強大,DevUI團隊的少東以前專門寫過一篇來介紹該命令,歡迎你們移步閱讀:

關於Git rebase你必需要知道的幾件事

 

若是發現文中有錯誤或者遺漏的地方,歡迎你們指正!

 

加入咱們

咱們是DevUI團隊,歡迎來這裏和咱們一塊兒打造優雅高效的人機設計/研發體系。招聘郵箱:muyang2@huawei.com。

文/DevUI Kagol

 

往期文章推薦

《手把手教你使用Vue/React/Angular三大框架開發Pagination分頁組件》

《現代富文本編輯器Quill的內容渲染機制》

《現代富文本編輯器Quill的模塊化機制》

相關文章
相關標籤/搜索