git 命令詳解
本文暫時不會涉及到團隊如何使用Git的內容,而是從個人的角度探討如何用好Git。
約定
綠色的5位字符表示提交的ID,文中用<commit>表示,分別指向父節點。分支用橘色顯示,分別指向特定的提交。當前分支由附在其上的標識。 這張圖片里顯示最后5次提交,是最新提交。分支指向此次提交,另一個分支指向祖父提交節點。
git cat-file
git cat-file -t <commit>,查看Git對象的類型,主要的git對象包括tree,commit,parent,和blob等。
git cat-file -p <commit>,查看Git對象的內容
git log
git log主要用來顯示分支中提交更改的記錄。當執行git commit以存儲一個快照的時候,文件詳單、提交消息和提交者的信息、此次提交所基于的快照都會被保存。
git log --oneline,可以顯示更加短小的提交ID.
git log --graph,顯示何時出現了分支和合并等信息.
git log --pretty=raw,顯示提交對象的parent屬性.
git config
git config -e
git config -e --global
git config -e --system
Git的三個配置文件分別是版本庫級別的配置文件(/.git/config)、全局配置文件(用戶主目錄下)和系統級配置文件(/etc目錄 下)。這個命令的作用是打開相應的配置文件,并且進行編輯。其中版本庫級別的配置文件的優先級最高,全局配置文件次之,系統級別配置文件最低。Git配置 文件采用的是INI文件格式。
git config <section>.<key>,讀取和更改INI配置文件的內容。
git config <section>.<key> <value>,修改INI配置文件中某個配置的鍵值
在全局空間中添加新的用戶
git config --global user.name "harvey liu"
git config --global user.email harvey_liu@163.com
設置git命令的別名
git config --global alias.ci commit
git config --global alias.co checkout
刪除git全局配置文件中的用戶名
git config --unset --global user.name
git config --unset --global user.email
git grep
git grep可以用來搜索工作區中的文件內容
要查找git倉庫里某個特定版本里的內容, 我們可以像下面一樣在命令行末尾加上標簽名(tag reference),git grep '文字內容' v1.0
git diff
git diff,顯示工作區和暫存區的差異
git diff HEAD,顯示工作區和HEAD之間的差異
git diff --cached,顯示暫存區和HEAD之間的差異
git diff id1 id2,顯示兩次提交之間的差異
git status
git status,查看你的代碼在緩存與當前工作目錄的狀態
git status -s,將結果以簡短的形式輸出
git add
git add,在提交你修改的文件之前,你需要把它們添加到暫存區。如果該文件是新創建的,你可以執行將該文件添加到暫存區
git add . ,Git會遞歸地將你執行命令時所在的目錄中的所有文件添加上去,所以如果你將當前的工作目錄作為參數,它就會追蹤那兒的所有文件
git add -u,使用-u參數調用了git add命令,會將本地有改動(包括刪除和修改)的已經追蹤的文件標記到暫存區中。
git add -A,使用-A參數會將添加所有改動的已跟蹤文件和未跟蹤文件。
git add -i,交互式的方式進行添加。
git commit
git commit --amend,修補式提交。
git commit --a,對本地所有變更的文件執行提交操作,包括對本地修改的文件和刪除的文件,但是不包括未被版本庫跟蹤的文件。但是這個命令最好不要使用,這樣會丟掉Git暫存區帶給用戶的最大好處:對提交內容進行控制的能力
git commit --allow-empty,允許執行空白提交
git reset
把當前分支指向另一個位置,并且有選擇的變動工作目錄和索引
git reset --hard <commit>,其中commit是可選項,可以使用引用或者提交ID,如果省略則相當于使用了HEAD的指向作為提交ID,完成的操作包括替換引用的指向,替換暫存區,替換工作區
git reset --soft <commit>,其中commit是可選項,可以使用引用或者提交ID,如果省略則相當于使用了HEAD的指向作為提交ID。完成的操作主要是更改引用的指向,不改變暫存區和工作區
git reset,等同于git reset HEAD,用HEAD指向的目錄樹重置暫存區
git reset -- filename,將文件filename的改動撤出暫存區,暫存區其他文件不變
git reset HEAD --filename 等同于git reset -- filename
git branch
git branch,顯示當前所在的分支
git branch <branchname>,創建新的分支branchname
git branch <branchname> <start-point>,基于提交<start-point>創建新分支,新分支的分支名為<branchname>
git branch -d <branchname> ,刪除名稱為branchname的分支,刪除時會檢查所有的刪除分支是否已經合并到其他分支,否則拒絕刪除
git branch -D <branchname>,強制刪除分支<branchname>
git branch -m <oldbranch> <newbranch>,重命名分支
git checkout
git checkout branchname,會改變HEAD頭指針,主要用于切換分支
git checkout -b branchname,用于創建一個新的分支,并且切換到創建的新的分支上
git checkout --filename,用暫存區中的filename文件來覆蓋工作區中的filename文件
git checkout <commit> --filename,用指定提交中的文件覆蓋暫存區和工作區中對應的文件
git checkout -- .或者git checkout .,用暫存區的所有文件直接覆蓋本地文件,取消所有的本地的修改,是一條危險的操作
git clean
刪除本地多余的目錄和文件
git clean -nd,顯示要刪除的內容,但是是預刪除
git clean -fd,強制刪除多余的文件和目錄
git rm
rm命令刪除的文件只是在本地進行了刪除,尚未添加到暫存區,也就是說,直接在工作區刪除,對暫存區和版本庫沒有任何影響。
git rm命令會將刪除動作加入暫存區,這是執行提交動作,就從真正意義上執行了文件刪除。
git mv
git mv,移動文件,git中以git rm和git add兩條命令取而代之。
git archive
git archive,對任意提交對應的目錄樹建立歸檔。
git archive -o latest.zip HEAD,基于最新提交建立歸檔文件latest.zip
git archive -o partial.tar HEAD src doc,只將目錄src和doc建立到歸檔文件partial.tar中
git archive --format=tar --prefix=1.0/ v1.0 | gzip > foo-1.0.tar.gz,基于里程碑v1.0建立歸檔,并且為歸檔中的文件添加目錄前綴1.0
git clone
git clone <repository> <directory>,將repository指向的版本庫創建一個克隆到directory目錄中。目錄directory相當于克隆版 本庫的工作區,文件都會檢出,版本庫位于工作區下得.git目錄中。
git clone --bare <repository> <directory.git>
git clone --mirror <repository> <directory.git>
上面的兩種克隆版本都不包含工作區,直接就是版本庫的內容,這樣的版本庫稱為裸版本庫。
git push
git push <remote> [branch],就會將你的 [branch] 分支推送成為 [alias] 遠端上的 [branch] 分支,要推送的遠程版本號的URL地址由remote.<remote>.pushurl給出,如果沒有配置,則使用 remote.<remote>.url配置的URL地址。
git pull
git pull,從遠端的服務器上下載數據,從而實現同步更新。要獲取的遠程版本庫的URL地址由remote.<remote>.url提供。