Git workflow
Git workflow
大神鎮(zhèn)樓:
這人不用說,應(yīng)該都認識,他基本干了兩件事,一個是Linux,一個就是git。每一件事,都在IT史上創(chuàng)建了一個巨大的Tag。
Git是什么
Git能干什么?
Git用來做版本控制,這就好比當初在小日本的公司,每次修改文件,都需要在文件第一頁新增修改履歷,詳細記錄修改內(nèi)容,如果多人同時操作,你可以想象下維護的成本有多高。基本每天就在整理這些破事。
所以說,版本控制是項目開發(fā)的重中之重。那么問題來了,版本控制哪家強?一句話,Git是目前世界上最先進的分布式版本控制系統(tǒng)(沒有之一)。其實也可以把分布式三個字去掉。
集中式版本控制
集中式的版本控制工具以SVN為代表,他有一個中央服務(wù)器,控制著所有的版本管理,其它所有的終端,可以對這個中央庫進行操作,中央庫保證版本的唯一性。
這樣有一個非常不好的地方,就是如果中央服務(wù)器被天災(zāi)軍團攻陷了,那么整個版本就gg了。因為終端只能對一部分代碼進行修改,獲取各種信息,需要不斷與中央服務(wù)器通信。
分布式版本控制
分布式版本控制的典型,就是Git,它跟集中式的最大區(qū)別就是它的終端可以獲取到中央服務(wù)器的完整信息,就好像做了一個完整的鏡像,這樣,我可以在終端做各種操作、獲取各種信息而不需要與服務(wù)器通信,同時,就算服務(wù)器被炸,各個終端還有完整的備份。分布式的思路,在版本控制上,具有得天獨厚的優(yōu)勢,當然,這只是git優(yōu)勢的冰山一角。
Git安裝與配置
安裝
Git的安裝就不解釋了,相信程序猿都有能力獨立解決這樣一個問題,Linux和Mac下基本都已經(jīng)自帶Git了,window,建議不要用Git了,命令行實在是受不了。
配置
在終端輸入:
~ git --version git version 1.8.4來查看當前Git的版本,同時,輸入:
~ git config --list --global user.name=xuyisheng user.email=xuyisheng@hujiang.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中是很常用的。我們可以做一些別名來取代比較復雜的指令。
比如:
我們使用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.txttestGit 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 = 0filemode = truebare = falselogallrefupdates = trueignorecase = trueprecomposeunicode = false [remote "origin"]url = git@github.com:xuyisheng/testGit.gitfetch = +refs/heads/*:refs/remotes/origin/* [branch "master"]remote = originmerge = refs/heads/master [branch "dev"]remote = originmerge = refs/heads/dev這里就是我們所有的配置了。
創(chuàng)建Git倉庫
版本控制就是為了管理代碼,代碼就要放在倉庫中。創(chuàng)建倉庫有二種方法:
Git init
MyWork mkdir gitTestMyWork cd gitTestgitTest git init Initialized empty Git repository in /Users/hj/Downloads/MyWork/gitTest/.git/gitTest git:(master)創(chuàng)建一個目錄,并cd到目錄下,通過調(diào)用git init來將現(xiàn)有目錄初始化為git倉庫,或者直接在git init后面跟上目錄名,同樣也可以創(chuàng)建一個新的倉庫。
git clone
git clone用于clone一個遠程倉庫到本地,這個我們后面再將。
創(chuàng)建好倉庫后,目錄下會生成一個.git的隱藏文件夾,這里就是所有的版本記錄,默認不要對這個文件夾進行修改。
提交修改
add && commit
在倉庫中,我們創(chuàng)建代碼,并將其提交:
gitTest git:(master) touch README.txtgitTest git:(master) open README.txtgitTest git:(master) git add README.txtgitTest git:(master) git commit -m "add readme" [master (root-commit) c19081b] add readme1 file changed, 1 insertion(+)create mode 100644 README.txt我們創(chuàng)建了一個README文件,并通過git add <文件名>的方式進行add操作,最后通過git commit操作進行提交,-m參數(shù),指定了提交的說明。
這兩個命令應(yīng)該是最常使用的git命令。
查看修改
在版本控制中,非常核心的一點,就是需要指定,我們做了哪些修改,比如之前我們創(chuàng)建了一個README文件,并在里面寫了一句話:
this is readme。
下面我們修改這個文件:
this is readme,modify。
接下來,我們使用git status命令來查看當前git倉庫哪些內(nèi)容被修改了:
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")我們可以發(fā)現(xiàn),git提示我們:
modified: README.txt,更進一步,我們可以使用git diff命令來查看具體的修改:
這樣就查看了具體的修改。
下面我們繼續(xù)add、commit:
gitTest git:(master) git add README.txtgitTest 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 readme1 file changed, 1 insertion(+), 1 deletion(-)gitTest git:(master) git status # On branch master nothing to commit, working directory cleanadd和commit之后,我們都使用status來查看下狀態(tài),可以發(fā)現(xiàn),在commit之后,git提示我們,工作區(qū)是干凈的。
版本記錄
在項目中,一個倉庫通常可能有非常多次的add、commit過程,這些記錄都會被記錄下來,我們可以使用git log來查看這些記錄:
commit 1629cdcf2307bf26c0c5467e10035c2bd751e9d0 Author: xuyisheng <xuyisheng@hujiang.com> Date: Sun Jun 28 14:45:14 2015 +0800modify readmecommit c19081b6a48bcd6fb243560dafc7a35ae5e74765 Author: xuyisheng <xuyisheng@hujiang.com> Date: Sun Jun 28 14:35:00 2015 +0800add readme (END)每條記錄都對應(yīng)一個commit id,這是一個40個16進制的sha-1 hash code。用來唯一標識一個commit。
同時,我們也可以使用gitk命令來查看圖形化的log記錄:
git會自動將commit串成一個時間線。每個點,就代表一個commit。點擊這些點,就可以看見相應(yīng)的修改信息。
工作區(qū)與暫存區(qū)
Git通常是工作在三個區(qū)域上:
其中工作區(qū)就是我們平時工作、修改代碼的區(qū)域,而歷史區(qū),用來保存各個版本,而暫存區(qū),則是Git的核心所在。
暫存區(qū)保存在我們前面講的那個.git的隱藏文件夾中,是一個叫index的文件。
當我們向Git倉庫提交代碼的時候。add操作實際上是將修改記錄到暫存區(qū),我們來看gitk:
可以發(fā)現(xiàn),我們在本地已經(jīng)生成了一個記錄,但是還沒有commit,所以當前HEAD并沒有指向我們的修改,修改還保存在暫存區(qū)。
當我們commit之后,再看gitk:
這時候,HEAD就已經(jīng)移到了我們的修改上,也就是說,我們的提交生成了一個新的commit。git commit操作就是將暫存區(qū)的內(nèi)容全部提交。如果內(nèi)容不add到暫存區(qū),那么commit就不會提交修改內(nèi)容。
PS 這里需要說明一個概念,git管理的是修改,而不是文件,每個sha-1的值,也是根據(jù)內(nèi)容計算出來的。
版本回退
如果這個世界一直只需要git add、commit,就不會有這么多的問題了,但是,愿望是美好的,現(xiàn)實是殘酷的。如何處理版本的回退和修改,是使用git非常重要的一步。
checkout && reset
我們來考慮幾種情況:
分別執(zhí)行以下操作:
gitTest git:(master) git checkout -- README.txt總的來說,就是還原到上次add、commit的狀態(tài)。
而對于第三種情況,我們可以使用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.txtgitTest 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,我們就把暫存區(qū)的文件清除了,這樣,在本地就是add前的狀態(tài),通過checkout操作,就可以進行修改回退了。
PS : git checkout其實是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除
回退版本
當我們的倉庫有了大量的提交的時候,我們可以通過git log來查看(可以指定 –pretty=oneline 來優(yōu)化顯示效果)。
e7ae095cafc8ddc5fda5a5d8b23d0bcaaf74ac39 modify again 5427c66703abfeaba3706f938317251ef2567e8b delete test.txt 08098a21a918cfbd6377fc7a03a08cac0e6bcef6 add new file b687b06fbb66da68bf8e0616c8049f194f03a062 e 8038c502e6f5cbf34c8096eb27feec682b75410b update 34ad1c36b97f090fdf3191f51e149b404c86e72f modify again 1629cdcf2307bf26c0c5467e10035c2bd751e9d0 modify readme c19081b6a48bcd6fb243560dafc7a35ae5e74765 add readme那么我們?nèi)绻赝说街付ò姹灸?#xff1f;在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已經(jīng)忘了,怎么辦呢?
沒事,通過這個指令:
這樣我們就可以找到commit id用來還原了。
git reflog記錄的就是你的操作歷史。
文件操作
git rm
如果我們要刪除git倉庫中的文件,我們要怎么做呢?
我們創(chuàng)建一個新的文件并提交,再刪除這個文件:
gitTest git:(master) rm test.txtgitTest 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.txt1 file changed, 0 insertions(+), 0 deletions(-)delete mode 100644 test.txt通過git rm指令,刪除文件,最后提交修改,就真實的刪除了文件。
文件暫存
這里的暫存不是前面說的暫存區(qū),而是只一次備份與恢復操作。舉個例子,當前我們在dev分支上進行一個新功能的開發(fā),但是開發(fā)到一半,測試提了一個issue,這時候,我們需要創(chuàng)建一個issue分支來修改這個bug,但是,當前dev分支是不干凈的,新功能開發(fā)到一半,直接從dev上拉分支,代碼是不完善的,可能會編譯不過。
so,你可以使用:
指令來將當前修改暫存,這樣就可以切換到其他分支或者就在當前干凈的分支上checkout了。
比如你checkout了一個issue分支,修改了bug,使用git merge合并到了master分支,刪除issue分支,切換到dev分支,想繼續(xù)之前的新功能開發(fā)。
這時候,就需要恢復現(xiàn)場了:
首先,通過:
git stash list我們可以查看當前暫存的內(nèi)容記錄。
然后,通過git stash apply或者git stash pop來進行恢復,它們的區(qū)別是,前者不會刪除記錄(當然你可以使用git stash drop來刪除),而后者會。
遠程倉庫
既然git是分布式的倉庫管理,那么我們肯定是需要多臺服務(wù)器進行各種操作的,一般在開發(fā)中,我們會用一臺電腦做中央服務(wù)器,各個終端從中央服務(wù)器拉取代碼,提交修改。
那么我們?nèi)绾稳ゴ罱ㄒ粋€git遠程服務(wù)器呢,答案是不要搭建,個人開發(fā)者可以通過github來獲取免費的遠程git服務(wù)器,或者是國內(nèi)的開源中國之類的,同樣也提供免費的git服務(wù)器,而對于企業(yè)用戶,可以通過gitlab來獲取git遠程服務(wù)器。
身份認證
當本地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 "youremail@example.com"id_rsa和id_rsa.pub這兩個文件,就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,用在github上表明身份。
在github的ssh key中增加剛剛生成的key:
同步協(xié)作
現(xiàn)在你在本地建立了git倉庫,想與遠程git倉庫同步,這樣github的遠程倉庫可以作為你本地的備份,也可以讓其他人進行協(xié)同工作。
我們先在github上創(chuàng)建一個repo(倉庫):
創(chuàng)建之后,github給我們提示:
github告訴了我們?nèi)绾卧诒镜貏?chuàng)建一個新的repo或者將既存的repo提交到遠程git。
由于我們已經(jīng)有了本地的git,所以,安裝提示:
gitTest git:(master) git remote add origin git@github.com:xuyisheng/testGit.gitgitTest 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 git@github.com:xuyisheng/testGit.git* [new branch] master -> master Branch master set up to track remote branch master from origin.現(xiàn)在我們再看github上的倉庫:
README已經(jīng)提交上去了。
git remote add origin git@github.com:xuyisheng/testGit.git這條指令中的origin,就是遠程倉庫的名字,你也可以叫別的,但是默認遠程倉庫都叫做origin,便于區(qū)分。
PS: 這里還需要注意下的是git push的-u參數(shù),加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關(guān)聯(lián)起來。不過后面的push就不需要這個參數(shù)了。
之后我們再做修改:
gitTest git:(master) git add README.txtgitTest git:(master) git commit -m "modify again" [master e7ae095] modify again1 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 git@github.com:xuyisheng/testGit.git5427c66..e7ae095 master -> master可以直接使用git push或者git push origin master來指定倉庫和分支名。
clone遠程倉庫
記得我們之前說的,創(chuàng)建本地倉庫的幾種方式,其中有一種是clone:
我們可以通過git clone指令來clone一個遠程倉庫:
下面就顯示了遠程倉庫的地址,一般我們使用SSH的方式,當然,也可以使用其他方式,然并卵。
PS: 使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http端口的公司內(nèi)部就無法使用ssh協(xié)議而只能用https。
直接使用:
MyWork git clone git@github.com: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分支管理
個人認為,創(chuàng)建分支是git最大的魅力。
git中的分支就好像現(xiàn)在的平行宇宙,不同的分支互不干擾,相互獨立,你就像一個上帝一樣,可以隨時對任意一個分支進行操作,可以今天去這個branch玩,明天去另一個branch,玩膩了,再把兩個分支合并,一起玩。
舉個比較恰當?shù)睦?#xff0c;我現(xiàn)在要開發(fā)一個新功能,需要3個月的時間,但是我不能每天都把未完成的代碼提交到大家都在用的分支上,這樣人家拉取了我的代碼就無法正常工作了,但是我又不能新建一個倉庫,這也太浪費了,所以我可以新建一個分支,在這個分支上開發(fā)我的功能,同時能夠備份我的代碼,當開發(fā)完畢后,直接合并分支,整個新功能就一下子加入了大家的分支。
創(chuàng)建分支
你的每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。不創(chuàng)建分支時,只有一條時間線,在Git里,這個分支叫主分支,即master分支。HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。
這里的時間線就看的非常清楚了。
我們通過如下指令來創(chuàng)建分支:
gitTest git:(master) git checkout -b dev Switched to a new branch 'dev'gitTest git:(dev)-b參數(shù)代表創(chuàng)建并切換到該分支,相當于:
$ git branch dev $ git checkout dev Switched to branch 'dev'不加-b參數(shù)就是直接切換到已知分支了。
查看分支
通過git branch指令可以列出當前所有分支:
gitTest git:(dev) git branch * devmaster當前分支上會多一個*
合并分支
切換到dev分支后,我們進行修改,add并commit:
此時我們再切換到master分支,再查看當前修改,你會發(fā)現(xiàn),dev分支上做的修改這里都沒有生效。必須的,不然平行宇宙就不平行了。我們通過如下指令來進行分支的合并:
gitTest git:(master) git merge dev Updating e7ae095..7986a59 Fast-forwardREADME.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 * masterPS : 當分支還沒有被合并的時候,如果刪除分支,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參數(shù)來進行強行刪除。
看完分支的操作,有人可能會問,創(chuàng)建這么多分支,git會不會很累,當然不會,git并不是創(chuàng)建整個文件的備份到各個分支,而是創(chuàng)建一個指針指向不同的分支而已。切換分支,創(chuàng)建分支,都只是改變指針指向的位置。
分支是非常好的團體協(xié)作方式,一個項目中通常會有一個master分支來進行發(fā)布管理,一個dev分支來進行開發(fā),而不同的開發(fā)者checkout出dev分支來進行開發(fā),merge自己的分支到dev,當有issue或者新需求的時候,checkout分支進行修改,可以保證主分支的安全,即使修改取消,也不會影響主分支。
查看遠程分支
當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應(yīng)起來了,并且,遠程倉庫的默認名稱是origin。
通過如下指令,我們可以查看遠程分支:
或者:
gitTest git:(master) git remote -v origin git@github.com:xuyisheng/testGit.git (fetch) origin git@github.com:xuyisheng/testGit.git (push)來顯示更詳細的信息。
推送分支
要把本地創(chuàng)建的分支同步到遠程倉庫上,我們可以使用:
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 git@github.com: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... doneMyWork cd testGittestGit git:(master) git branch * master現(xiàn)在,我要在dev分支上開發(fā),就必須創(chuàng)建遠程origin的dev分支到本地,用這個命令創(chuàng)建本地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)這樣就把本地創(chuàng)建的dev分支與遠程的dev分支關(guān)聯(lián)了。
后面你可以使用git push origin dev繼續(xù)提交代碼到遠程的dev分支。
這種情況下,如果其他人也提交了到dev分支,那么你的提交就會與他的提交沖突,因此,你需要使用git pull先將遠程修改拉取下來,git會自動幫你在本地進行merge,如果沒有沖突,這時候再提交,就OK了,如果有沖突,那么必須手動解除沖突再提交。
Tag
Tag的概念非常類似于branch。但是branch是可以不斷改變、merge的,Tag不行,Tag可以認為是一個快照,用于記錄某個commit點的歷史快照。
創(chuàng)建標簽
非常簡單:
testGit git:(master) git tag version1默認Tag會打在最后的提交上。但是你也可以通過commit id來指定要打的地方。
testGit git:(master) git tag version0 b687b06fbb66da68bf8e0616c8049f194f03a062testGit git:(master) git tag version0 version1PS : 實際上commit id不需要寫很長,通過前6、7位,git就可以查找到相應(yīng)的id了。
還可以創(chuàng)建帶有說明的標簽,用-a指定標簽名,-m指定說明文字:
git tag -a v1 -m "version1" b687b06fbb66da68bf8e0616c8049f194f03a062通過如下指令來查看詳細信息:
git show <tagname>查看標簽
testGit git:(master) git tag version1刪除標簽
-d參數(shù)就可以了,與branch類似。
testGit git:(master) git tag version0 version1testGit 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 git@github.com:xuyisheng/testGit.git* [new tag] version0 -> version0或者:
testGit git:(master) git push origin --tags Total 0 (delta 0), reused 0 (delta 0) To git@github.com:xuyisheng/testGit.git* [new tag] version1 -> version1來push所有的tag。
刪除遠程Tag
當Tag已經(jīng)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的高級 操作。
總結(jié)
以上是生活随笔為你收集整理的Git workflow的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery 侧栏菜单点击body消失
- 下一篇: Qt编程之右键单击QTreeWidget