你們好,歡迎來到週一git專題。git
在上一篇文章當中咱們聊了怎麼在github當中建立一個屬於本身的項目(repository),簡稱repo。除了創建本身的repo以外,咱們更多的狀況是拷貝別人的repo,這樣才能夠得到別人整理好的代碼資料什麼的,也更符合開源(白嫖)精神嘛。程序員
這也不是什麼難題,相信不少人都知道,當咱們想要獲取其餘人的repo的時候,能夠經過git clone命令進行拉取。好比你想要獲取咱們這個教程的repo,能夠經過下面這個命令。github
git clone git@github.com:moutsea/git-tutorial.git
這個命令咱們都知道,經過git clone再加上repo的地址就能夠了。可是這裏的地址是哪裏來的呢?簡單介紹一下,這是在github當中找到的。咱們點擊Code那個綠色按鈕,在下方的彈框裏點擊一下,就能夠複製下來。通常狀況下咱們默認使用SSH協議,若是你看過咱們上篇文章的話,你必定知道我在說什麼。固然你也能夠用HTTPS。web
還有一個問題是咱們clone下來的這個repo它存在哪裏呢?答案也很簡單,就是咱們在哪裏運行的命令它就存在哪裏。windows
另外再說一個小技巧,咱們這樣clone下來以後會在咱們本地新建一個文件夾,而後把這個repo當中的內容存在裏面。這個文件夾的名字默認是這個repo的名字,若是你不喜歡這個名字,也能夠在命令當中進行設置,設置的方法也很簡單,就是在命令最後加上一個你想要起的名字。網絡
好比這樣,你獲得的文件夾就是TechFlow。編輯器
git clone git@github.com:moutsea/git-tutorial.git techflow
即便是git新手應該也都知道git三板斧,也就是常說的git add,git commit和git push。可是當咱們使用這些命令的時候,有沒有想過咱們爲何要用這些命令呢?它們究竟表明了什麼含義,這麼作的意義是什麼,若是咱們不這麼幹又會發生什麼?工具
若是我只是簡單地告訴你git add就是添加,git commit就是提交,那麼其實一點用也沒有,和沒說同樣。由於關於git底層的運行機制一點也沒提,咱們也不知道爲何要添加,要提交,提交了添加了意味着什麼。因此要解釋清楚git這三板斧的原理,須要咱們作一些更細緻地解釋,至少須要把git內部的四個狀態講清楚。flex
在咱們進行這一段以前,首先和你們明確一個概念,就是git系統和咱們計算機當中的文件系統實際上是兩碼事。雖然git有不少神奇的操做,能夠自由地回滾或者是建立文件,但它們依然是兩套系統。git並不會自發地感知文件系統當中文件的變動,除非咱們執行相關的命令。能夠理解爲它是被動響應的,畢竟git只是咱們安裝的一個軟件,並非操做系統的一部分。ui
這一點看似是廢話,可是是很重要的基礎,若是沒搞明白,後面會產生不少疑惑。
咱們繼續來講git內部的狀態,這四個狀態分別是untrack,modified,committed和staged。之因此用英文,是爲了你們之後閱讀其餘文檔不會產生歧義。由於你們翻譯的譯名可能有多個版本,這會致使歧義。下面來簡單介紹一下這幾個狀態分別意味着什麼。
首先是untrack,untrack咱們直譯就能夠了。track有軌道以及記錄的意思,因此untrack就是還沒記錄。那麼什麼樣的東西是還沒記錄的呢?好比能夠想到新生兒,剛出生的新生兒名字都沒有,固然也沒有記錄在案,因此須要登記一下人口。那麼在登記以前,就能夠認爲這些新生兒是untrack的。
遷移到開發當中來,咱們新建立的文件其實就是系統裏的「新生兒」。在咱們將它們記錄在案以前,它們的狀態就是untrack。因此當你在一個git項目當中新建了文件的時候,若是你用git status命令去查看git當中的狀態,就會看到系統會提示你有些文件狀態是untrack。
這裏的展現是亂碼,是由於我用的中文。這一串亂碼就是「第三篇」的意思。咱們能夠注意到,在輸出的結果最後一行,系統提示咱們能夠用git add命令來track它。這個也是git很人性化的一點,不少時候它會提醒咱們可使用什麼命令作成什麼樣的事情。因此你們千萬不要忽視這些日誌,裏面的信息是很重要的。
下一個說的狀態是modified,modified顧名思義就是修改過的意思。針對的就是已經登記在案的文件最近又發生了改動的狀況,也就是說咱們最近改過了某一個以前已經登記在案的文件,那麼當咱們查看狀態的時候獲得的就是modified,表示改動了,以前的記錄已經不是最新的了,咱們須要更新。
一樣,咱們能夠經過git status命名來查看modified的狀況。
咱們看最下方的紅字,它說的是「第三篇」這個文件咱們已經有了新的改動,可使用git add命令來將它更新,或者是使用git restore命令來取消這個文件的登記信息,也就是讓他回到「新生兒」的狀態。
接下來介紹的狀態是staged,它沒有很好的翻譯,能夠大概理解成暫存。也就是說咱們把全部的改動都記錄下來了,如今git系統當中記錄的已是這個文件最新的狀態了。
當咱們建立了新的文件,或者是有了新的改動,執行git add以後,獲得的狀態就是staged。這個時候當咱們執行git status,就會看到咱們當下建立和更新了哪些文件。注意在全部的改動都暫存的狀況下,git status是不會出現紅色的提示的,只會有綠色的提示信息。
固然這裏的文字之因此有顏色是由於我使用了zsh這個終端,若是不配置是沒有的,就只能看到白色的的文字。zsh這個終端只在Linux和MacOS當中有,windows沒有。而win的終端和系統一直被程序員們吐槽難用,建議有條件的同窗能夠研究一下Linux,裝個虛擬機也好。
當咱們終端沒有顏色高亮的時候,就只能經過上面的文原本判斷了,若是出現了Untracked files或者是Changes to be committed這些提示語的話,說明你還有改動沒有同步到git當中來,能夠經過git add命令完成。
最後講的一個狀態就是committed,這個committed表示的已提交。前面說了staged只是暫存,尚未真正提交進git系統當中。只有經過命令git commit以後,纔算是真正把暫存區的代碼提交了。通過git commit命令以後,全部被提交的文件的狀態就是committed。
這個時候若是咱們執行git status再來查看,會看到提示nothing to commit, working tree clean.
這就表示咱們全部的改動都已經提交進本地的git倉庫當中了,之後及時咱們不當心刪錯了代碼,或者是作了一些修改。只要本地的git倉庫還在,這些代碼就都還能夠找得回來。一直到這裏爲止,咱們全部的操做都是離線的,都不須要網絡參與。這也是咱們前文說的git的一個優勢之一。
git commit以後,咱們就能夠經過git push來把本地的改動同步到遠程了。固然這一步是確定須要網絡的,而且也可能會遇到不少問題,其中也有不少細節,咱們以後再詳細展開。
咱們用一張圖來總結一下上面提到四種狀態,以及git的整個工做流來加深一下印象。
看完了上面關於git狀態的介紹以後,想必你們就能夠明白,咱們在使用git的時候,最經常使用的三板斧也就是git add,git commit以及git push的命令到底是幹嗎的了。
git add能夠把全部的改動,不管是修改的仍是新建的都存入暫存區。git commit能夠將暫存區的改動提交到本地git倉庫,最後git push能夠把本地倉庫的改動同步到遠端。看起來好像平平無奇對吧,但咱們仔細琢磨會發現一個很奇怪的點,那就是既然咱們git add和git commit都是提交,只不過是提交的目的地不一樣,一個是暫存區一個是本地倉庫。那麼爲何咱們不能直接將它們合併呢?咱們git add就是直接提交到本地倉庫不行嗎?
實際上SVN這個版本控制工具就是這麼作的,可是這有一個問題就是當咱們提交的時候,它會讓咱們選擇咱們要提交的文件。若是改動量小還好,若是改動量很大,咱們要手動去一個一個輸入須要提交的文件顯然是一個很是麻煩的事情。而有了暫存區以後,咱們就能夠在開發的時候,一邊開發一個邊把文件提交到暫存區,最後直接一塊兒commit到倉庫就能夠了。就能夠避免最後提交以前的麻煩了,由於反正提交這個操做必定是原子的,要麼所有成功,要麼所有失敗,是不容許部分紅功這種狀況發生的。
並且不少極客更加喜歡在終端環境當中操做代碼,而不是在一個彈出來的界面裏點點點,這會讓他們以爲很是不極客(逼格過低)。有了暫存區以後就能夠很方便地作到這一點。
到這裏,咱們的文章就結束了,感謝您的閱讀。相信看完以後,對於git當中的狀態以及它們的做用應該有了一個基礎的瞭解,而且應該還學到了一個裝逼技能,就是問你的小夥伴,你知道爲何git裏有一個暫存區而SVN裏沒有嗎?由於不極客。
衷心祝願你們天天都有所收穫。若是還喜歡今天的內容的話,請來一個三連支持吧~(點贊、在看、轉發)
本文使用 mdnice 排版
- END -