天天看點

git代碼倉庫管理

一、簡介

1.概述

Git 是一個開源的分布式版本控制系統,用于靈活高效地處理任何或小或大的項目。

Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放源碼的版本控制軟體。

Git 與常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本庫的方式,不必伺服器端軟體支援。

git代碼倉庫管理

image

2.工作流程

一般工作流程如下:

  1. 克隆 Git 資源作為工作目錄。
  2. 在克隆的資源上添加或修改檔案。
  3. 如果其他人修改了,你可以更新資源。
  4. 在送出前檢視修改。
  5. 送出修改。
  6. 在修改完成後,如果發現錯誤,可以撤回送出并再次修改并送出。
    git代碼倉庫管理
    image

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種方式有如下差別:

  1. https方式:不管是誰,隻要拿到該項目的 url 可以随便 clone,但是在 push 到遠端的時候需要驗證使用者名和密碼;
  2. ssh方式:需要現将你電腦的SSH key(SSH公鑰)添加到GitHub(或者其他代碼托管網站)上,這樣在 clone 項目和 push 項目到遠端時都不需要輸入使用者名和密碼。

2.工作區、暫存區和版本庫

工作區(Working Directory):就是你在電腦裡能看到的目錄

版本庫(Repository):工作區有一個隐藏目錄.git,這個不算工作區,而是Git的版本庫。

Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master

,以及指向master的一個指針叫HEAD。

git代碼倉庫管理

image

3.送出修改

git status 檢視目前狀态

可以在任何時候使用該指令檢視目前的狀态。一般會顯示目前所處的分支,以及目前工作區是否幹淨,是否有檔案要送出。

當你克隆遠端倉庫到本地後,通過該指令檢視目前狀态時,顯示資訊如下圖所示:

git代碼倉庫管理

image

當你修改了一個檔案後,再用該指令檢視目前狀态,顯示資訊如下圖所示:

git代碼倉庫管理

image

git diff: 顯示變更内容

當你對檔案進行了修改,想檢視進行了哪些修改時,可以通過該指令檢視。

git diff指令會顯示修改的檔案中哪些内容進行了修改,包括新增了哪些内容,删除了哪些内容。

git diff README.md      //後面接檔案名,表示隻顯示該檔案的變更      

例如:我對 README.md 檔案進行了修改,删除了1行,新增了2行,然後用該指令檢視進行了哪些修改,如下圖所示: (“+” 表示新增的内容,“-” 表示删除的内容)

git代碼倉庫管理

image

git add: 添加到暫存區

無論你新增了一個檔案或者對已有的檔案進行了修改,都需要将其添加到暫存區,然後送出到版本庫。

git add hello.txt      //後面接檔案名,表示将某個檔案添加到暫存區   
git add .                 //後面接一個點,表示将全部檔案添加到暫存區      

如果是删除的檔案,用git add -A 檔案名,或者git rm 檔案名 添加到暫存區

git代碼倉庫管理

image

git commit: 送出到版本庫

該指令是将添加到暫存區的變更送出到版本庫:

git commit -m "變更的說明資訊"      
git代碼倉庫管理

image

4.撤銷修改與版本回退

撤銷檔案的修改包括以下兩個場景:

從工作區撤銷某個檔案修改(修改當然也包括删除):

git checkout -- filename //filename替換為你想撤回的檔案名      

從暫存區撤銷某個檔案修改:

git reset HEAD filename  //filename替換為你想撤回的檔案名      

回退版本

git log: 檢視曆史送出

如果發現送出了一個錯誤版本,想回退到上個版本時,就可以通過該指令來檢視所有的曆史版本,以選擇回退到曆史的哪個版本。

git log                  //檢視曆史版本
git log --graph     //以圖形的方式檢視曆史      

執行後,如下圖所示:

git代碼倉庫管理

image

git reset: 回退版本

常用于回退版本或者在各個版本間進行跳躍切換。 我們可以先用 git log 看一下目前曆史版本,如下圖所示:

git代碼倉庫管理

image

如果要回退兩個版本,則隻需要輸入:​

​git reset HEAD~2​

​或者​

​git reset --hard a8336834b50daafa0793370​

5.拉取與送出

  1. git pull: 拉取遠端分支到本地并合并

    一般是本地分支的進度落後于遠端分支時,需要使用該指令。

    指令:​

    ​git pull origin master​

    origin 表示遠端代碼庫的一個别名(也可以修改為其他名字,可通過 git remote 修改),master 表示需要拉取合并的分支名稱。

    指令:​

    ​git pull --rebase origin master​

    ​用 rebase 的方式進行,不會産生 merge 保持分支幹淨、整潔
  2. 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.分支總覽

git代碼倉庫管理

image

git代碼倉庫管理

image

git代碼倉庫管理

image

git代碼倉庫管理

image

2.建立、删除與合并分支

​git branch​

​​用于顯示本地所有分支以及目前所在哪個分支。圖中顯示本地有 master 和 dev 兩個分支,并且正處在 master 分支上。​

​git branch -vv​

​還能看到遠端分支與關聯情況:

git代碼倉庫管理

image

​git branch branchName​

​用于建立名為 branchName 的新分支。後接origin/dev,辨別建立分支并關聯dev分支:

git代碼倉庫管理

image

​git branch -D branchName​

​用于删除名為 branchName 的分支:

git代碼倉庫管理

image

​git checkout branchName​

​用于從目前分支切換到名為 branchName的分支上:

git代碼倉庫管理

image

​git checkout -b branchName​

​用于建立名為 branchName的分支并切換到該分支上。後面同樣可以接origin/dev這樣的參數,表示并關聯遠端的dev分支:

git代碼倉庫管理

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分支上合并就可以了。

是以,團隊合作的分支看起來就像這樣:

git代碼倉庫管理

image

4.臨時儲存工作現場

修複bug時,我們會通過建立新的bug分支進行修複,然後合并,最後删除;

當手頭工作沒有完成時,先把工作現場git stash一下,然後去修複bug,修複後,再git stash pop,回到工作現場;

5.從某個分支的送出複制粘貼到另一個分支

​git cherry-pick <commit>​

也可以用AndroidStudio工具,進行cherry-pick,這裡就不詳細展開了

6.AndroidStudio檢視git操作

這裡主要介紹常用的git diff圖形化界面: