Git使用教程

Git 是 Linux 發明者 Linus 開發的一款版本控制系統,能夠方便地對代碼進行管理。版本控制是一種記錄一個或若干文件內容的變化,以便將來查閱特定版本修訂情況的系統。主要有以下功能:

  • 遠程備份代碼,能夠與本地進行同步,防止代碼的丟失
  • 方便開發團隊進行協同開發,既可以減少相互之間的影響,又可以同步別人的代碼
  • 開發時出現 bug,此時可以緊急對代碼進行還原
  • 軟件版本的功能迭代越來越多時,能夠清楚的知道每個版本的代碼改動記錄,甚至是每一個人的歷史提交代碼情況

1. Git 安裝

  • Mac:https://sourceforge.net/projects/git-osx-installer/
  • Windows:https://git-for-windows.github.io/
  • Linux:apt-get install git

2. Git 命令列表

Git 所有操作命令開頭都要以 git 開頭,在 Windows 下,在 cmd 窗口輸入命令 git,可以查看到 Git 最常用的命令及使用方法。
git 命令列表


3. Git 具體命令

第一步,首先新建一個文件夾,在文件夾裏面新建一個文件a.md,Linux 用戶可以用下面的命令創建:

mkdir test  (創建文件夾 test)
cd test     (切換到 test 目錄)
touch a.md  (新建 a.md 文件)

注意,在進行任何 Git 操作前,都要先切換到 Git 倉庫目錄下,也就是要切換到項目的文件夾目錄下。

git init

初始化 git 倉庫,也就是新建一個 git 倉庫。

git status

這個命令顧名思義就是查看狀態,可以看到提示a.md文件還沒有提交到倉庫裏。

git add

a.md 文件還沒有提交到倉庫裏,這個時候編輯下該文件,然後使用git add a.md命令可以將這個文件添加到緩存區,可以使用 git status 查看倉庫的狀態。這裏也可以使用git rm --cached這個命令移除這個緩存。

git commit

接着輸入git commit -m 'first commit'
這個命令的意思是提交到倉庫,-m代表提交信息,'first commit'表示提交的信息爲'first commit'。使用這個命令後可以將緩存區中的內容提交到倉庫裏。先將改動保存到緩存區再提交到倉庫,是爲了防止誤提交。

git log

這個時候輸入git log就會看到所有產生的 commit 記錄還有提交的時候附帶的信息,例如上面提到的'first commit'

git branch

branch 即分支的意思,分支概念在版本控制系統中十分重要。舉個運用分支的例子:A 和 B 在做同一個項目,但是不同的模塊,這個時候 A 新建了一個分支叫 a,B 新建了一個分支叫 b,這樣 A,B 做的所有代碼改動都各自在各自的分支,互不影響,等到兩人都把各自的模塊都做完了,最後再統一把分支合併起來。

執行git init初始化 git 倉庫之後會默認生產成一個主分支 master,也就是你所在的默認分支,也基本是實際開發正式環境下的分支,一般情況下 master 分支不會輕易在上面操作的,你可以輸入git branch查看下當前分支的情況。

如果想在此基礎上新建一個分支,執行git branch develop就新建了一個叫 develop 的分支,這時候分支 develop 跟分支 master 是一模一樣內容,再輸入git branch查看當前分支的情況:
在這裏插入圖片描述
可以看到 master 分支前有個 * 號,即雖然新建了一個 develop 分支,但是當前分支還是在 master 分支上,如果我們想在 develop 分支上進行開發,首先要切換到 develop 分支上才行。
執行git checkout develop切換到 develop 分支,然後再輸入git branch查看分支情況:
在這裏插入圖片描述

可以看到我們當前所在的分支已經是 develop 分支,這個時候 A 可以盡情地在他新建的 develop 分支上進行代碼的改動了。

如果嫌先新建再切換太麻煩,也可以使用git checkout -b develop一步到位。

git push origin develop

將本地的 develop 分支推送到遠程倉庫,如果你希望遠程該分支叫 develop2,可以執行:

git push origin develop:develop2

但一般不推薦這麼做,不利於分支管理,很容易造成混亂。

git branch -d

有新建分支,那就肯定有刪除分支,加入這個分支新建錯了,或者 develop 分支的代碼已經順利合併到 master 分支來了,那麼 develop 分支就沒有用了,需要刪除,這個時候執行git branch -d develop就可以把 develop 分支刪除了。

git branch -D

