一文快速掌握 Git 用法

CSDN資訊發表於2017-12-20

點選上方“CSDN”,選擇“置頂公眾號”

關鍵時刻,第一時間送達!

一、Github 基礎

什麼是 Git?

git 是一個分散式版本控制軟體,最初由林納斯·託瓦茲(Linus Torvalds)(Linux 之父)創作,於 2005 年釋出。最初目的是為更好地管理 Linux 核心開發。Git 在本地磁碟上就儲存著所有有關當前專案的歷史更新,處理速度快;Git 中的絕大多數操作都只需要訪問本地檔案和資源,不用實時聯網。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

Git 客戶端

TortoiseGit 是一個 Git 版本控制客戶端,作為 Microsoft Windows 的外殼擴充套件實現,使用者介面友好,大多數人應該用過 TortoiseSvn;

MsysGit 是一個輕量級的 Git 工具集,可以進行各種 Git 操作,MsysGit 又分為簡單的介面 Git GUI,和命令列 Git Bash,我們這節課主要通過 Git Bash 來演示。

Git 服務端:GitHub 和 Gitlab

GitHub 是一個共享虛擬主機服務,用於存放使用 Git 版本控制的軟體程式碼和內容專案;允許使用者跟蹤其他使用者、組織、軟體庫的動態,對軟體程式碼的改動和 bug 提出評論。

0?wx_fmt=png

0?wx_fmt=png

GitLab 是一個利用 Ruby on Rails 開發的開源應用程式,實現一個自託管的Git 專案倉庫,可通過 Web 介面進行訪問公開的或者私人專案,擁有與 Github類似的功能,能夠瀏覽原始碼,管理缺陷和註釋。

Git 基本概念

三種工作區域

  1. Git 的本地倉庫:在 .git 目錄中

  2. 工作區:使用者操作目錄

  3. 暫存區:在 .git 目錄中

0?wx_fmt=png

三種狀態

  1. 已提交(committed):該檔案已經被安全地儲存在本地倉庫中

  2. 已修改(modified):修改了某個檔案,但還沒有提交儲存

  3. 已暫存(staged):把已修改的檔案放在下次提交時要儲存的清單中

0?wx_fmt=png

注:狀態轉換圖示如下

0?wx_fmt=png

0?wx_fmt=png

0?wx_fmt=png

Git 分支初識

  1. Git 中的分支,其實本質上僅僅是個指向 commit 物件的可變指標。

  2. Git 會使用 master 作為分支的預設名字。在若干次提交後,你其實已經有了一個指向最後一次提交物件的 master 分支,它在每次提交的時候都會自動向前移動。

  3. Git 鼓勵在工作流程中頻繁使用分支與合併。

0?wx_fmt=png

0?wx_fmt=png

0?wx_fmt=png

0?wx_fmt=png

0?wx_fmt=png

二、Git 工作流程

git 的工作流程見下圖,這是最標準的git使用流程,我們可以看到 git 是通過對各分支的維護來規範工作的。

首先有一條master分支,這是釋出穩定版,一般不會對 master 進行修改,當有新需求的時候,從 master 上分出一條 develop 分支,具體開發人員在從 develop 上分出自己具體 feature 分支,開發完畢後合併回 develop 分支,測試人員從 develop 分支分出 release 分支進行測試,沒有問題了合併到 master 分支釋出。如果線上有 bug 需要處理,則從 master 上分出 hotfix 分支,用來解決 bug。

0?wx_fmt=png

三、Git 基本操作

配置使用者名稱和郵件

開啟 git bash,配置命令:

git config --global user.name "your name"

git config --global user.email "your email"

建立版本庫

版本庫又名倉庫,英文名 repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被

Git 管理起來:

1. 新建目錄初始化

 mkdir testgit 

 cd testgit

2. 從當前目錄初始化

$ git init

檢視倉庫狀態:

git status

新增到暫存區:

git add fileA fileB fileC ....

提交到本地倉庫:

git commit -m “remarks”

檢視修改內容(工作區和倉庫的區別):

git diff (file)

檢視版本(引數可以簡化版本資訊,commit id和備註):

git log --pretty=oneline

版本回退

在 Git 中,用 HEAD 表示當前版本,也就是最新的提交 commit id,上一個版本就是 HEAD^,上上一個版本就是 HEAD^^,當然往上 100 個版本寫 100 個 ^ 比較容易數不過來,所以寫成 HEAD~100。

回退到上一個版本 :

git reset --hard HEAD^

丟棄工作區的修改(撤銷):

git checkout -- file

刪除檔案:

  1. 正確操作:git rm file git commit -m “remove file”(檔案被刪除)

  2. 操作失誤:git checkout -- file(檔案被恢復)

檢視當前分支:

 git branch (-a)

新建分支:

 git branch develop(只是新建了一條分支,並未切換)

切換分支:

 git checkout develop

新建並切換分支:

 git checkout -b feature(相當於3.10和3.11兩步操作)

刪除分支:

 git branch -d feature(注意:不能刪除當前所在分支)

合併分支(--no-ff引數,表示禁用Fast forward):

git checkout develop  &&  git merge feature(把feature分支合併到develop分支)

注:

  1. 因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支, 所以預設git commit就是往master分支上提交更改。

  2. 如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <branch>強行刪除。

  3. 建立本地分支和遠端分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;

Git 基本操作---和遠端伺服器互動(一)

新增遠端伺服器:

git remote add dcmsStatics4.5git(別名)http://gitlab.cephchina.com/ccod_project/dcmsstatics4-5git.git

檢視遠端伺服器的相關資訊:

git remote -v

git remote show dcmsStatic4.5git

重新命名遠端倉庫信:

git remote rename demo test

刪除遠端倉庫:

git remote rm test

注:由於遠端庫是空的,我們第一次推送master分支時,加上了-u引數,Git不但會把本地的master分支內容推送到遠端新的master分支,還會把本地的master分支和遠端的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。

之後,只要本地作了提交,就可以通過命令把本地master分支的最新修改推送至GitLab:

git push dcmsStatic4.5git master

遠端倉庫

從遠端倉庫獲取資料:

  • git fetch origin develop --- 只是獲取遠端倉庫的資料至 .git 目錄,並未merge本地

  • git merge origin/develop --- 把獲取的遠端倉庫的資料手工merge至當前分支

  • git pull origin develop ---- 獲取遠端倉庫的資料,並自動merge至當前的分支,相當於以上兩步

合併兩個不同的專案:

--allow-unrelated-histories

把本地倉庫的內容推送到遠端庫上:

git push (-u) demo develop(從svn遷移到gitlab注意路徑,要確保路徑正確)

注:

從遠端分支 checkout 出來的本地分支,稱為跟蹤分支(tracking branch)。跟蹤分支是一種和遠端分支有直接聯絡的本地分支。在跟蹤分支裡輸入git push,Git 會自行推斷應該向哪個伺服器的哪個分支推送資料。反過來,在這些分支裡執行git pull 會獲取所有遠端索引,並把它們的資料都合併到本地分支中來。

在克隆倉庫時,Git 通常會自動建立一個名為 master 的分支來跟蹤 origin/master。這正是 git push 和 git pull 一開始就能正常工作的原因。當然,你可以隨心所欲地設定為其它跟蹤分支,比如 origin 上除了 master 之外的其它分支。

Git 基本操作:和遠端伺服器互動(二)

從遠端庫克隆:

  1. 從 svn 克隆 git svn clone 地址

  2. 從 git 遠端庫上克隆:git clone 地址

在本地建立和遠端分支對應的分支,使用git checkout -b branch-name origin/branch-name

四、Git 標籤

git 標籤,通常用來給分支做標記,如標記一個版本號。\

建立

標籤分類

輕量級標籤:

git tag <tagname> commit id

帶說明標籤:

git tag -a  <tagname> commit id

git tag -m <msg> <tagname> commit id

帶簽名的標籤(GPG加密,需安裝配置):

git tag -s  <tagname> commit id

git tag -u  <key-id> commit id

檢視和刪除

檢視標籤:

git tag

git tag –n

git show <tagname>

刪除標籤:

git tag -d <tagname>

共享標籤

向上遊版本庫提交標籤:

git push origin <tagname>

git push origin  --tags

刪除遠端版本庫的標籤:

git push origin :tag2

五、補充

Git 分支衝突解決

如果在不同的分支中都修改了同一個檔案的同一部分,Git 就無法乾淨地把兩者合到一起 Git 作了合併,但沒有提交,它會停下來等你解決衝突。可以用 git status 查閱哪些檔案在合併時出現衝突。

Git 會在有衝突的檔案里加入標準的衝突解決標記,可以通過它們來手工定位並解決這些衝突。

注:用帶引數的 git log 也可以看到分支的合併情況:

git log --graph --pretty=oneline --abbrev-commit

衝突標記<<<<<<< (7個<)與=======之間的內容是我的修改,=======與>>>>>>>之間的內容是別人的修改。 最簡單的編輯衝突的辦法,就是直接編輯衝突了的檔案,把衝突標記刪掉,把衝突解決正確。

特殊場景

場景:當接到一個新的 bug,急需解決,但是目前工作想保留。

方法:Git 還提供了一個 stash 功能,可以把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作:比如你正在 dev 分支開發,突然接到 master 上有一個特別急的 bug 需要解決,這時就可以把當前 dev 的工作現場“儲藏”起來。

首先“儲藏” dev 的工作現場 git status,然後從 master 建立臨時分支:

git checkout master

git checkout -b issue-101

現在修復 bug,然後提交:

git add readme.md

git commit -m "fix bug 101"

修復完成後,切換到 master 分支,並完成合並,最後刪除 issue-101 分支:

git checkout master

git merge --no-ff -m "merged bug fix 101" issue-101

接著回到 dev 分支幹活了!

git checkout dev

git status

工作區是乾淨的,剛才的工作現場存到哪去了?用 git stash list 命令看看:

git stash list

工作現場還在,Git 把 stash 內容存在某個地方了,但是需要恢復一下,有兩個辦法:

一是用 git stash apply 恢復,但是恢復後,stash 內容並不刪除,你需要用 git stash drop 來刪除;另一種方式是用 git stash pop,恢復的同時把 stash 內容也刪了:

git stash pop

再用 git stash list 檢視,就看不到任何 stash 內容了。你可以多次 stash,恢復的時候,先用 git stash list 檢視,然後恢復指定的 stash,用命令:

git stash apply stash@{0}

遠端分支

提交本地 test 分支作為遠端的 develop 的分支:

git push origin develop:test

刪除遠端的 test 分支,但是本地還會儲存的:

git push origin :test     

忽略特殊檔案

我們在開發過程中,有一些檔案是不需要提交的,但是 git 總顯示這部分檔案會讓人很不舒服,這時我們就可以通過編輯 .gitignore 檔案來使不需要提交的檔案不在提示,編寫要忽略的檔案,下列內容是 Java 開發者經常用到的:

 # java:

 *.class

 # My configurations:

 db.ini

 deploy_key_rsa

注:# 此為註釋,這行內容將被 Git 忽略

# 忽略所有 .a 結尾的檔案

*.a

# 但 lib.a 除外

!lib.a

# 僅僅忽略專案根目錄下的 TODO 檔案,

/TODO

# 忽略 build/ 目錄下的所有檔案

build/

# 忽略 doc/notes.txt 

doc/*.txt

配置別名

git 命令可不可以根據自己的特點配置別名呢,當然是可以的,這樣做能提高工作效率,下列是一些簡單的例子。

git config --global alias.st status(git st=git status)

git config --global alias.co checkout(git co=git checkout)

git config --global alias.ci commit(git ci=git commit)

git config --global alias.br branch(git br=git branch)

git config --global alias.last 'log -1'(git lat= git log -l)

git config --global alias.unstage 'reset HEAD'(git unstage=git reset HEAD)

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"(這個大家可以親自試試,特別炫)

切換使用者

檢視當前配置(使用者):

git config --list

修改配置:開啟全域性的 .gitconfig 檔案:vi ~/.gitconfig;然後在檔案中直接修改。

————— END —————

640?wx_fmt=jpeg640?wx_fmt=png0?wx_fmt=gif

相關文章