【爛筆頭】git常用命令篇
git是我們平時最常用的版本控制工具。相比於svn,git有如下幾大優勢:(1)git是分散式管理,不需要單獨的伺服器儲存程式碼,團隊中的每一臺機器都可以作為伺服器,都相互獨立。其最大的優點就是,在斷網的情況下,仍然可以正常地使用git來管理本地的提交等版本管理操作。待網路恢復以後,只需要把所有的提交push到遠端Git伺服器即可。(2)切換分支速度非常快,幾乎是瞬間完成,對分支的管理方面效率比svn更高,svn的分支切換太慢,導致該功能形同虛設。
該篇文章中,記錄了平時使用時常用的命令,其中絕大部分都是平時自己用過的命令。在學習和使用工具時,主要參考瞭如下兩個網站:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
https://git-scm.com/book/zh/v2
一、相關配置
1、檢視git配置資訊 $ git config --list
2、修改配置資訊(平時使用時,只修改過user.name和user.email)
$ git config --global user.name "
Your Name
"
$ git config --global user.email "
[email protected]
"
3、$ git init 把當前目錄變成Git倉庫
二、本地Git操作
1、$ git status 檢視新修改檔案狀態
2、$ git checkout filename 還原修改的檔案(根據自己演示的結果,得到的結論)
(1)當unstage區(即只修改但未add時)中有,而stage區中沒有該filename檔案時,該命令使filename檔案還原為最新一次commit中的檔案
(2)當unstage區中有,stage區中也有時,執行該命令後,unstage區檔案還原為stage中的內容
(3)當unstage區中沒有,stage區中有時,執行該命令後,stage區檔案不變,此時需要使用$ git reset HEAD filename還原(後續會講到該命令)
3、$ git add 將工作區中新修改檔案新增到stage區
filename 將指定檔案新增到stage區
dir 將某個資料夾新增到stage區
. 在Git Version2.x中將當前資料夾下所有有改動(修改的,刪除的,新建立的檔案)的檔案加入到 stage區。在Git Version1.x中只將新修改的和新建立的檔案新增到stage區。
-u (update)將所有tracked檔案新增到stage區中,從測試情況來看,刪除的檔案和新修改的檔案都是tracked,新建立的檔案是untracked檔案,用git status可以檢視(簡單點說,就是將刪除的,新修改的檔案新增到stage區)。
-A (all) 將所有change(修改的,刪除的,新建立的檔案)都提交到stage區
--ignore-removal 新建立的檔案和新修改的檔案,被新增到stage區。忽略掉被刪除的檔案。和Git Version1.x中 git add . 功能一樣。
-h 顯示幫助資訊
4、$ git reset HEAD可以將stage中的change還原到unstage區(即add前的狀態)中,詳細的可以參考第6點。
5、$ git commit
-a (--all) 將被track的檔案,提交。包括沒有被add的檔案。
-m (--message) "message" 將stage區域的檔案新增到當前分支中,並帶有log
--amend 將彈出一個編輯頁面,編輯修改上一次commit的內容。
-C(--reuse-message) <commit> 使用和commit-id相同的提交資訊(可以用於補充提交內容)
--reset-author 重新設定作者。
6、$ git reset 將倉庫提交指標指向某個版本(可能是前進,也可能是回退)
--soft 指標移動後,當前change仍不變。
--hard 指標移動後,當前change被還原為未修改狀態。
沒有hard/soft時,stage區中的change還原到unstage區。
commit-id,HEAD指標指向到commit-id的提交點版本。
HEAD 表示當前版本 HEAD^表示上一個版本,多個^可以共同使用,讀者可以自行查詢。
7、$ git revert commitId 將已經提交的id為commitId記錄退回到提交前。會產生一個新的commitId,注意和reset區別開來,reset會刪除掉對應的commit記錄。
8、$ git diff
file 新增檔名,針對某個檔案進行比較。
無引數 (1)如果stage區有,則是工作區和stage去做比較
(2)如果stage區沒有,則是工作區和分支中做比較
HEAD 比較工作區和HEAD指標指向的版本庫中檔案做比較
--cache 暫存區和分支做比較。
9、$ git rm
10、$ git stash 隱藏所有tacked(modified和deleted)的change,stash就是隱藏的意思。無論是unstage區還是stage區的,都可以被stash隱藏儲存起來。
untracked的檔案不能被stash(測試時發現的結果),需要先add到stage區,然後stash。還原重新使用後,tracked檔案 都會被轉移到add前的狀態。
(1)save <msg> 其中 <msg>表示對當前隱藏的資訊做一些註釋說明,可以不填寫。從測試結果上看,不加<msg>時,git stash 和git stash save 效果一樣。
(2)list 顯示當前所有被stash的資訊
以上三條資訊分別對應stash的儲存(msg資訊被被截取了一部分):
stash@{0} -- $ git stash save "test stash save"
stash@{1} -- $ git stash save ,其中 “:”後面的資訊為git自動新增,表示當前版本庫中最新提交的commt-id號簡寫和提交資訊
stash@{2} -- $ git stash
(3)pop取出stash棧頂(即stash@{0})的資訊,並刪除該條資訊
(4)apply stash@{n} 指定使用哪一條stash記錄,但該記錄不會受影響。
(5)drop stash stash@{n} 刪除指定的stash記錄,該記錄不會還原到工作區。
(6)clear 刪除stash所有記錄。
(7)恢復被刪除後的stash記錄
1)找到被刪除的記錄id,如第(5)點中的
檢視之前被刪除的記錄:git fsck --lost-found
2)根據commit的id,恢復修改記錄
命令:git merge commitId
通過上面的步驟,被誤刪的stash記錄就又回到程式碼中了,但是如果要讓這些修改回到unstage區,需要再執行 git reset HEAD^
10、建立本地分支
(1)$ git branch new-branch-name
(2) $ git checkout -b new-branch-name 建立分支後,當前分支會切換到新建立的分支。
11、切換分支(注意與建立本地分支 -b 引數的差別)
$ git checkout brance-name
12、合併分支
$ git merge branch-name
此時,master分支中做的修改,就被合併到了test-branch中來了。
13、拉取遠端分支內容
$ git pull --rebase (一般建議是使用--rebase,這樣可以使提交線更優雅,可以到網上去查一下git pull,和 git pull --rebase的區別)
14、提交本地分支到遠端分支
$ git push origin branch-name
三、遠端分支:
1、檢視遠端路徑,拉取版本程式碼的時候的路徑 (根據許可權的不同,fetch和push不一定都顯示)
$ git remote -v
2、檢視遠端分支
(1)$ git branch 檢視本地分支(*為當前分支)
Line"/>
(2)$ git branch -a 檢視本地和遠端所有分支 (-av可以顯示每條分支最新的一條提交記錄)
3、建立遠端分支
建立一個本地分支dev1,然後push到遠端git伺服器。
(1)$ git push origin local-branch-name:remote-branch-name (:前後沒有空格,本地分支和遠端分支最好用同一個分支名,便於識別)
(2)$ git push origin dev (提交本地分支修改時,也是該命令)
4、刪除遠端分支(網上查資料,刪除的命令有多種,使用過以下兩種方式)
(1)$ git branch -r -d origin/branch-name
(2)$ git push origin :branch-name(有些時候有效,有些時候無效,尚未找到原因)
5、重新命名遠端分支
網上查過一些資料,一般都是說無法直接修改,用間接的方式
(1)先刪除遠端分支
(2)重新命名本地分支 $ git branch -m branch-name new-branch-name
(3)將本地分支push到遠端倉庫
6、檢視某條遠端分支的更新記錄
$ git reflog show --date=iso origin/master
7、拉取遠端分支並建立本地分支
(1)git branch -r
檢視遠端分支名稱
(2)git checkout -b 本地分支名 遠端分支名
建立並切換到本地分支了
四、log的使用
1、檢視提交記錄 $ git log
-- filename 顯示某個檔案的提交資訊
-n 顯示log條數
-p 顯示每次提交的diff
--grep=str 根據關鍵字查詢提交記錄
2、 檢視某次提交記錄diff等資訊 git show commit-id
filename 檢視某個檔案在某次提交中的相關資訊
3、檢視某個檔案的提交記錄
git log --pretty==online filename 找到commitid,然後結合commit show來檢視
4、檢視某個檔案某處的提交記錄
$ git blame -L 行號,+列號 檔案路徑名稱
當前命令表示檢視FaceIdSdk.java 檔案 第75行,第5列中的提交記錄
五、新增git的忽略檔案。
在專案開發中,有些檔案不希望提交到git中,可以建立.gitignore檔案,將不需要git識別的檔案路徑新增到其中, 並提交到git中。不需要從頭寫 .gitignore
檔案,GitHub已經為我們準備了各種配置檔案,只需要組合一下就可以使用了。所有配置檔案可以直接線上瀏覽: ofollow,noindex">https://github.com/github/gitignore
忽略檔案的原則是:
(1)忽略作業系統自動生成的檔案,比如縮圖等;
(2)忽略編譯生成的中間檔案、可執行檔案等,也就是如果一個檔案是通過另一個檔案自動生成的,那自動生成的檔案就沒必要放進版本庫,比如Java編譯產生的 .class
檔案;
(3)忽略你自己的帶有敏感資訊的配置檔案,比如存放口令的配置檔案。
六、別名配置
git中提供了使用別名來代替命令的的功能,比如,git status,配置好別名st表示status後,直接使用git st即可。對於一些常用,但命令比較長,而且不容易記憶的情況,別名的使用帶來了極大的便利。
按照這樣的格式配置自己喜歡的別名即可。配置後的別名是全域性性的,在所有git倉庫中都有效。在配置檔案中有對應的記錄,我的配置檔案路徑為:C:\Users\rd0489\.gitconfig
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
$ git lg 執行效果
是不是非常喪心病狂? -_-