1. 程式人生 > >Git workflow

Git workflow

writing git pull 有時 rain sso rip 手動 reat opera

Git workflow

大神鎮樓:

技術分享

這人不用說。應該都認識,他基本幹了兩件事,一個是Linux。一個就是git。每一件事,都在IT史上創建了一個巨大的Tag。

Git是什麽

Git能幹什麽?

Git用來做版本號控制,這就好比當初在小日本的公司,每次改動文件,都須要在文件第一頁新增改動履歷。具體記錄改動內容,假設多人同一時候操作。你能夠想象下維護的成本有多高。基本每天就在整理這些破事。

所以說,版本號控制是項目開發的重中之重。那麽問題來了。版本號控制哪家強?一句話。Git是眼下世界上最先進的分布式版本號控制系統(沒有之中的一個)。事實上也能夠把分布式三個字去掉。

集中式版本號控制

集中式的版本號控制工具以SVN為代表,他有一個中央server。控制著全部的版本號管理。其它全部的終端。能夠對這個中央庫進行操作。中央庫保證版本號的唯一性。

技術分享

這樣有一個很不好的地方,就是假設中央server被天災軍團攻陷了,那麽整個版本號就gg了。由於終端僅僅能對一部分代碼進行改動,獲取各種信息,須要不斷與中央server通信。

  1. 容災性差
  2. 通信頻繁

分布式版本號控制

分布式版本號控制的典型,就是Git。它跟集中式的最大差別就是它的終端能夠獲取到中央server的完整信息,就好像做了一個完整的鏡像。這樣,我能夠在終端做各種操作、獲取各種信息而不須要與server通信,同一時候,就算server被炸,各個終端還有完整的備份。

分布式的思路,在版本號控制上,具有得天獨厚的優勢,當然。這僅僅是git優勢的冰山一角。

Git安裝與配置

安裝

Git的安裝就不解釋了,相信程序員都有能力獨立解決這樣一個問題,Linux和Mac下基本都已經自帶Git了,window,建議不要用Git了。命令行實在是受不了。

配置

在終端輸入:

?  ~  git --version
git version 1.8.4

來查看當前Git的版本號,同一時候,輸入:

?  ~  git config --list --global
user.name=xuyisheng
user.email[email protected]
/* */.com push.default=current

或者:

?  ~  git config user.name
xuyisheng

用來查看當前的配置信息。假設是新安裝的,那麽須要對global信息進行配置。配置的方法有兩種,一個個變量配置,或者一起配置:

單獨配置:

?  ~  git config --global user.name xys

一起配置:

?  ~  git config --global --add user.name xys

添加多個鍵值對

刪除配置

?  ~  git config --global --unset user.name xys

配置別名

這個功能在shell中是很經常使用的。我們能夠做一些別名來代替比較復雜的指令。
比方:

git config --global alias.st status

我們使用st來代替status。

附上一個比較吊的:

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"

PS:用git log –graph命令能夠看到分支合並圖。

配置文件

git的配置文件事實上我們是能夠找到的,就在.git文件夾下:

?  testGit git:(master) ls -a
.          ..         .git       README.txt
?  testGit git:(master) cd .git
?  .git git:(master) ls
HEAD        description index       logs        packed-refs
config      hooks       info        objects     refs
?  .git git:(master)

我們打開config文件:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = false
[remote "origin"]
    url = git@github.com:xuyisheng/testGit.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "dev"]
    remote = origin
    merge = refs/heads/dev

這裏就是我們全部的配置了。

創建Git倉庫

版本號控制就是為了管理代碼,代碼就要放在倉庫中。創建倉庫有二種方法:

Git init

?  MyWork  mkdir gitTest
?  MyWork  cd gitTest
?  gitTest  git init
Initialized empty Git repository in /Users/hj/Downloads/MyWork/gitTest/.git/
?  gitTest git:(master)

創建一個文件夾,並cd到文件夾下,通過調用git init來將現有文件夾初始化為git倉庫,或者直接在git init後面跟上文件夾名。相同也能夠創建一個新的倉庫。

git clone

git clone用於clone一個遠程倉庫到本地。這個我們後面再將。

