Git最常用的幾個操作
上面這張圖是我最開始學Git,按照自己的理解畫出來的,可能會有問題,但總體問題不大。
其實Git是個非常複雜的系統,很多細節的特性,平時用到的不多,我也不太清楚,這篇文章只說我日常開發中最常用的操作。
git clone
作用
將遠端倉庫中的專案下載到本地倉庫
用法
在瀏覽器中開啟github或公司的gitlab,進入專案,複製專案的git地址(如果公司的gitlab不支援SSH,因此請注意選擇HTTPS的地址)
進入到工作目錄(通常我們會把各個專案放在同一個資料夾,例如workingDir啥的,當然,你可以在任意目錄做git操作),敲下命令
git clone https://github.com/rodickmini/taptempo.git
這個操作會把taptempo專案下載到workingDir下的taptempo目錄,如果你不想使用taptempo這個目錄名,可以指定一個目錄名,比如taptempo2
git clone https://github.com/rodickmini/taptempo.git taptempo2
git checkout
作用
切換分支或將修改的檔案恢復
用法
clone
下程式碼後,程式碼預設會在master
分支,我們需要把程式碼切換到一個自己的分支,這樣的話,我們隨便怎樣修改,怎樣提交,都不會影響到master
或其它分支。
git checkout -b feature-test
這個時候,feature-test
分支和master
分支的程式碼是完全一樣的,但是此後,你做的所有修改都不會影響master
分支,只會在feature-test
分支上往下進行。
git status
作用
顯示當前工作目錄的檔案狀態
用法
git status
- Changes to be committed列出了已經add了還沒有commit的檔案
- Changes not staged for commit列出了修改了,但還沒有add的檔案
- Untracked files列出了新加入的,還沒有被git管理起來的檔案
經常敲一敲這個命令,可以讓你對當前git的狀態瞭如指掌!
git add
作用
將一個普通檔案交給git管理或者將修改過的檔案新增到git的索引庫中。當我們使用
git commit
時,git將依據索引庫中的內容來進行檔案的提交。
用法
git add index.html
如果我們一次修改比較多的檔案,需要把所有修改的檔案都新增到索引庫,可以使用:
git add --all
如果我們誤把一個檔案新增進了索引庫,可以使用以下命令將其“拉回”暫存區:
git reset HEAD index.html
如果我們想把一個檔案恢復成修改前的狀態,可以使用以下命令,就撤銷了我們所有的修改:
git checkout index.html
但是,執行這個命令要慎重哦!一旦執行,你的所有修改都找不回來啦!
所以,最好在執行之前,先看一下這次修改了那些東西,那麼就需要使用git diff命令:
git diff index.html
git diff
命令會調出一個類似於vi的文字編輯器(只讀),裡面紅色的部分說明你刪除了<h1>catch the beat</h1>
這一行,綠色的部分說明你添加了display: block;
這一行。看完了,按q
鍵就可以退出啦~
經過上面這幾步“折騰”,你就可以信心十足地決定把哪些檔案add進索引庫,哪些只是手賤現在要放棄修改的!
git commit
作用
將所有新增到索引庫的檔案提交到本地倉庫
終於要commit了!為什麼commit這麼重要?
因為一旦commit了之後,就會在git中形成一個歷史版本,以後不管走到天涯海角,你都可以像乘坐時光機一樣找到當年在村口好槐樹下埋下的那顆玻璃球,哦不,是找到當年在git裡提交的那次變動。
commit操作也是考驗一個開發者職業素養的試金石,老司機摟一眼commit message就知道他有沒有搞清楚js的閉包和原型鏈。。。
用法
最簡單的commit操作如下:
git commit -m "upd"
當然,這樣commit肯定永遠成不了老司機噠!
你看到了,commit
操作要寫一個commit message
,可以在行內用-m
引數直接寫,一些簡單的修改可以這麼做,但千萬別像我一樣,光溜溜寫個沒營養的upd,稍微好一點的寫法呢是想這樣的:
git commit -m "upd 修改了首頁的表格樣式,避免字數多了在一行內顯示不下"
或者
git commit -m "add package.json 引入node包管理,方便安裝node依賴"
或者
git commit -m "del npm-debug.log日誌檔案,避免汙染git倉庫"
所以commit message
主要要說3件事:
- 是upd(更新)、add(新增)還是del(刪除)操作
- 操作了什麼檔案(或者什麼內容)
- 為什麼要做這個操作(或者能夠解決什麼bug,解決什麼問題)
另外如果做了比較重大的提交,一句兩句說不完,那麼就不能再一行之內解決了,這時候需要用到更高階、更規範的commit message
寫法:
git commit
此時git又會調出我們的老朋友vi
編輯器:
將輸入法調到英文狀態,按下Shift+G
再按o
鍵,vi
將在檔案最後一行待命,此時就可以輸入詳細的commit message啦~
注意,commit message要注意及時換行,不要超過開頭註釋部分的寬度。
commit message在某些系統裡面可以被轉化成email,所以格式類似於email,第一行是主題,空一行,後面的是正文。
寫完之後,按10次ESC
鍵,輸入:wq
即可退出vi
編輯器,commit操作完成!深藏功與名!
當然,以上所說關於commit的注意事項都是我瞎說的。。。操作過程中出現任何問題,本人概不負責!
git push
作用
將本地倉庫的修改推送到遠端倉庫
用法
git push origin feature-test
如果不push,協作的小夥伴們將永遠不知道你關起門來做了什麼傷天害理的事兒,所以,當我們做完功能後,要記得使用git push
將自己的改動推送到遠端程式碼倉庫。
如果遠端倉庫當前沒有feature-test
這個分支,將會新建分支。
git fetch
作用
將遠端程式碼倉庫的程式碼下載到本地
用法
本地倉庫維護這一堆“remote-tracking branches”,翻譯過來叫“遠端跟蹤分支”,對應著本地倉庫裡remote/master
remote/develop
這些分支。
fetch操作後,遠端跟蹤分支就和遠端程式碼倉庫裡的相應分支程式碼保持一致了~
git fetch
fetch
操作預設只會fetchorigin
倉庫的分支,如果要fetch其它倉庫的分支,需要在後面加上倉庫名:
git fetch repo-caiyou
通常,我們的feature分支在完成使命後會被管理員刪除掉,而我們各自的本地卻不知道,硬碟空間吃緊。所以,如果我們想在管理員刪除了遠端的某些分支的時候,將自己本地對應的“遠端跟蹤分支”刪除掉,需要在fetch操作時加一個-p
引數:
git fetch -p
git merge
作用
將一個或多個分支合併
用法
比如我們當前在develop
分支上,git fetch
之後,我們把遠端程式碼倉庫中的develop
分支下載到了本地倉庫,但是並沒有merge
到我們當前工作的develop
分支裡,看log
的話,我們會發現我們本地的develop
分支和remote/develop
分支還差了老遠~因此需要進行如下操作:
git merge origin/develop
這樣,develop
分支就和remote/develop
分支一樣了。
git merge
操作通常還用在別的一些場景中,比如,我們的同事在feature-x
分支上做好了某個業務,此時,需要將feature-x
分支合併到develop
分支,便於在測試環境上線,就需要先切換到develop
分支:
git checkout develop
再將feature-x
分支merge到develop
分支:
git merge feature-x
當然,如果是比較大的變更,或是涉及到比較重要的檔案時,這類業務上的merge操作建議在github上使用pull-request
,或是gitlab系統裡的merge-request
,貿然merge產生大量衝突會很蛋疼的哦~
git pull
作用
將遠端程式碼倉庫裡的程式碼下載下來並自動合併到當前工作的分支
用法
git pull
不負責任地講,git pull
基本上等於git fetch
+ git merge FETCH_HEAD
,但是,git pull
操作無法看清中間的程式碼差異和合並的邏輯(其實是我不太清楚啊。。。),曾經踩過坑,程式碼合併出問題,所以我個人不會直接使用git pull
這個操作,畢竟,耿直boy們更喜歡手動擋嘛~
git log
作用
檢視程式碼提交日誌
用法
git log
會顯示最基本的log資訊,但是不直觀,不能看清分支之間的分叉、合併、前因後果,所以個人習慣加上--all
`--decorate--graph
這3個引數:
git log --all --decorate --graph
出來的log是這樣色兒的:
git log
平時是和git status
一樣最常用的命令,畢竟強迫症,需要不斷通過這兩個命令找到安全感。。。