本篇為上篇,介紹基本概念和一個人的基本git操作流程
上篇
起步
在教程之前,我們先來做一個git的"Hello, World!"。沒有安裝git的同學可以進入點擊進入官網下載。以下內容以Windows系統舉例。
- 創建一個新目錄
leney
。 - 進入該目錄,右鍵選擇 Git Bash Here。
- 在命令框中輸入命令
git init
。好了一個git倉庫就搭建完成了,接着我們往里面添加內容。 - 新建一個README.md文件,輸入
Hello, World!
,保存。 - 回到命令框,輸入命令
git add .
,再輸入命令git commit -m "Hello, World!"
。 - 至此,一次git操作就算完成了,你可以再輸入命令
git log
查看剛剛提交的內容。
git的五塊區域
首先,我們花幾分鍾的時間來了解一下git的基本概念。在git中有五塊主要區域:工作區,緩存區,貯藏區,本地倉庫,遠程倉庫。
- 工作區,也就是我們平時對文件進行的增刪改,都是在工作區中。
- 緩存區,工作區中的文件在確定准備
commit
時,需要通過add
命令添加到緩存區,之后才能通過commit
生成提交記錄。 - 貯藏區,在緩存區中的文件通過
stash
命令可以進入貯藏區,也可以隨時提取出來。 - 本地倉庫,就是本地的git倉庫了,我們在起步就成功創建了一個本地倉庫。
- 遠程倉庫,就是遠程的git倉庫了,可能是來自於github, gitee或者公司自己搭建的gitlab, gitea等等平台。
我們對文件的增刪改首先會反映在工作區,然后通過add
進入緩存區,再通過commit
形成一次提交記錄,每一次提交均會生成一串唯一編碼。一個個提交記錄就組成了我們需要的版本。
這里給不熟悉git的各位提兩點建議。
- 可以將工作區和緩存區合並成一個區域來看待,但是要記住在git操作過程中需要先
add
才能commit
。以下我將合並的區域稱為開發區
。 - 可以忽略貯藏區,並且建議盡量不要去使用
stash
命令,不建議使用的原因我會在分支一節給出。
分支
分支創建和切換
然后我們要着重了解一下什么是分支。在剛才的起步中,命令框中會展示出我們當前所在的目錄和括號中的master,這個master便是我們當前所在的分支。分支和分支之間是互相獨立的,這保證了當我們在某個分支進行操作時不會影響到其他分支。現在讓我們來實際操作看看吧。
- 回到git倉庫目錄中,喚出命令框,輸入
git checkout -b develop
,來創建並切換到develop分支。 - 這里我們使用
git branch
來展示一下當前所有的分支,便可以得到master和develop。 - 新建文件leney.txt,輸入文字"這來自於develop",保存。
- 打開README.md,新增一行,輸入"分支切換 OK",保存。
- 使用
add
和commit
命令來生成一次提交記錄。 - 現在我們通過
git checkout master
回到我們master分支,可以發現剛剛我們新建的leney.txt文件消失了,同時我們在README.md中的更改也不見了。
切換分支的注意點
通過以上的操作,我們便了解到分支的基本作用了。要注意,在切換分支時最好保證你當前開發區的內容均已進行add
和commit
,否則你開發區的內容會進入到你切換到的分支甚至與你要切換的分支內容沖突而切換失敗。這里我們實際操作看看。
- 剛剛我們在develop分支創建了leney.txt。
- 現在我們在master分支也創建一個leney.txt並輸入文字"這來自於master",保存。
- 現在我們使用
git status
,查看一下我們當前開發區都有什么內容,可以看到leney.txt出現在開發區中。 - 這次我們不進行
add
和commit
,直接使用git checkout develop
切換到develop分支。 - 可以看到出現一個報錯,這便是因為我們當前開發區的內容與要切換的分支內容沖突。
error: The following untracked working tree files would be overwritten by checkout:
leney.txt
Please move or remove them before you switch branches.
Aborting
那么為了解決這個問題,我們可以通過三種方式
- 就是
add
和commit
形成一次提交,從而清空我們的開發區(我推薦這個做法)。 - 通過
stash
命令將緩存區的內容保存到貯藏區(注意,這里只能保存緩存區的內容,工作區需要通過add
進入緩存區)。
但是stash
命令會存在一個問題,無法生成提交記錄,也就無法體現在版本控制流程中。一旦由於忘記取出貯藏區的內容並進行過提交,下次取出時很可能帶來文件沖突而增加工作量。所以推薦大家使用add
和commit
形成提交記錄進行清空。 - 清除報錯信息中的文件的修改,也就是把之前修改的內容還原。
現在讓我們選擇方式3,放棄修改,把leney.txt文件刪除。
分支合並
剛才我們創建了leney.txt后想要切換到develop分支失敗,我們選擇把leney.txt文件刪除。現在讓我們把存在於develop分支上的leney.txt文件拿到master分支下,這里就需要使用到Git的分支合並merge
功能。
- 確保當前在master分支,如果不是,請切換到master。
- 輸入命令
git merge develop
。
可以看到leney.txt出現在我們的目錄中,這樣我們就合並成功了。
分支刪除
當我們不再需要某個分支時需要進行刪除,我們可以使用branch
命令來進行,下面讓我們實踐一下。
- 確保當前在master分支,如果不是,請切換到master。
- 通過
git branch delete-me
創建新分支delete-me。 - 通過
git branch
可以看到我們剛剛創建的新分支。 - 使用命令
git branch -d delete-me
來刪除分支。
這樣,我們就完成了分支的刪除。對於分支的刪除有幾個注意點。
- 刪除的分支不能是當前所在分支
- 刪除的分支若是有未被合並到主分支(通常是master)的內容,則需要使用
git branch -D
。
本地倉庫和遠程倉庫的同步
push
學會了本地倉庫的提交和分支操作,讓我們來試試看如何與遠程倉庫同步。這里我選擇的是Gitee。
- 來到Gitee,參考幫助中心創建一個倉庫。(第一次使用的朋友記得在個人中心的SSH公鑰中添加自己電腦的公鑰,詳見Gitee幫助中心)。
- 到倉庫頁面招到我們的遠程倉庫的ssh地址並復制
git@gitee.com:leney/test.git。
- 來到本地,通過
git clone git@gitee.com:leney/test.git
將遠程倉庫拉取到本地。 - 進入test目錄添加README.md,輸入文字"遠程倉庫 push OK",保存。
- 通過
add
和commit
進行提交。 - 到這我們對本地倉庫的操作已經完成了,接着輸入命令
git push
便可以將我們當前對master分支的操作推送到遠程倉庫中。 - 來到Gitee倉庫便可以看到我們剛才的提交了。
pull
我們通過push
可以將本地同步到遠程,那么遠程同步到本地就需要用到pull
命令了。現在我們試一下。
- 回到目錄上一層再來做一次
clone
,這次我們輸入命令git clone git@gitee.com:leney/test.git test2
,指定目錄名,避免目錄名相同報錯。 - 進入test2目錄我們可以看到這次拉去的內容有了README.me。沒錯,
clone
會默認拉取最新的內容。 - 現在我們打開README.md,輸入文字"遠程倉庫 pull OK",保存。
- 進行
add, commit, push
操作,這樣我們就又推送了新的提交到遠程倉庫。 - 來到原先的test目錄,使用
git pull
命令就可以拉取到我們剛剛在test2目錄中新增的內容了。
標簽
通常我們會經歷項目發布之后的更新迭代,和書本一樣有第一版第二版,也有比如《尼爾:機械紀元 ver.1.22474487139...》。在Git中的體現就是標簽了,當我們的項目開發到一定階段需要發布的時候,我們可以通過tag
命令來打上標簽,那么來實踐下。
- 打開
git bash
,輸入命令git tag v1.0
。 - 輸入
git tag
來查看當前項目的所有標簽。 - 輸入
git show v1.0
來查看剛才我們創建的標簽的信息和對應的提交記錄。
好了,通過剛才的命令我們就成功標記了v1.0
這個版本。當我們的項目達到下一次可以發布的時候,再次進行標記,就可以通過git checkout tag名
來實現版本和版本之間的切換了。
同時,標簽也是可以推送到遠程的,通過git push origin --tags
可以推送多有的標簽,而要推送某一個標簽則使用git push origin tag名
,比如git push origin v1.0
。
最后,可以通過git tag -d tag名
來刪除標簽。
最簡單的工作流程
在之前的章節中,我們通過add, commit
成功進行了一次提交,通過checkout
創建了分支並進行分支切換,使用push, pull
讓本地倉庫和遠程倉庫進行同步,那么來到工作中又是怎么操作的呢?
- 首先我們需要通過
clone
到遠程倉庫獲取項目,生成一個和遠程倉庫關聯的本地倉庫。 - 然后切換到我們需要操作的分支,或是新建一個分支,再進行開發任務。
- 開發完畢后,使用
add
和commit
生成提交記錄。 - 使用
push
同步到遠程,然后切換到其他分支繼續開發其他任務。
那這就是最簡單的做工作流程了,不過通常我們工作中會進行多人協同開發,操作和管理會復雜許多,下一期我將介紹一下git在多人協同開發的使用。
總結
總結一下本文涉及到的命令。
init
創建一個本地倉庫。clone
將遠程倉庫拉取到本地倉庫。add
將文件從工作區添加到緩存區,本文使用了git add .
來進行添加,也可以git add xxx
來指定文件名。commit
將文件從緩存區提交到本地倉庫。push
將本地倉庫同步到遠程倉庫。pull
從遠程倉庫同步到本地倉庫。checkout
切換分支,git checkout -b xxx
則可以創建並切換到xxx分支,沒有-b
便是切換。merge
合並分支。status
查看當前工作區和緩存區的內容。log
查看提交記錄。branch
查看和操作倉庫所有分支。stash
將緩存區內容提交到貯藏區,Leney我不推薦使用。tag
可以在當前提交記錄生成一個標簽。