<tfoot dir='8qp97gq'></tfoot>
      1. <fieldset draggable='g52p7dm'><dialog draggable='zhd585dv'></dialog></fieldset>

            文章熱詞:git

            日期:2019-06-20 09:03 by admin 1592 0 收藏
            我要分享

            摘要:以下的介紹隻是基于我個人對于git的理解,并且可能生編硬造了一些不完全符合git說法的詞語。目的隻是爲了讓git通俗化,使初學者也能大概了解如何快速上手git。同時,下面所有讨論,我們都假設隻使用一個分支,也就是主分支master的情況,雖然這種作法并不符合git規範,但是現實情況中絕大部分用戶是直接在master分支上進行工作的,所以在這裏我們不去引入更加複雜的各種分支的情況,也不涉及标簽tag的操作,隻講在最簡單的主分支上如何回退。

            3個步驟

            正常情況下,我們的工作流就是3個步驟

            git add .git commit -m "comment"git push

            說明:

            4個區

            git之所以令人費解,主要是它相比于svn等等傳統的版本管理工具,多引入了一個暫存區(Stage)的概念,就因爲多了這一個概念,而使很多人疑惑。其實,在初學者來說,每個區具體怎麽工作的,我們完全不需要關心,而隻要知道有這麽4個區就夠了:

            5種狀态

            以上4個區,進入每一個區成功之後會産生一個狀态,再加上最初始的一個狀态,一共是5種狀态。以下我們把這5種狀态分别命名爲:

            檢查修改

            了解了基本概念之後,我們來談一談犯錯誤之後如何撤銷的問題。首先,我們要了解如何檢查這3個步驟當中每一個步驟修改了什麽,然後才好判斷有沒有修改成功。檢查修改的二級命令都相同,都是diff,隻是參數有所不同。

            已修改,未暫存

            git diff

            首先,我們來看一下,如果我們隻是簡單地在浏覽器裏保存了一下文件,但是還沒有做git add .之前,我們如何檢查有哪些修改。我們先随便拿一個文件來做一下實驗。

            我們在文件開頭的第2行胡亂加了4個數字1234,存盤,這時文件進入了已修改狀态,但是還沒有進入暫存區,我們運行git diff,結果如下:

            $ git diffdiff --git a/app/Http/Controllers/Admin/VideoController.php b/app/Http/Controllers/Admin/VideoController.phpindex 5a3a49d..757c775 100644--- a/app/Http/Controllers/Admin/VideoController.php+++ b/app/Http/Controllers/Admin/VideoController.php@@ -3,7 +3,7 @@  * Created by PhpStorm.  * User: cyw  * Date: 2019/6/7- * Time: 12:11+ * Time: 12:111234  */ namespace AppHttpControllersAdmin;

            git diff的結果告訴我們哪些文件已經做了哪些修改。

            已暫存,未提交

            git diff --cached

            現在我們把修改放入暫存區看一下。先執行git add .,然後執行git diff,你會發現沒有任何結果。

            這說明git diff這個命令隻檢查我們的工作區和暫存區之間的差異,如果我們想看到暫存區和本地倉庫之間的差異,就需要加一個參數git

            diff --cached:
            diff --git a/index.md b/index.mdindex 73ff1ba..1066758 100644--- a/index.md+++ b/index.md<a href=http://www.jobbole.com/members/li754132448>@@</a> -1,5 +1,5 <a href=http://www.jobbole.com/members/li754132448>@@</a> ----layout: main+1234layout: main color: black ---

            這時候我們看到的差異是暫存區和本地倉庫之間的差異。

            已提交,未推送

            git diff master origin/master

            現在,我們把修改從暫存區提交到本地倉庫,再看一下差異。先執行git commit,然後再執行git diff --cached,沒有差異,執行git diff master origin/master,可以看到差異:

            在這裏,master就是你的本地倉庫,而origin/master就是你的遠程倉庫,master是主分支的意思,因爲我們都在主分支上工作,所以這裏兩邊都是master,而origin就代表遠程。

            撤銷修改

            了解清楚如何檢查各種修改之後,我們開始嘗試各種撤銷操作。

            已修改,未暫存

            如果我們隻是在編輯器裏修改了文件,但還沒有執行git add .,這時候我們的文件還在工作區,并沒有進入暫存區,我們可以用:

            git checkout .

            或者

            git reset --hard

            來進行撤銷操作。

            可以看到,在執行完git checkout .之後,修改已被撤銷,git diff沒有任何内容了。

            一對反義詞 git add .的反義詞是git checkout .。做完修改之後,如果你想向前走一步,讓修改進入暫存區,就執行git add .,如果你想向後退一步,撤銷剛才的修改,就執行git checkout .

            已暫存,未提交

            你已經執行了git add .,但還沒有執行git commit -m "comment"。這時候你意識到了錯誤,想要撤銷,你可以執行:

            git resetgit checkout .

            或者

            git reset --hard

            git reset隻是把修改退回到了git add .之前的狀态,也就是說文件本身還處于已修改未暫存狀态,你如果想退回未修改狀态,還需要執行git checkout .。

            或許你已經注意到了,以上兩個步驟都可以用同一個命令git reset --hard來完成。是的,就是這個強大的命令,可以一步到位地把你的修改完全恢複到未修改的狀态。

            已提交,未推送

            你的手太快,你既執行了git add .,又執行了git commit,這時候你的代碼已經進入了你的本地倉庫,然而你後悔了,怎麽辦?不要着急,還有辦法。

            git reset --hard origin/master

            還是這個git reset --hard命令,隻不過這次多了一個參數origin/master,正如我們上面講過的,origin/master代表遠程倉庫,既然你已經污染了你的本地倉庫,那麽就從遠程倉庫把代碼取回來吧。

            已推送

            很不幸,你的手實在是太快了,你既git add了,又git commit了,并且還git push了,這時你的代碼已經進入遠程倉庫。如果你想恢複的話,還好,由于你的本地倉庫和遠程倉庫是等價的,你隻需要先恢複本地倉庫,再強制push到遠程倉庫就好了:

            git reset --hard HEAD^git push -f

            總結

            以上4種狀态的撤銷我們都用到了同一個命令git reset --hard,前2種狀态的用法甚至完全一樣,所以隻要掌握了git reset --hard這個命令的用法,從此你再也不用擔心提交錯誤了。

            上一篇:php實現地址自動識别

            下一篇:swoole+PHP實現自動取消訂單,還原庫存等操作


            評論

            -->