有些時候可能分支刪除失敗,比如如果 develop 分支的代碼還沒有合併到 master 分支,你執行git branch -d develop是刪除不了的,它會智能提醒你 develop 分支還有未合併的代碼,但是如果你非要刪除,那就執行git branch -D develop就可以強制刪除 develop 分支了。

git branch -a

該命令可以查看本地倉庫及遠程倉庫所有的分支

git push origin :develop

該命令用於刪除遠程分支,其中 origin 是遠程倉庫別名,develop 是分支,該命令及其危險,請慎重使用。

git checkout develop origin/develop

如果遠程倉庫有個 develop 分支,而本地沒有,你想把遠程 develop 分支同步到本地,可以使用該命令。

git checkout -b develop origin/develop

同樣是同步遠程 develop 分支到本地,順便切換到 develop 分支

git tag

進行軟件開發的時候經常有版本的概念,比如 v1.0、v1.1 之類的不同的版本肯定對應不同的代碼,所以一般要給我們的代碼加上標籤,這樣假設 v1.1 版本出了一個新 bug,但是又不曉得 v1.0 是否有這個 bug,有了標籤就可以順利切換到 v1.0 的代碼,重新打個包測試了。
如果想要新建一個標籤很簡單,比如git tag v1.0就代表我在當前的代碼狀態下新建了一個 v1.0 的標籤,輸入git tag可以查看歷史 tag 記錄。
想要切換到某個 tag 也很簡單執行git checkout v1.0,這樣就順利切換到 v1.0 tag 的代碼狀態了。


4. 提交代碼到遠程倉庫

git remote

如果你想查看已關聯的遠程倉庫,可以使用以下命令查看:

git remote -v

如果需要關聯一個新的遠程倉庫,可以使用以下命令:

git remote add remote_depository depository_url

  • remote_depository:爲遠程倉庫起個別名,一般第一個是 origin
  • depository_url:遠程倉庫的地址

git clone

如果本地沒有建好的倉庫,可以直接使用該命令直接複製遠程倉庫到本地,使用該命令不需要執行git init進行初始化,也不需要手動關聯遠程倉庫,因爲已經自動關聯好了。

git clone depository_url

git config

使用以下命令可以在提交記錄中顯示你的用戶名與郵箱:

git config --global user.name “developer”
git config --global user.email “[email protected]

git pull

如果有人提交代碼到遠程倉庫,這個時候你需要把遠程倉庫的最新代碼拉下來,保持兩端代碼同步,需要使用git pull命令。

git pull origin master

  • origin:遠程倉庫別名;
  • master:需要更新的分支。

git push

如果你的倉庫有了新的提交記錄,那麼就需要把本地代碼推送到遠程倉庫,這樣就可以保持本地倉庫跟遠程倉庫的同步了。

git push origin master

  • origin:遠程倉庫別名
  • master:需要推送的分支

5. Git 進階

git diff

當我們要查看好幾天前修改的代碼,做了哪些改動已經記不清了,在提交前需要再確認一下,這個時候就可以輸入git diff命令:

git diff [filename]

需要注意的是,這個命令只能比較你還沒有git add的文件。除此之外,該命令還可以比較兩個 commit 之間的差異,或者兩個分支之間的差異。

git diff [commit1 [commit2]] # 比較兩次提交之間的差異
git diff [branch1 [branch2]] # 在兩個分支之間比較

git checkout

git checkout命令一般用於切換分支,比如:

git checkout develop

但該命令不止用於切換分支,可以用於切換 tag 或者切換到某個 commit,如:

git checkout v1.0
git checkout commit1

除了切換,checkout 還有撤銷的作用。比如開發的時候有了很大的需求改動,原先的改動完全沒用了,這個時候可以通過以下命令撤銷文件的改動:

git checkout filename

git checkout命令只能撤銷沒有add進緩存區的文件。

git stash

當我們在一個新的分支上做新功能的開發,但是收到消息有一個 bug 需要切換分支進行緊急修復。但此時由於有文件被修改導致切換分支失敗,而新功能還沒做好你又不想提交,此時應該怎麼辦呢?

先執行以下命令:

git stash

該命令可以將未提交的代碼(包括已經git add的文件)先暫存起來,這個時候你再執行git status會發現當前分支很乾淨,幾乎沒有改動。查看暫存區的記錄,執行:

git stash list

你會發現暫存區已經有了一條記錄,此時你就可以放心大膽地切換分支進行 bug 修復。修復完成後,你可以再次切換回新功能分支繼續你的開發,執行以下命令還原暫存區的修改:

git stash apply

緊接着將暫存區的這條記錄刪除:

git stash drop

此外你也可以執行下面這條命令,取出並自動刪除記錄:

git stash pop

最後還有一條命令:

git stash clear

該命令用來清空緩存取所有的記錄。

git merge & git rebase

merge 是合併的意思,當我們在分支 featureA 開發完一個功能後,需要合併到 develop分支上去,我們只需要執行以下操作:

git checkout develop # 切換到 develop 分支
git merge featureA # 將 featureA 分支合並過來

其實 rebase 命令也是合併的意思,可以通過類似的操作達到上述的目的:

git checkout develop
git rebase featureA

git merge可以明顯看出各個提交記錄分別來自哪個分支,但合併比較暴力;而git rebase將不同分支的提交進行比較,重新排列後自動合併好,但是很難看出各個提交記錄分別來自哪個分支。

實際開發中不必過於糾結用哪種合併方式,從博主的開發經歷來說,當項目比較複雜且多人開發的時候,推薦使用git merge,當需要追溯歷史提交的時候,可以很方便地找到該提交對應的功能。

6. 解決衝突

當 A 和 B 同時開發兩個不同功能模塊,但由於都使用了基礎庫中某個方法,且都對該方法進行了修改。等兩人把各自的功能做完後,先後提交到 develop 分支。假設 A 先合併,此時沒有問題,合併成功。但 B 在合併的時候,該方法已經有了變化,即 A 和 B 同時對一個地方做了修改。git 不確定要以 A 的 commit 爲準還是以 B 的 commit 爲準,提示 conflicts,即衝突,這個時候就需要手動解決衝突後再進行一次 commit 提交。

<<<<<<< HEAD
This is A's commit.
=======
This is B's commit.
>>>>>>> featureB

上面代碼塊即是出現衝突的地方,=======將代碼分成上下兩塊,上半部分HEAD表示的當前分支的代碼,下半部分表示featureB這個分支的代碼,此時我們需要認爲需要判斷哪部分保留,哪部分刪除,或者對兩個功能做兼容,隨後再次進行提交。修改後如下:

if(isA())
	This is A's commit.
else if (isB())
	This is B's commit.

7. 分支管理

Git Flow 是一種比較成熟的分支管理流程,先看一張圖來體會下它的工作流程:
在這裏插入圖片描述
一般來說,大部分情況下都會有 master 和 develop 這兩個分支,它們的職責分別是:

  • master:永遠處在即將發佈(production-ready)的狀態
  • develop:最新的開發狀態

當項目準備上線的時候,會在 develop 分支上先進行測試,測試通過後,再合併到 master 分支上,並打上 tag。

但發佈之後我們又會進行下一版本功能的開發,中間可能又會遇到需要緊急修復 bug 、一個功能開發完成之後突然需求出現變動等情況,所以 Git Flow 除了 master 和 develop 兩個分支外,還提出了以下三個輔助分支:

  • feature:開發新的功能,基於 develop,開發完成後 merge 回 develop 分支
  • release:準備要發佈版本的分支,用來修復 bug,基於 develop,完成後 merge 回 develop 和 master
  • hotfix:緊急修復 master 分支上的問題,等不及 release 版本必須馬上上線
    。基於 master,完成後 merge 回 master 和 develop 分支

舉個例子,假設我們已經有 master 和 develop 兩個分支了,這個時候我們準備做一個功能,於是我們基於 develop 分支新建一個分支:

git branch feature/A

在開發過程中,發現線上有個重要 bug 需要緊急修復,於是我們馬上切換到 master 分支,並在 master 基礎上新建一個分支:

git branch hotfix/B

修復完成後直接合併到 master 和 develop 分支,緊接着發佈。隨後我們便可以切換回 feature/A 繼續進行新功能開發。如果開發完了,合併回 develop 分支,然後在 develop 分支上的測試環境中測試,測試沒什麼問題後,準備 release。這個時候新建一個分支:

git branch release/1.0

基於該 release 分支,在正式環境中進行發佈測試,期間遇到問題的時候,直接在該分支上進行修復。若測試通過達到發佈標準,把該分支合併到 master 和 develop,然後發佈。

發佈了5 篇原創文章 · 獲贊 3 · 訪問量 2870
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章