創建好倉庫後。文件夾下會生成一個.git的隱藏文件夾,這裏就是全部的版本號記錄。默認不要對這個文件夾進行改動。

提交改動

add && commit

在倉庫中,我們創建代碼,並將其提交:

?  gitTest git:(master) touch README.txt
?  gitTest git:(master) ? open README.txt
?  gitTest git:(master) ? git add README.txt
?  gitTest git:(master) ? git commit -m "add readme"
[master (root-commit) c19081b] add readme
 1 file changed, 1 insertion(+)
 create mode 100644 README.txt

我們創建了一個README文件,並通過git add <文件名稱>的方式進行add操作,最後通過git commit操作進行提交,-m參數,指定了提交的說明。

這兩個命令應該是最常使用的git命令。

查看改動

在版本號控制中,很核心的一點,就是須要指定,我們做了哪些改動,比方之前我們創建了一個README文件,並在裏面寫了一句話:
this is readme。

以下我們改動這個文件:
this is readme。modify。

接下來,我們使用git status命令來查看當前git倉庫哪些內容被改動了:

?  gitTest git:(master) git status
# On branch master
# 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:   README.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

我們能夠發現,git提示我們:
modified: README.txt,更進一步。我們能夠使用git diff命令來查看具體的改動:

diff --git a/README.txt b/README.txt
index 2744f40..f312f1a 100644
--- a/README.txt
+++ b/README.txt
@@ -1 +1 @@
-this is readme
\ No newline at end of file
+this is readme, modify
\ No newline at end of file
(END)

這樣就查看了具體的改動。

以下我們繼續add、commit:

?  gitTest git:(master) ? git add README.txt
?  gitTest git:(master) ? git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README.txt
#
?  gitTest git:(master) ? git commit -m "modify readme"
[master 1629cdc] modify readme
 1 file changed, 1 insertion(+), 1 deletion(-)
?  gitTest git:(master) git status
# On branch master
nothing to commit, working directory clean

add和commit之後,我們都使用status來查看下狀態。能夠發現。在commit之後,git提示我們,工作區是幹凈的。

版本號記錄

在項目中,一個倉庫通常可能有許多次的add、commit過程,這些記錄都會被記錄下來,我們能夠使用git log來查看這些記錄:

commit 1629cdcf2307bf26c0c5467e10035c2bd751e9d0
Author: xuyisheng <[email protected].com>
Date:   Sun Jun 28 14:45:14 2015 +0800

    modify readme

commit c19081b6a48bcd6fb243560dafc7a35ae5e74765
Author: xuyisheng <[email protected].com>
Date:   Sun Jun 28 14:35:00 2015 +0800

    add readme
(END)

每條記錄都相應一個commit id,這是一個40個16進制的sha-1 hash code。

用來唯一標識一個commit。

同一時候,我們也能夠使用gitk命令來查看圖形化的log記錄:

技術分享

git會自己主動將commit串成一個時間線。

每一個點,就代表一個commit。點擊這些點。就能夠看見相應的改動信息。

工作區與暫存區

Git一般是工作在三個區域上:

  1. 工作區
  2. 暫存區
  3. 歷史區

當中工作區就是我們平時工作、改動代碼的區域,而歷史區,用來保存各個版本號,而暫存區。則是Git的核心所在。

暫存區保存在我們前面講的那個.git的隱藏文件夾中,是一個叫index的文件。

技術分享

當我們向Git倉庫提交代碼的時候。add操作實際上是將改動記錄到暫存區,我們來看gitk:

技術分享

能夠發現,我們在本地已經生成了一個記錄,可是還沒有commit,所以當前HEAD並沒有指向我們的改動。改動還保存在暫存區。

當我們commit之後,再看gitk:

技術分享

這時候,HEAD就已經移到了我們的改動上。也就是說,我們的提交生成了一個新的commit。git commit操作就是將暫存區的內容全部提交。

假設內容不add到暫存區,那麽commit就不會提交改動內容。

PS 這裏須要說明一個概念,git管理的是改動,而不是文件。每一個sha-1的值,也是依據內容計算出來的。

版本號回退

假設這個世界一直僅僅須要git add、commit。就不會有這麽多的問題了。可是。願望是美好的,現實是殘酷的。怎樣處理版本號的回退和改動,是使用git很重要的一步。

