Git是個強大的版本控制系統(tǒng)工具,git向用戶提供了多達一百幾十個命令,使得用戶可以極大的靈活性來使用git。但是強大的靈活性帶來的是整體的復(fù)雜性。一百幾十個命令,其中一些命令有多種使用參數(shù)、使用方法,這樣算下來高達幾百上千種指令變化,git的官網(wǎng)參考文檔也是厚厚的一本,令初學(xué)者望而生畏。
實際上,初學(xué)者學(xué)習(xí)git時不需要抱著厚厚的參考文檔一篇篇的啃。先學(xué)習(xí)日常開發(fā)中最長用的十來個命令及其常見用法,就可以滿足80%的日常工作需要了。其他的命令在需要的時候再從官網(wǎng)參考中按圖索驥,在實際的工作實踐中逐漸擴大自己的git命令技能樹。
Git那點事系列短文,從一個簡單的gitsample實例入手,按照一個項目從無到有、如何應(yīng)對日常工作中的版本操作來展示了這十幾個常用的命令及其常見用法的示例。點擊大標題打開鏈接的文章頁面可以看到具體的實操內(nèi)容。對于工具技能的學(xué)習(xí)看十遍不如動手練一遍,初學(xué)者可以根據(jù)里面的demo在自己的電腦上動手實踐練習(xí),加快、加深對命令的理解。
0. Git的安裝與配置
1. 獲取或者創(chuàng)建本地Git倉庫
git clone:從遠程倉庫克隆本地倉庫
git init:創(chuàng)建一個空的本地倉庫
git clone
用法示例:
git clone https://github.com/efreykongcn/gitsample.git:將Github中efreykongcn用戶的gitsample倉庫克隆到本地,同時會將這個地址設(shè)置本地倉庫的遠程倉庫,并將本地的分支和遠程的分支建立關(guān)聯(lián)關(guān)系。
git init
用法示例:
git init:在本地創(chuàng)建一個空的倉庫(帶有工作區(qū))。常用于本地開發(fā)用的倉庫。
git init --bare:在本地創(chuàng)建一個裸庫(沒有工作區(qū))。常用于創(chuàng)建共享的倉庫。
2. 本地的操作
git add:添加工作區(qū)文件到暫存區(qū)(又稱index,索引區(qū))
git commit:提交暫存區(qū)的文件到版本庫
git status:查看工作區(qū)、暫存區(qū)狀態(tài)
git diff:比較文件
git add
用法示例:
git add README.md:將README.md文件添加到暫存區(qū)(index)
git add .:將工作區(qū)所有新建或者修改過的文件添加到暫存區(qū)
git add *.txt:將所有txt文件添加到暫存區(qū)
git commit
用法示例:
git commit -m "修改README.md":將暫存區(qū)的文件提交到版本庫。
git status
git status:查看git倉庫狀態(tài),例如是否有需要待添加到暫存區(qū)的文件,是否有待提交到版本庫的文件等等。
git diff
git diff README.md:比較工作區(qū)的README.md文件(我們可以編輯的文件)和暫存區(qū)的差異。如果不指定路徑或文件則比較所有文件。git diff --staged README.md`:比較暫存區(qū)的README.md和版本庫HEAD的內(nèi)容差異。如果不指定路徑或文件名則比較所有文件。
3. 查看版本庫的歷史
git log:查看倉庫歷史中所有的提交操作,包括本地的和遠程倉庫上獲取的。在向遠程倉庫推送更新的時候,有的操作如撤銷等不會被推送。
所以gitlog中是無法查看到其他倉庫發(fā)生的撤銷等操作日志。
git reflog:查看本地倉庫發(fā)生的所有的操作,包括撤銷等操作的日志。
git log
git log README.md``:查看README.md文件的所有操作日志。顯示每一次操作的commit id、作者、日期以及提交的簡要說明。如果指定目錄名則顯示該目錄下所有文件的日志。不指定參數(shù)則顯示全部的日志。
git log -p -2:查看最近兩次提交日志的信息,并且顯示每一次提交操作前后的差異。
git log --pretty=oneline:查看所有的日志,每次提交的日志在一行內(nèi)顯示。
git reflog
git reflog:查看本地對倉庫的所有操作。
4. 操作的回撤
git clean:清除工作區(qū)所有未納入版本管理的目錄、文件。
git checkout:從暫存區(qū)或版本庫簽出文件
git reset:撤銷文件的提交
git clean
git clean -f:強制清除工作區(qū)根目錄下未納入版本管理的文件。
git clean -d -f:強制清除未納入版本管理的目錄和文件,會從根目錄遞歸所有子目錄。
git checkout
git checkout -- README.md:撤銷工作區(qū)README.md文件的修改。用該文件暫存區(qū)的快照替換。
git checkout HEAD -- README.md:撤銷工作區(qū)和暫存區(qū)對README.md文件的修改,用版本庫最近一次提交的版本(HEAD)來替換。
git reset
git reset HEAD -- README.md:撤銷文件在暫存區(qū)的尚未提交到版本庫的內(nèi)容。
git reset --soft HEAD^^:撤銷版本庫最近一次的提交。
git reset --mixed HEAD^:撤銷版本庫最近一次的提交,并恢復(fù)暫存區(qū)該文件上一次提交之前的狀態(tài)。
git reset --hard HEAD~3:撤銷版本庫最近3次的提交、暫存區(qū)和工作區(qū)恢復(fù)到近3次提交之前的狀態(tài)。
5. 打標簽
git tag
git tag v1.0.0-alpha:創(chuàng)建一個輕量級標簽。
git tag -a v0.1.0 -m "release v0.1.0":創(chuàng)建一個附注標簽。相比于輕量級標簽,附注標簽會記錄打標簽人、時間和備注。
git tag -d v1.0.0-alpha:移除標簽“v1.0.0-alpha”。
6. 分支與工作流
checkout
git checkout -b feature-c3:創(chuàng)建一個名為feature-c3的分支,并將新分支簽出到工作區(qū)。
git checkout feature-c3:將feature-c3分支簽出到工作區(qū)。
git branch
git branch feature-c3:創(chuàng)建一個名為feature-c3的分支。
git branch -d feature-c3:刪除feature-c3分支。
git merge
git merge feature-c3:將feature-c3分支的新提交合并到當(dāng)前的分支。
7. 遠程操作
git remote
git remote -v:查看本地倉庫添加的所有遠程倉庫。
git remote show origin master:查看遠程倉庫的master分支。
git remote rm origin:從本地移除遠程倉庫origin。
git remote add origin https://github.com/efreykongcn/gitsample.git:將github中的gitsample倉庫添加為遠程倉庫,遠程倉庫的別名為origin。
git push
git push origin master:master:將本地的master分支的新提交推送到遠程倉庫origin的master分支。
git push --all origin:將本地所有的分支推送到遠程倉庫,包括本地新建但還沒有推送到遠程倉庫的分支。
git push origin --tags:將本地的tag推送到遠程倉庫。需要指定tags參數(shù),git才會將tag推送到到遠程倉庫。
git fetch
git fetch origin master:從遠程倉庫origin中獲取master分支的更新,但是不會自動合并到新本地倉庫。如果不指定分支名,則獲取所有分支的更新。
git diff
git diff master origin/master:比較本地master分支同遠程倉庫origin的master分支之間的內(nèi)容差異。
git pull
git pull origin master:從遠程倉庫origin的master分支拉取更新并合并到本地master分支。如果不指定本地分支名,則默認合并到當(dāng)前簽出的本地分支。