Git workflow
Git workflow
大神鎮樓:
這人不用說。應該都認識,他基本幹了兩件事,一個是Linux。一個就是git。每一件事,都在IT史上創建了一個巨大的Tag。
Git是什麽
Git能幹什麽?
Git用來做版本號控制,這就好比當初在小日本的公司,每次改動文件,都須要在文件第一頁新增改動履歷。具體記錄改動內容,假設多人同一時候操作。你能夠想象下維護的成本有多高。基本每天就在整理這些破事。
所以說,版本號控制是項目開發的重中之重。那麽問題來了。版本號控制哪家強?一句話。Git是眼下世界上最先進的分布式版本號控制系統(沒有之中的一個)。事實上也能夠把分布式三個字去掉。
集中式版本號控制
集中式的版本號控制工具以SVN為代表,他有一個中央server。控制著全部的版本號管理。其它全部的終端。能夠對這個中央庫進行操作。中央庫保證版本號的唯一性。
這樣有一個很不好的地方,就是假設中央server被天災軍團攻陷了,那麽整個版本號就gg了。由於終端僅僅能對一部分代碼進行改動,獲取各種信息,須要不斷與中央server通信。
- 容災性差
- 通信頻繁
分布式版本號控制
分布式版本號控制的典型,就是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]
或者:
? ~ 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一般是工作在三個區域上:
- 工作區
- 暫存區
- 歷史區
當中工作區就是我們平時工作、改動代碼的區域,而歷史區,用來保存各個版本號,而暫存區。則是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
我們來考慮幾種情況:
- 文件已經改動,可是還沒有git add
- 文件已經add到暫存區,又作了改動
- 文件的改動已經add到了暫存區
分別運行以下操作:
? gitTest git:(master) ? git checkout -- README.txt
- 改動被刪除。全然還原到上次commit的狀態,也就是server版本號
- 最後的改動被刪除。還原到上次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