checkout && reset

我們來考慮幾種情況:

  1. 文件已經改動,可是還沒有git add
  2. 文件已經add到暫存區,又作了改動
  3. 文件的改動已經add到了暫存區

分別運行以下操作:

?  gitTest git:(master) ? git checkout -- README.txt
  1. 改動被刪除。全然還原到上次commit的狀態,也就是server版本號
  2. 最後的改動被刪除。還原到上次add的狀態,也就是改動前的暫存區狀態

總的來說。就是還原到上次add、commit的狀態。

而對於第三種情況,我們能夠使用git reset:

?  gitTest git:(master) ? git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README.txt
#
?  gitTest git:(master) ? git reset HEAD README.txt
Unstaged changes after reset:
M   README.txt
?  gitTest git:(master) ? git status
# On branch master
# 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:   README.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

通過git reset HEAD README.txt,我們就把暫存區的文件清除了。這樣,在本地就是add前的狀態。通過checkout操作,就能夠進行改動回退了。

PS : git checkout事實上是用版本號庫裏的版本號替換工作區的版本號,不管工作區是改動還是刪除

回退版本號

當我們的倉庫有了大量的提交的時候,我們能夠通過git log來查看(能夠指定 –pretty=oneline 來優化顯示效果)。

e7ae095cafc8ddc5fda5a5d8b23d0bcaaf74ac39 modify again
5427c66703abfeaba3706f938317251ef2567e8b delete test.txt
08098a21a918cfbd6377fc7a03a08cac0e6bcef6 add new file
b687b06fbb66da68bf8e0616c8049f194f03a062 e
8038c502e6f5cbf34c8096eb27feec682b75410b update
34ad1c36b97f090fdf3191f51e149b404c86e72f modify again
1629cdcf2307bf26c0c5467e10035c2bd751e9d0 modify readme
c19081b6a48bcd6fb243560dafc7a35ae5e74765 add readme

那麽我們假設回退到指定版本號呢?在Git中,用HEAD表示當前版本號,上一個版本號就是HEAD^。上上一個版本號就是HEAD^^,當然往上100個版本號就不要這樣寫了,寫成HEAD~100就可以。

以下我們就能夠回退了:

?  testGit git:(master) git reset --hard HEAD^
HEAD is now at 5427c66 delete test.txt

要回退到哪個版本號。僅僅要HEAD寫對就OK了。你能夠寫commit id,也能夠HEAD^,也能夠HEAD^^。

前進版本號

有時候。假設我們回退到了舊的版本號,可是卻懊悔了。想回到後面某個新的版本號。但這個時候,我的commit id已經忘了,怎麽辦呢?
沒事,通過這個指令:

5427c66 HEAD@{0}: reset: moving to HEAD^
e7ae095 HEAD@{1}: checkout: moving from dev to master
7986a59 HEAD@{2}: checkout: moving from master to dev
e7ae095 HEAD@{3}: checkout: moving from dev to master
7986a59 HEAD@{4}: checkout: moving from 7986a59bd8683acb560e56ff222324cd49edb5e5 to dev
7986a59 HEAD@{5}: checkout: moving from master to origin/dev
e7ae095 HEAD@{6}: clone: from [email protected]:xuyisheng/testGit.git

這樣我們就能夠找到commit id用來還原了。

git reflog記錄的就是你的操作歷史。

文件操作

git rm

假設我們要刪除git倉庫中的文件,我們要怎麽做呢?

我們創建一個新的文件並提交,再刪除這個文件:

?  gitTest git:(master) rm test.txt
?  gitTest git:(master) ? git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

git提示我們delete一個文件。這時候你能夠選擇:

?  gitTest git:(master) ? git checkout test.txt

這樣就撤銷了刪除操作。或者使用:

?  gitTest git:(master) ? git rm test.txt
rm ‘test.txt‘
?  gitTest git:(master) ? git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    test.txt
#
?  gitTest git:(master) ? git commit -m "delete test.txt"
[master 5427c66] delete test.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 test.txt

通過git rm指令,刪除文件,最後提交改動。就真實的刪除了文件。

文件暫存

這裏的暫存不是前面說的暫存區。而是僅僅一次備份與恢復操作。舉個樣例,當前我們在dev分支上進行一個新功能的開發,可是開發到一半,測試提了一個issue,這時候。我們須要創建一個issue分支來改動這個bug。可是,當前dev分支是不幹凈的。新功能開發到一半,直接從dev上拉分支,代碼是不完好的,可能會編譯只是。
so,你能夠使用:

git stash

指令來將當前改動暫存,這樣就能夠切換到其它分支或者就在當前幹凈的分支上checkout了。
比方你checkout了一個issue分支,改動了bug。使用git merge合並到了master分支,刪除issue分支,切換到dev分支。想繼續之前的新功能開發。
這時候。就須要恢復現場了:

首先。通過:

git stash list

我們能夠查看當前暫存的內容記錄。

然後,通過git stash apply或者git stash pop來進行恢復,它們的差別是,前者不會刪除記錄(當然你能夠使用git stash drop來刪除)。而後者會。

遠程倉庫

既然git是分布式的倉庫管理,那麽我們肯定是須要多臺server進行各種操作的,一般在開發中。我們會用一臺電腦做中央server。各個終端從中央server拉代替碼。提交改動。

那麽我們怎樣去搭建一個git遠程server呢,答案是不要搭建。個人開發人員能夠通過github來獲取免費的遠程gitserver,或者是國內的開源中國之類的,相同也提供免費的gitserver,而對於企業用戶,能夠通過gitlab來獲取git遠程server。

身份認證

當本地git倉庫與git遠程倉庫通信的時候。須要進行SSH身份認證。

打開根文件夾下的.ssh文件夾:

?  ~  cd .ssh
?  .ssh  ll
total 40
-rw-------  1 xys  staff   1.7K  5 15 23:53 github_rsa
-rw-r--r--  1 xys  staff   402B  5 15 23:53 github_rsa.pub
-rw-------  1 xys  staff   1.6K  5 15 09:38 id_rsa
-rw-r--r--  1 xys  staff   409B  5 15 09:42 id_rsa.pub
-rw-r--r--  1 xys  staff   2.0K  6  3 13:34 known_hosts

假設沒有id_rsa和id_rsa.pub這兩個文件。就通過例如以下的命令生成:

ssh-keygen -t rsa -C "[email protected]"

id_rsa和id_rsa.pub這兩個文件,就是SSH Key的秘鑰對,id_rsa是私鑰。不能泄露出去。id_rsa.pub是公鑰,用在github上表明身份。

在github的ssh key中添加剛剛生成的key:

技術分享

同步協作

如今你在本地建立了git倉庫。想與遠程git倉庫同步。這樣github的遠程倉庫能夠作為你本地的備份,也能夠讓其它人進行協同工作。

我們先在github上創建一個repo(倉庫):

技術分享

創建之後,github給我們提示:

技術分享

github告訴了我們怎樣在本地創建一個新的repo或者將既存的repo提交到遠程git。

由於我們已經有了本地的git。所以,安裝提示:

?  gitTest git:(master) git remote add origin [email protected]:xuyisheng/testGit.git
?  gitTest git:(master) git push -u origin master
Counting objects: 18, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (18/18), 1.39 KiB | 0 bytes/s, done.
Total 18 (delta 1), reused 0 (delta 0)
To [email protected]:xuyisheng/testGit.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

如今我們再看github上的倉庫:

技術分享

README已經提交上去了。

git remote add origin [email protected]:xuyisheng/testGit.git這條指令中的origin,就是遠程倉庫的名字,你也能夠叫別的,可是默認遠程倉庫都叫做origin,便於區分。

PS: 這裏還須要註意下的是git push的-u參數,加上了-u參數。Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來。只是後面的push就不須要這個參數了。

之後我們再做改動:

?  gitTest git:(master) ? git add README.txt
?  gitTest git:(master) ? git commit -m "modify again"
[master e7ae095] modify again
 1 file changed, 2 insertions(+), 1 deletion(-)
?  gitTest git:(master) git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 285 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected].com:xuyisheng/testGit.git
   5427c66..e7ae095  master -> master

能夠直接使用git push或者git push origin master來指定倉庫和分支名。

clone遠程倉庫

記得我們之前說的,創建本地倉庫的幾種方式,當中有一種是clone:

我們能夠通過git clone指令來clone一個遠程倉庫:

技術分享

以下就顯示了遠程倉庫的地址,一般我們使用SSH的方式,當然。也能夠使用其它方式,然並卵。

PS: 使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,可是在某些僅僅開放httpport的公司內部就無法使用ssh協議而僅僅能用https。

直接使用:

?  MyWork  git clone [email protected]:xuyisheng/testGit.git
Cloning into ‘testGit‘...
remote: Counting objects: 21, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 21 (delta 1), reused 21 (delta 1), pack-reused 0
Receiving objects: 100% (21/21), done.
Resolving deltas: 100% (1/1), done.
Checking connectivity... done

分支管理

個人覺得,創建分支是git最大的魅力。
git中的分支就好像如今的平行宇宙,不同的分支互不幹擾,相互獨立,你就像一個上帝一樣,能夠隨時對隨意一個分支進行操作,能夠今天去這個branch玩。明天去還有一個branch,玩膩了,再把兩個分支合並,一起玩。

舉個比較恰當的樣例,我如今要開發一個新功能。須要3個月的時間,可是我不能每天都把未完成的代碼提交到大家都在用的分支上,這樣人家拉取了我的代碼就無法正常工作了。可是我又不能新建一個倉庫,這也太浪費了,所以我能夠新建一個分支,在這個分支上開發我的功能,同一時候能夠備份我的代碼。當開發完成後,直接合並分支。整個新功能就一下子添加了大家的分支。

創建分支

你的每次提交。Git都把它們串成一條時間線,這條時間線就是一個分支。不創建分支時。僅僅有一條時間線。在Git裏。這個分支叫主分支。即master分支。HEAD嚴格來說不是指向提交。而是指向master,master才是指向提交的。所以,HEAD指向的就是當前分支。

技術分享

這裏的時間線就看的很清楚了。

我們通過例如以下指令來創建分支:

?  gitTest git:(master) git checkout -b dev
Switched to a new branch ‘dev‘
?  gitTest git:(dev)

-b參數代表創建並切換到該分支,相當於:

$ git branch dev
$ git checkout dev
Switched to branch ‘dev‘

不加-b參數就是直接切換到已知分支了。

查看分支

通過git branch指令能夠列出當前全部分支:

?  gitTest git:(dev) git branch
* dev
  master

當前分支上會多一個*

合並分支

切換到dev分支後。我們進行改動。add並commit:

此時我們再切換到master分支,再查看當前改動,你會發現。dev分支上做的改動這裏都沒有生效。

必須的,不然平行宇宙就不平行了。

我們通過例如以下指令來進行分支的合並:

?  gitTest git:(master) git merge dev
Updating e7ae095..7986a59
Fast-forward
 README.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

這樣再查看master分支下的文件,dev上的改動就有了。

刪除分支

使用完成後,我們不再須要這個分支了,所以,放心的刪除吧:

?  gitTest git:(master) git branch -d dev
Deleted branch dev (was 7986a59).
?  gitTest git:(master) git branch
* master

PS : 當分支還沒有被合並的時候,假設刪除分支,git會提示:
error: The branch ‘feature-vulcan’ is not fully merged.
If you are sure you want to delete it, run ‘git branch -D dev.
也就是提示我們使用-D參數來進行強行刪除。

看完分支的操作。有人可能會問。創建這麽多分支,git會不會很累,當然不會,git並非創建整個文件的備份到各個分支。而是創建一個指針指向不同的分支而已。切換分支,創建分支,都僅僅是改變指針指向的位置。

分支是很好的團體協作方式,一個項目中一般會有一個master分支來進行公布管理。一個dev分支來進行開發,而不同的開發人員checkout出dev分支來進行開發。merge自己的分支到dev,當有issue或者新需求的時候,checkout分支進行改動,能夠保證主分支的安全,即使改動取消。也不會影響主分支。

查看遠程分支

當你從遠程倉庫克隆時,實際上Git自己主動把本地的master分支和遠程的master分支相應起來了,而且,遠程倉庫的默認名稱是origin。


通過例如以下指令,我們能夠查看遠程分支:

?  gitTest git:(master) git remote
origin

或者:

?  gitTest git:(master) git remote -v
origin  [email protected].com:xuyisheng/testGit.git (fetch)
origin  [email protected].com:xuyisheng/testGit.git (push)

來顯示更具體的信息。

推送分支

要把本地創建的分支同步到遠程倉庫上,我們能夠使用:

?  gitTest git:(master) git checkout -b dev
Switched to a new branch ‘dev‘
?  gitTest git:(dev) git push origin dev
Everything up-to-date

這樣就把一個dev分支推送到了遠程倉庫origin中。

抓取遠程分支

當我們將遠程倉庫clone到本地後即使遠程倉庫有多個分支,但實際上,本地僅僅有一個分支——master。

?  MyWork  git clone [email protected]:xuyisheng/testGit.git
Cloning into ‘testGit‘...
remote: Counting objects: 24, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 24 (delta 2), reused 23 (delta 1), pack-reused 0
Receiving objects: 100% (24/24), done.
Resolving deltas: 100% (2/2), done.
Checking connectivity... done
?  MyWork  cd testGit
?  testGit git:(master) git branch
* master

如今。我要在dev分支上開發。就必須創建遠程origin的dev分支到本地,用這個命令創建本地dev分支:

?  testGit git:(master) git checkout -b dev origin/dev
Branch dev set up to track remote branch dev from origin.
Switched to a new branch ‘dev‘
?  testGit git:(dev)

這樣就把本地創建的dev分支與遠程的dev分支關聯了。


後面你能夠使用git push origin dev繼續提交代碼到遠程的dev分支。

這樣的情況下,假設其它人也提交了到dev分支,那麽你的提交就會與他的提交沖突。因此,你須要使用git pull先將遠程改動拉取下來。git會自己主動幫你在本地進行merge,假設沒有沖突,這時候再提交,就OK了,假設有沖突,那麽必須手動解除沖突再提交。

Tag

Tag的概念很相似於branch。可是branch是能夠不斷改變、merge的。Tag不行,Tag能夠覺得是一個快照。用於記錄某個commit點的歷史快照。

創建標簽

很easy:

?  testGit git:(master) git tag version1

默認Tag會打在最後的提交上。可是你也能夠通過commit id來指定要打的地方。

?  testGit git:(master) git tag version0 b687b06fbb66da68bf8e0616c8049f194f03a062
?  testGit git:(master) git tag
version0
version1

PS : 實際上commit id不須要寫很長,通過前6、7位,git就能夠查找到相應的id了。

還能夠創建帶有說明的標簽,用-a指定標簽名,-m指定說明文字:

git tag -a v1 -m "version1" b687b06fbb66da68bf8e0616c8049f194f03a062

通過例如以下指令來查看具體信息:

git show <tagname>

查看標簽

?  testGit git:(master) git tag
version1

刪除標簽

-d參數就能夠了,與branch相似。

?  testGit git:(master) git tag
version0
version1
?  testGit git:(master) git tag -d version0
Deleted tag ‘version0‘ (was b687b06)
?  testGit git:(master) git tag
version1

推送到遠程

將本地tag推送到遠程參考上:

?  testGit git:(master) git push origin version0
Total 0 (delta 0), reused 0 (delta 0)
To [email protected].com:xuyisheng/testGit.git
 * [new tag]         version0 -> version0

或者:

?  testGit git:(master) git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To [email protected].com:xuyisheng/testGit.git
 * [new tag]         version1 -> version1

來push全部的tag。

刪除遠程Tag

當Tag已經push到遠程倉庫後,我們要刪除這個Tag。首先須要先刪除本地Tag:

?  testGit git:(master) git tag -d version0
Deleted tag ‘version0‘ (was b687b06)

再push到遠程,帶指令有所不同:

?  testGit git:(master) git push origin :refs/tags/version0
To git@github.com:xuyisheng/testGit.git
 - [deleted]         version0

以上。

學完這些,對付主要的Git使用。就沒什麽問題了。後面會再出一篇Git workflow plus。介紹一下Git的高級 操作。

Git workflow