一、簡介
1.概述
Git 是一個開源的分布式版本控制系統,用于靈活高效地處理任何或小或大的項目。
Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放源碼的版本控制軟體。
Git 與常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本庫的方式,不必伺服器端軟體支援。

image
2.工作流程
一般工作流程如下:
-
- 克隆 Git 資源作為工作目錄。
- 在克隆的資源上添加或修改檔案。
- 如果其他人修改了,你可以更新資源。
- 在送出前檢視修改。
- 送出修改。
- 在修改完成後,如果發現錯誤,可以撤回送出并再次修改并送出。 image
git代碼倉庫管理
3.基本配置
git config: 環境設定指令
通常情況下,安裝完Git後的第一件事就是設定使用者名稱和郵件位址。每一個Git的送出都會使用這些資訊,如果不設定則無法進行送出。
git config --global user.name "goto456" // 設定使用者名稱
git config --global user.email "[email protected]" // 設定郵件位址
使用--global參數表示設定了全局的環境,如果想對與特定的項目使用不同的使用者名和郵件位址,則可已在該項目目錄下不使用--global參數設定不同的使用者名和郵件位址。
git config --list指令可以列出目前Git所有的配置資訊。
ssh-keygen: 生成SSH公鑰
生成公鑰之前先檢查系統中是否已經有了公鑰,公鑰一般在~/.ssh/目錄下。如果該目錄下存在id_rsa.pub檔案,這就是公鑰(id_rsa 檔案是私鑰);如果不存在此檔案,甚至連.ssh目錄都不存在,則需要用 ssh-keygen 指令來生成。如下所示:
ssh-keygen // 然後一直按Enter鍵
這就可以生成 SSH key 了,公鑰id_rsa.pub檔案的内容大緻如下所示:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/bdrJjo6HNCuzhpTZNVsTju5NnksTca2kRzfbZlFs+8S4bs8hTlo6aV/GJPkTT0zxJfuOgfd4B4O8Xh0NQg51Zl4yCsFdnIKFA0tgBOg/H5oi48Ypoo8hHfvtxqYrG1Blhf0t6HhkHz9Fd8StCUIDQv7yHHvuuPFumh3/8PNG8DDPQqWsqXmK2XozT [email protected]
二、基本指令
1.擷取倉庫
擷取一個 Git 倉庫有2中方法:
本地初始化一個倉庫
從遠端克隆一個倉庫到本地
對于第1種方式,如果想對本地現有的一個項目用 Git 來管理,可以直接進入該項目的目錄下執行如下指令,就可以将其初始化成一個 Git 倉庫了:
git init
對于第二種方式,也是最常用的方式,比如你在 GitHub 上(或者其他代碼托管網站)已經建立了一個項目,你就可以将該項目從遠端克隆到本地,這就有了該項目在本地的 Git 倉庫。
git clone [email protected]:goto456/leetcode.git // 通過ssh方式克隆
git clone https://github.com/goto456/leetcode.git // 通過https方式克隆
以上2種方式有如下差別:
-
- https方式:不管是誰,隻要拿到該項目的 url 可以随便 clone,但是在 push 到遠端的時候需要驗證使用者名和密碼;
- ssh方式:需要現将你電腦的SSH key(SSH公鑰)添加到GitHub(或者其他代碼托管網站)上,這樣在 clone 項目和 push 項目到遠端時都不需要輸入使用者名和密碼。
2.工作區、暫存區和版本庫
工作區(Working Directory):就是你在電腦裡能看到的目錄
版本庫(Repository):工作區有一個隐藏目錄.git,這個不算工作區,而是Git的版本庫。
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master
,以及指向master的一個指針叫HEAD。
image
3.送出修改
git status 檢視目前狀态
可以在任何時候使用該指令檢視目前的狀态。一般會顯示目前所處的分支,以及目前工作區是否幹淨,是否有檔案要送出。
當你克隆遠端倉庫到本地後,通過該指令檢視目前狀态時,顯示資訊如下圖所示:
image
當你修改了一個檔案後,再用該指令檢視目前狀态,顯示資訊如下圖所示:
image
git diff: 顯示變更内容
當你對檔案進行了修改,想檢視進行了哪些修改時,可以通過該指令檢視。
git diff指令會顯示修改的檔案中哪些内容進行了修改,包括新增了哪些内容,删除了哪些内容。
git diff README.md //後面接檔案名,表示隻顯示該檔案的變更
例如:我對 README.md 檔案進行了修改,删除了1行,新增了2行,然後用該指令檢視進行了哪些修改,如下圖所示: (“+” 表示新增的内容,“-” 表示删除的内容)
image
git add: 添加到暫存區
無論你新增了一個檔案或者對已有的檔案進行了修改,都需要将其添加到暫存區,然後送出到版本庫。
git add hello.txt //後面接檔案名,表示将某個檔案添加到暫存區
git add . //後面接一個點,表示将全部檔案添加到暫存區
如果是删除的檔案,用git add -A 檔案名,或者git rm 檔案名 添加到暫存區
image
git commit: 送出到版本庫
該指令是将添加到暫存區的變更送出到版本庫:
git commit -m "變更的說明資訊"
image
4.撤銷修改與版本回退
撤銷檔案的修改包括以下兩個場景:
從工作區撤銷某個檔案修改(修改當然也包括删除):
git checkout -- filename //filename替換為你想撤回的檔案名
從暫存區撤銷某個檔案修改:
git reset HEAD filename //filename替換為你想撤回的檔案名
回退版本
git log: 檢視曆史送出
如果發現送出了一個錯誤版本,想回退到上個版本時,就可以通過該指令來檢視所有的曆史版本,以選擇回退到曆史的哪個版本。
git log //檢視曆史版本
git log --graph //以圖形的方式檢視曆史
執行後,如下圖所示:
image
git reset: 回退版本
常用于回退版本或者在各個版本間進行跳躍切換。 我們可以先用 git log 看一下目前曆史版本,如下圖所示:
image
如果要回退兩個版本,則隻需要輸入:
git reset HEAD~2
或者
git reset --hard a8336834b50daafa0793370
5.拉取與送出
-
-
git pull: 拉取遠端分支到本地并合并
一般是本地分支的進度落後于遠端分支時,需要使用該指令。
指令:
git pull origin master
origin 表示遠端代碼庫的一個别名(也可以修改為其他名字,可通過 git remote 修改),master 表示需要拉取合并的分支名稱。
指令:
用 rebase 的方式進行,不會産生 merge 保持分支幹淨、整潔git pull --rebase origin master
-
git push: 推送本地分支到遠端
當修改完成,本地的改動都已經送出到本地庫,則可以将本地分支推送到遠端代碼庫了。
指令:
git push origin master
origin 表示遠端代碼庫的一個别名(也可以修改為其他名字,可通過 git remote 修改),master 表示需要推送的分支名稱。
如果,push 的過程中提示目前分支進度落後于遠端的分支,則需要通過 git pull 指令來拉取遠端最新狀态和本地分支進行合并,完成之後再 push 到遠端就可以了。
6.标簽管理
git tag: 标簽的操作
用于給某次送出打個标簽,例如截止到某次送出後完成了某個重大版本的開發,則可以在該次送出打上一個版本的 tag 。
指令:
git tag v1.0
為目前送出打上 v1.0 的标簽
指令:
git tag v1.0 ab1591eb4e06c1e93fdd50126b9fab8a88d89155
為這個節點打上 v1.0 的标簽
指令:
git tag -a <tagname> -m "blablabla..."
可以指定标簽資訊;
指令:
git tag
可以檢視所有标簽。
指令:
git show tag_name
顯示某個 tag 的詳細資訊(git show commit_id 顯示某次送出的詳細資訊)
指令:
git push origin <tagname>
可以推送一個本地标簽;
指令:
git push origin --tags
可以推送全部未推送過的本地标簽;
指令:
git tag -d <tagname>
可以删除一個本地标簽;
指令:
git push origin :refs/tags/<tagname>
送出到遠端。
三、分支使用及場景
1.分支總覽
image
image
image
image
2.建立、删除與合并分支
git branch
用于顯示本地所有分支以及目前所在哪個分支。圖中顯示本地有 master 和 dev 兩個分支,并且正處在 master 分支上。
git branch -vv
還能看到遠端分支與關聯情況:
image
git branch branchName
用于建立名為 branchName 的新分支。後接origin/dev,辨別建立分支并關聯dev分支:
image
git branch -D branchName
用于删除名為 branchName 的分支:
image
git checkout branchName
用于從目前分支切換到名為 branchName的分支上:
image
git checkout -b branchName
用于建立名為 branchName的分支并切換到該分支上。後面同樣可以接origin/dev這樣的參數,表示并關聯遠端的dev分支:
image
git merge
指令用于合并指定分支到目前分支。
需要注意的是,如果對同一份檔案做了不同的修改,就會産生沖突,這時候需要手動解決沖突,再送出,完成merge。
例如以下檔案就是在merge的時候産生的沖突:
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
3.分支政策管理
在實際開發中,我們應該按照幾個基本原則進行分支管理:
首先,master分支應該是非常穩定的,也就是僅用來釋出新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本釋出時,再把dev分支合并到master上,在master分支釋出1.0版本;
你和你的小夥伴們每個人都在dev分支上幹活,每個人都有自己的分支,時不時地往dev分支上合并就可以了。
是以,團隊合作的分支看起來就像這樣:
image
4.臨時儲存工作現場
修複bug時,我們會通過建立新的bug分支進行修複,然後合并,最後删除;
當手頭工作沒有完成時,先把工作現場git stash一下,然後去修複bug,修複後,再git stash pop,回到工作現場;
5.從某個分支的送出複制粘貼到另一個分支
git cherry-pick <commit>
也可以用AndroidStudio工具,進行cherry-pick,這裡就不詳細展開了
6.AndroidStudio檢視git操作
這裡主要介紹常用的git diff圖形化界面: