團隊協做Git入門指南

前言

因爲九心同窗以前一直擔任獨立開發的職位,因此對於協做開發這塊兒的技能有所欠缺,對Git命令的使用還停留在獨立開發上,日常用的最多的三個命令也就:git

  • git clone
  • git commit
  • git push origin master

這不,在進入新的公司之後,狂補了一波Git命令,今天咱們就來聊一聊工做中的經常使用的Git命令。 表情web

在閱讀下文以前,推薦一個練習Git命令的網站(強力推薦):c#

Learn Git BranchingAZ編輯器

以及一些學習網站:分佈式

《Git文檔》 《廖雪峯的Git教程》post

目錄

1、基礎必讀

1. Git是什麼?

對於這個問題,咱們能夠看一下官方文檔:學習

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一個免費和開源的分佈式版本控制系統,致力於高效和快速的處理任何小或者大的項目。flex

2. Git中的幾個概念

工做區、暫存區和版本庫

瞭解Git中的工做區和版本庫很重要:動畫

  • 工做區:簡單來講,咱們當前電腦可以看到的目錄。
  • 版本庫:使用過Git都知道里面有一個隱藏的目錄 .git,這即是咱們所說的版本庫,其中,版本庫又分爲暫存區和分支。 git add 命令將文件從工做目錄提交到暫存區, git commit 命令將文件從暫存區提交到git倉庫。
Git的過程
Git的過程

文件狀態

若是咱們想看一下工做區和暫存區文件的狀態,可使用命令 git status,好比我最近學習的Flutter項目:網站

wangjiedeMacBook-Pro:flu_pro wangjie$ git status
warning: unable to access '/Users/wangjie/.config/git/attributes': Permission denied On branch master Changes to be committed:  (use "git reset HEAD <file>..." to unstage)   new file: lib/main.dart  Changes not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git checkout -- <file>..." to discard changes in working directory)   modified: lib/HelloWorld.dart  Untracked files:  (use "git add <file>..." to include in what will be committed)   .metadata  //... 省略  複製代碼

其中:

  • Changes to be committed:暫存區的文件。
  • Changes not staged for commit:工做區的文件,還未保存到暫存區。
  • Untracked files:指那些第一次建立,尚未加入版本更新的文件。

在 Android Studio(下稱AS)中,更加方便: Git文件狀態 裏面有不少顏色:

  • 白色:已commit,可是沒有發生變化的文件。
  • 藍色:commit以後發生了變化
  • 原諒綠:暫存區的文件。
  • 黃色:不須要進行版本控制的文件。

分支

分支是多人協做開發中必不可少的角色,由於在咱們的開發過程當中,至少會有兩個分支:

  • 正式版本的分支:線上代碼版本保存的分支,須要穩定的運行。
  • 開發主線的分支:下個版本需求的開發分支。

除了這些分支,還可能有修復Bug的分支等。

2、基礎命令

1. 暫存區相關

添加進暫存區

具體命令: 添加所有文件

git add .
複製代碼

若是是添加某個文件

git add <文件路徑>
複製代碼

命令解釋: 將工做區的文件添加進暫存區。

IDEA或AS: 在IDEA或者AS中,在你進行Git初始化以後,當你添加新的文件時,會有這樣的提示: Git Add 也能夠這樣,右擊文件 > 選擇「Git」> 選擇「Add」和「Add to .gitignore」,分別對應着添加到暫存區和配置忽略文件: Git選項 加入到暫存區意味着該文件加入到版本控制中。配置到忽略文件則意味着不會加入到版本控制。

撤銷工做區的變動

這種狀況可能會常常出現,你修改了某個文件的不少處代碼,可是卻不想挨個刪除,如上代碼就起做用了。

命令解釋 撤銷工做區的代碼修改。

具體命令

git checkout -- file
複製代碼

注意必定要加上--,否則就會變成切換分支(下面會講)。

IDEA或者AS AS能夠很方便的查看某個文件修改了哪些代碼。步驟是:選擇下方「Version Control」> 選擇具體的文件 > 點擊 diff 查看文件的更改 有哪些差異一目瞭然,而且你能夠點擊對應的按鈕撤銷更改的代碼 撤回更改 一不當心把git diff要進行的操做給講了...

撤銷暫存區的變動

另一種狀況是改完代碼之後,若是使用了 git add,將代碼提交到了暫存區,以前的命令就無論用了。

命令解釋 撤銷暫存區的代碼修改。

具體命令

git reset HEAD file
複製代碼

這個命令在AS或者IDEA下使用的場景很少

2. 版本庫相關

Commit代碼

命令解釋 將暫存區的文件添加進版本庫

具體命令

git commit -m <提交描述信息>
複製代碼

動畫模型 git commit 輸入git commit以後,沙盒模型中發生了什麼?其實就是生成了一個新的版本記錄:

IDEA或者AS 我通常針對對應的需求,新建一個Change List,具體過程以下是:

選中「Version Control」 > 選擇某個 Change List > 右擊彈出選擇框 > 選擇「New Changelist」 新建Changelist 如需 commit,選擇上圖「Commit」,輸入 Commit Message 便可 Commit彈出框

撤銷提交

常見場景是你使用了 git commit 提交了代碼,可是還沒提交到遠程分支,隨後你很快發現了此次提交會帶來重大問題,因而你想撤銷此次提交。

命令解釋 在沒有上傳到遠程分支時,進行版本庫的撤銷。

具體命令

git reset HEAD~1
複製代碼

HEAD 表明當前的頭結點,HEAD~1 表明當前節點的前一個節點,後面解釋。

動畫模型 Reset版本庫.gif

IDEA或者AS 在 AS 中,先打開到版本提交歷史 Reset操做 好比我想回退到 first commit 的那個版本 > 選中右擊 > 選擇【Reset Current Branch to Here...】,以後彈出一個彈出框 Reset選項 四個選項的區別:

  • Soft:當前的文件不變(可是你能夠根據 git diff查到文件發生了哪些變化),暫存區的提交記錄也會被保留。
  • MIxed:當前文件不變,暫存區提交記錄不會被保留。
  • Hard:當前文件回退到選擇的版本,任何當前的改變都不會被保存下來,慎用。
  • Keep:當你工做區或者暫存區有改變的時候,相似於處理衝突的情形,可手動選擇要保存哪些內容。

查看改動

人又不是機器,忘記本身改了哪些東西也是常有的事兒。

命令介紹 比較當前工做區和上一個版本的差別

在不輸入文件路徑的狀況下,默認比較的是當前工做區和上一個版本的區別,而且命令行會告訴你什麼類的變化是什麼樣的。內容我就不羅列了。

IDEA或者AS 已介紹,再也不贅述~

3. Branch

查看分支

具體命令

git branch
複製代碼

命令介紹 查看本地分支

命令結果 查看分支

IDEA或者AS 點擊右下角紅色部分便可展現本地分支和遠程分支,而且能夠切換分支。 AS查看分支

建立分支

命令介紹 建立一個分支。

具體命令

git branch <name>
複製代碼

必須加上分支名。

動畫效果 建立分支

IDEA或者AS 跟分支查看的按鈕在同一處,點擊「New Branch」完成。

切換分支

命令介紹 切換分支

具體命令

git checkout <name>
git checkout -b <name> 複製代碼

第一個命令是切換分支,第二個命令是建立並切換分支,git checkout 也能夠用來撤回工做區的修改,你們注意區分。

動畫效果 切換分支 圖片中不只僅是切換分支,切換完之後,還進行了一次提交,至此,兩個分支就不在同一個版本了。

IDEA或者AS 同查看分支同樣 查看並切換 若是想查看當前各個分支所對應的版本,點擊「Version Control」> 再點擊「log」。 查看日誌

合併分支

下一個版本的代碼迭代完畢,準備上線,這時你就能夠合併分支。

命令介紹 合併分支。

具體命令

git merge <name>
複製代碼

動畫效果 Merge分支 能夠看到,在 C2C3 的版本下面,合併生成了一個新的版本 C4master 分支直接指向了 C4

除了 git merge 外,還有一個合併分支的命令,咱們看看這二者有什麼區別。

具體命令

git rebase <分支名>
複製代碼

動畫效果 Rebase分支 能夠看到,當前分支 bugFix 指向的版本 C3失蹤了,而在 master 分支下面生成了一個 C3',雖然看不出 C3' 是由原來的 C2C3 合併的,但新的提交記錄更加線性和簡潔。

git mergegit rebase 兩種動畫效果能夠得出:

  • Merge:保留以前的提交順序。
  • Rebase:獲得的提交歷史更加線性,看着更加簡潔。大部分團隊的選擇。

IDEA或者AS 選中右下角「git:分支名」> 選中具體分支 > 選擇Rebase或者Merge Rebase or Merge

3、遠程命令

1. 更新代碼

團隊協做時每次要上傳代碼以前記得拉取最新代碼。

命令介紹 拉取最新代碼

具體命令

git pull <origin> <local分支名>
複製代碼

這裏的 origin 是咱們遠程分支的別名,是能夠本身定義的,一般咱們使用 git remote add <origin> <遠程倉庫地址> 來添加。

動畫效果 Pull遠程倉庫 能夠看到,遠程的代碼被拉下來之後,若是你的代碼已經提交過,它會先 merge 代碼,以後再將當前分支切換到最新的版本。

IDEA或者AS 這是 「VCS」>「Git」>「Remotes」下遠程倉庫的記錄: 遠程倉庫地址 你能夠選擇左下角的添加按鈕手動添加。

下拉代碼就更加簡單了,點擊右上角的按鈕,第一次下拉的時候會生成一個彈窗 下拉代碼 左邊的 Update Type 就很少介紹,右邊的 Clean working tree before update 有兩個選項,第二個並非 Git 中的,而且 IDEA 也說了之後會去除,咱們就無需瞭解了,選擇 Using Stash 就對了。

Using Stash對應着 Git 命令中的 git stash,由於合併兩個分支前須要提交改動的代碼,但咱們當前的開發尚未完畢,不想平白無故的進行一次提交從而髒了咱們的提交記錄,這時就可使用git stash,它會先將工做區的代碼暫存好,以後清空工做區的代碼,合併遠程分支的代碼,最後再將工做區的代碼恢復。

處理衝突 但凡是協做開發,在工做合理分配的狀況下偶爾也會出現衝突,選用《關於Android Studio使用Git的總結》中的圖片,當出現衝突時,會出現以下彈框 出現衝突 除非明確的知道使用誰的代碼,通常咱們會點「Merge...」,以後會出現另一個彈框 解決衝突 從圖中能夠很清晰的看出,彈框分爲左中有三塊:

  • 左:本地代碼
  • 中:合併的結果
  • 右:遠程的代碼

若是想選擇左邊的代碼,點擊左邊「>>」按鈕,不想選擇點「x」按鈕,肯定好代碼之後點擊右下角的「Apply」按鈕。

2. 上傳代碼

除了下載最新的代碼,咱們還須要將本身改動的代碼上傳。

命令介紹 上傳最新的代碼。

具體命令

git push <origin> <本地分支名>
複製代碼

動畫效果 Push遠程倉庫 左邊是本地分支,右邊是遠程分支。

IDEA或者AS 正常咱們在 commit 代碼的時候,能夠選擇 Commit and Push,也就是提交代碼的時候附帶 Push提交選擇Push 若是你不想在 Commit 的時候進行 Push,也能夠選擇在菜單欄中的「VCS」選擇單獨 Push

3.遠程進階

在上面的推送命令中,默認了遠程倉庫的分支和當前的分支名一致,好比 git push origin master,本地分支名和遠程分支的名稱都爲 master,那若是不一致呢?

具體命令

git push <origin> <本地分支:遠程分支>
複製代碼

更新的命令也是如此

git push <origin> <遠程分支:本地分支>
複製代碼

直接看可能有點抽象,咱們直接看圖。

動畫效果 Push進階 此次試用了相對引用,即 foo^ 指向 foo 分支指向的版本的上一個版本,因此遠程倉庫 master 分支也只更新到了 foo 分支指向版本的上一個版本。

進階命令

1. 相對引用

使用 Hash 值指定版本並不老是很方便,好比你想將版本 revert 到上個版本,你得先查一下版本的 Hash 值,以後再去使用這個 Hash 值去 revert,顯然這樣的方式並不優雅。

上一個版本

命令介紹 指定當前版本的上一個版本。

具體命令

HEAD^
分支^ Hash值^ 複製代碼

這裏使用 HEAD、分支和 Hash 值均可以,只要能肯定版本庫便可。

好比上一個版本的代碼代碼出現 bug 了,我想在 master 分支上一個版本的基礎上對代碼進行修改,我能夠輸入 git checkout -b bugfix master^

動畫效果 上一個版本 這是一個分離 HEAD 的命令,將 HEAD 分離到當前 master 分支指向版本的上一個版本。

上N個版本

命令介紹 回退到指定版本的前N個版本。

具體命令

HEAD~2
分支~n Hash值~n 複製代碼

其餘和上一個命令類似,再也不贅述。

追加更新

你剛提交了一筆代碼,忽然發現了一個錯誤,這時你確定不想爲此再建立一個提交。

命令介紹 更新上次 commit 的代碼,避免再次生成一個 commit 記錄。

具體命令

git commit --amend
複製代碼

動畫效果 更新提交 能夠從動圖中看到,原先的版本庫 C2 消失了,取而代之的是 C2',它們兩個實際上是一個版本,對應的 id 是同一個。

IDEA或者AS As中的amend 選中「Amend commit」,至於「Sign-off commit」,日常基本用不着。

總結

以上的命令已經能夠勝任平時的開發,而對於一些複雜的命令,使用的時候再查。若是你有一些常用的命令,也歡迎在評論區補充。

進入新公司已經一個月了,終於恢復到了本身的節奏,之後就能夠正常輸出文章啦。 攻擊力+300.jpg

廣告

我是九心,新晉互聯網碼農,若是想要進階和了解更多的乾貨,歡迎關注個人公衆號接收到的個人最新文章。 公衆號

引用文章:

《🛠Git 經常使用操做總結》
《關於Android Studio使用Git的總結》
《廖雪峯的Git教程》

相關文章
相關標籤/搜索