中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

常用的svn和git命令

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

版本管理基本上是多人協(xié)作開(kāi)發(fā)中必不可少的工具,常用的版本管理工具有:svn和git。雖然都有可視化的工具幫助我們使用這些工具,然而當(dāng)你用上命令行之后,我想你會(huì)選擇拋棄這些可視化工具。下面是我整理的一些常用的svn和git命令。

git&svn

Svn篇

首先你可以通過(guò)svn help/h來(lái)查看幫助信息。

開(kāi)始工作

檢出(checkout)服務(wù)器數(shù)據(jù)到本地

你剛?cè)肼氁患夜荆蛐录尤肽硞(gè)團(tuán)隊(duì),立馬參與到一個(gè)項(xiàng)目中,那么就得獲取項(xiàng)目代碼,開(kāi)始你的項(xiàng)目生涯。這個(gè)時(shí)候一般你需要檢出項(xiàng)目代碼:

svn checkout/co [directory] project(本地目錄名,可選) // 檢出版本3 svn checkout/co –revision/r 3 [directory] project(本地目錄名,可選) 

接著你就可以通過(guò)svn info來(lái)查看版本信息了。

導(dǎo)入(import)項(xiàng)目

有時(shí)候項(xiàng)目尚未創(chuàng)建,你需要將本地的目錄放到SVN版本倉(cāng)庫(kù)中:

svn import project(本地目錄名) [directory] 

然后可以通過(guò)svn list/ls確認(rèn)已經(jīng)在版本倉(cāng)庫(kù)中了。

更新

每次你開(kāi)始編碼前,你都最好先更新下本地的工作目錄:

cd project svn update/up // 更新到版本3 svn update/up –revision/r 3 

這樣你就可以在新的項(xiàng)目代碼基礎(chǔ)上工作了。

修改

可能你寫(xiě)了一個(gè)新的模塊,增加了一些新的文件,需要納入項(xiàng)目的版本控制:

svn add index.html list.html ... 

可能你發(fā)現(xiàn)某個(gè)模塊已經(jīng)陳舊了,不再使用了:

svn delete/del/remove/rm hello.html 

可能你發(fā)現(xiàn)一個(gè)模塊的命名不太合理,需要改名:

svn move/mv main.css common.css 

可能你要?jiǎng)?chuàng)建一個(gè)新的較大的模塊,需要新增目錄:

svn mkdir list 

可能你發(fā)現(xiàn)要寫(xiě)的模塊代碼似于舊的模塊,直接復(fù)制整個(gè)代碼:

svn copy/cp users/list.js list/list.js 

檢查

忙碌的一天過(guò)去了,或者一個(gè)任務(wù)完成了,這個(gè)時(shí)候一般會(huì)將你的工作成果,也就是代碼更新到版本倉(cāng)庫(kù)。

習(xí)慣上會(huì)先檢查下修改狀態(tài):

svn status/stat/st 

看到一些SVN狀態(tài)位信息,確認(rèn)是修改了哪些文件,之后一般會(huì)自己code review一下代碼的改動(dòng),可能有的人會(huì)習(xí)慣直接用SVN方式來(lái)查看:

svn diff/di folder(本地目錄名,可選,默認(rèn)當(dāng)前目錄) // 查看index.html當(dāng)前版本和版本3的差別 svn diff/di –revision/r 3 index.html // 查看index.html版本3和版本4的差別 svn diff/di –revision/r 3:4 index.html 

一般來(lái)說(shuō)這個(gè)時(shí)候,沒(méi)有什么特殊情況,就直接進(jìn)入“提交”階段了,然后結(jié)束一個(gè)工作日或工作周期,但難免會(huì)有些特殊情況出現(xiàn)。

取消修改

當(dāng)你code review完后,發(fā)現(xiàn)有些改動(dòng)不滿意,你可能又會(huì)取消這些修改:

svn revert index.html // 回滾整個(gè)目錄 svn revert . -R/--recursive 

分支操作

創(chuàng)建分支

創(chuàng)建一個(gè)分支

svn copy/cp svn://xxx.com/repo/trunk svn://xxx.com/repo/branches/test -m 'make branch test' 

把工作目錄轉(zhuǎn)到分支

svn switch/sw svn://xxx.com/repo/branches/test 

當(dāng)然,也可以再轉(zhuǎn)到主干svn switch/sw svn://xxx.com/repo/trunk。

給分支打標(biāo)簽

復(fù)制最新的發(fā)布分支為標(biāo)簽:

svn copy/cp svn://xxx.com/repo/branches/test svn://xxx.com/repo/tags/test_tag 

合并一個(gè)分支到主干

查找到分支版本

cd branches/test(分支目錄) svn log –stop-on-copy 

最后一個(gè)r11340就是創(chuàng)建分支時(shí)的reversion,也可:

cd trunk(主干目錄) svn -q –stop-on-copy svn://xxx.com/repo/branches/test(分支url) 

這條命令會(huì)查詢出自創(chuàng)建分支以后分支上的所有修改,最下面的那個(gè)版本號(hào)就是我們要找的版本號(hào)。

合并到主干

cd trunk(主干目錄) svn merge -r 11340(分支版本):HEAD svn://xxx.com/repo/branches/test(分支url) 

兩個(gè)分支合并

假設(shè)99是從舊主干引出,100打完tag,表示是新主干。

合并最新代碼的意思是:將新主干與舊主干比對(duì),并添加到99中。這樣99既有自己的新增的代碼,也同時(shí)有最新線上的代碼。

cd 99_Branch svn merge svn://xxx.com/repo/tags/project_Old_BL svn://xxx.com/repo/tags/project_New_BL svn ci -m 'merge 100 trunk' 

但是后來(lái),其他人又向100提了代碼,所以還需要將100分支(即打了tag后的100,打了tag前的100已是主干)合并至99中。

合并辦法:找出100分支,比對(duì)與新主干之間的差別,并添加到99中。這樣99就有最新的全部代碼了。

cd 99_Branch svn merge svn://xxx.com/repo/tags/project_New_BL svn:/xxx.com/repo/branches/100_Branch svn ci -m 'merge 100 branch' 

發(fā)布

給當(dāng)前主干打個(gè)標(biāo)簽,并且這個(gè)標(biāo)簽不再改動(dòng)了,但是實(shí)際上標(biāo)簽和分支是一個(gè)意思,你可以在標(biāo)簽上繼續(xù)做改動(dòng),但這不推薦。

svn copy/cp svn://xxx.com/repo/trunk svn://xxx.com/repo/tags/RB-1.0 

合并主干到分支

svn merge -r LastRevisionMergedFromTrunkToBranch:HEAD svn:/xxx.com/repo/branches/99_Branch 

解決沖突

當(dāng)發(fā)生沖突的時(shí)候,會(huì)提示如下信息:

Conflict discovered in ‘index.html’.

Select: (p) postpone, (df) diff-full, (e) edit,

(mc) mine-conflict, (tc) theirs-conflict,

(s) show all options:

svn detects that theres a conflict here and require you to take some kind of action.

如果你輸入s選項(xiàng),則會(huì)列出所有svn解決沖突的選項(xiàng),如下所示:

(e) edit - change merged file in an editor #直接進(jìn)入編輯

(df) diff-full -show all changes made to merged file #顯示更改至目標(biāo)文件的所有變化

(r) resolved -accept merged version of file

(dc) display-conflict -show all conflicts(ignoring merged version) #顯示所有沖突

(mc) mine-conflict -accept my version for all conflicts (same) #沖突以本地為準(zhǔn)

(tc) theirs-conflict -accept their version for all conflicts (same) #沖突以服務(wù)器為準(zhǔn)

(mf) mine-full -accept my version of entire file (even non-conflicts) #完全以本地為準(zhǔn)

(tf) theirs-full -accept their version of entire file (same) #完全以服務(wù)器為準(zhǔn)

(p) postpone -mark the conflict to be resolved later #標(biāo)記沖突,稍后解決

(l) launch -launch external tool to resolve conflict

(s) show all -show this list

一般我們會(huì)選擇p稍后解決沖突,這樣會(huì)生成三個(gè)文件:.mine, .rOLDREV, .rNEWREV。比如:

index.html index.html.mine index.html.r1 index.html.r2 

解決沖突方法大致有一下幾種:

手工修改index.html文件,然后將當(dāng)前index.html作為最后提交的版本

svn resolve index.html –-accept working 

選擇base版本,即index.html.rOLDREV作為最后提交的版本

svn resolve index.html –-accept base 

使用index.html.rNEWREV作為最后提交的版本

svn resolve index.html –-accept theirs-full 

使用index.html.mine作為最后提交的版本

svn resolve index.html –-accept mine-full // 或者用下面這條命令也可以 // svn resolve index.html –-accept theirs-conflict 

提交代碼

最后,一切確認(rèn)沒(méi)問(wèn)題了:code review完畢,自己覺(jué)得代碼滿意了;然后也合并完別人的修改并且沒(méi)有沖突了。那么就提交代碼吧:

svn commit/ci -m 'message' 

導(dǎo)出代碼

你想把你的代碼導(dǎo)出,不包含svn版本信息,那么你可以:

svn export svn://xxx.com/repo/branches/test folder(本地目錄) 

Git篇

安裝之后第一步

安裝 Git 之后,你要做的第一件事情就是去配置你的名字和郵箱,因?yàn)槊恳淮翁峤欢夹枰@些信息:

git config --global user.name "bukas" git config --global user.email "[email protected]" 

獲取Git配置信息,執(zhí)行以下命令:

git config --list 

創(chuàng)建版本庫(kù)

什么是版本庫(kù)呢?版本庫(kù)又名倉(cāng)庫(kù),英文名repository,你可以簡(jiǎn)單理解成一個(gè)目錄,這個(gè)目錄里面的所有文件都可以被Git管理起來(lái),每個(gè)文件的修改、刪除,Git都能跟蹤,以便任何時(shí)刻都可以追蹤歷史,或者在將來(lái)某個(gè)時(shí)刻可以“還原”。

mkdir testgit && cd testgit git init 

瞬間Git就把倉(cāng)庫(kù)建好了,細(xì)心的讀者可以發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè).git的目錄,默認(rèn)是隱藏的,用ls -ah命令就可以看見(jiàn)。

git-init

把文件添加到版本庫(kù)

touch readme.md git add readme.md 

然后用命令git commit告訴Git把文件提交到倉(cāng)庫(kù):

git commit -m "wrote a readme file" 

簡(jiǎn)單解釋一下git commit命令,-m后面輸入的是本次提交的說(shuō)明,可以輸入任意內(nèi)容,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄。

一次可以add多個(gè)不同的文件,以空格分隔:

git add a.txt b.txt c.txt 

倉(cāng)庫(kù)狀態(tài)

git status 

git status命令可以讓我們時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài)。

但如果能看看具體修改了什么內(nèi)容就更好了:

git diff readme.md 

版本回退

在實(shí)際工作中,我們腦子里怎么可能記得一個(gè)幾千行的文件每次都改了什么內(nèi)容,不然要版本控制系統(tǒng)干什么。版本控制系統(tǒng)肯定有某個(gè)命令可以告訴我們歷史記錄,在Git中,我們用git log命令查看:

git log 

git-log

git log命令顯示從最近到最遠(yuǎn)的提交日志。如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上--pretty=oneline參數(shù):

git log --pretty=oneline 

git-log-pretty

需要友情提示的是,你看到的一大串類似2e70fd...376315的是commit id(版本號(hào))

在 Git中,用HEAD表示當(dāng)前版本,也就是最新的提交commit id,上一個(gè)版本就是HEAD^,上上一個(gè)版本就是HEAD^^,當(dāng)然往上100個(gè)版本寫(xiě)100個(gè)^比較容易數(shù)不過(guò)來(lái),所以寫(xiě)成HEAD~100。

現(xiàn)在我們要把當(dāng)前版本回退到上一個(gè)版本,就可以使用git reset命令:

git reset --hard HEAD^ 

然我們用git log再看看現(xiàn)在版本庫(kù)的狀態(tài),最新的那個(gè)版本已經(jīng)看不到了!好比你從21世紀(jì)坐時(shí)光穿梭機(jī)來(lái)到了19世紀(jì),想再回去已經(jīng)回不去了,腫么辦?

git-reset

辦法其實(shí)還是有的,只要上面的命令行窗口還沒(méi)有被關(guān)掉,你就可以順著往上找啊找啊,假設(shè)找到那個(gè)commit id是2e70fdf...,于是就可以指定回到未來(lái)的某個(gè)版本:

git reset --hard 2e70fdf 

版本號(hào)沒(méi)必要寫(xiě)全,前幾位就可以了,Git會(huì)自動(dòng)去找。當(dāng)然也不能只寫(xiě)前一兩位,因?yàn)镚it可能會(huì)找到多個(gè)版本號(hào),就無(wú)法確定是哪一個(gè)了。

現(xiàn)在,你回退到了某個(gè)版本,關(guān)掉了電腦,第二天早上就后悔了,想恢復(fù)到新版本怎么辦?找不到新版本的commit id怎么辦?

Git提供了一個(gè)命令git reflog用來(lái)記錄你的每一次命令:

git reflog 

git-reflog

終于舒了口氣,于是你看到的commit id是2e70fdf,現(xiàn)在,你又可以乘坐時(shí)光機(jī)回到未來(lái)了。

工作區(qū)和暫存區(qū)

Git和其他版本控制系統(tǒng)如SVN的一個(gè)不同之處就是有暫存區(qū)的概念。

工作區(qū)就是你在電腦里能看到的目錄,比如我的testgit文件夾就是一個(gè)工作區(qū)。

工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是Git的版本庫(kù)。

Git的版本庫(kù)里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD。

前面講了我們把文件往 Git 版本庫(kù)里添加的時(shí)候,是分兩步執(zhí)行的:

第一步是用git add把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū);

第二步是用git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。

因?yàn)槲覀儎?chuàng)建Git版本庫(kù)時(shí),Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支,所以現(xiàn)在git commit就是往master分支上提交更改。

你可以簡(jiǎn)單理解為,git add命令實(shí)際上就是把要提交的所有修改放到暫存區(qū)(Stage),然后執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到分支。

一旦提交后,如果你又沒(méi)有對(duì)工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的。

修改與撤銷

用git diff HEAD -- readme.md命令可以查看工作區(qū)和版本庫(kù)里面最新版本的區(qū)別。

git checkout -- file可以丟棄工作區(qū)的修改:

git checkout -- readme.md 

命令git checkout -- readme.md意思就是,把readme.md文件在工作區(qū)的修改全部撤銷,即讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)。

當(dāng)然也可以用git reset命令。

刪除文件

一般情況下,你通常直接在文件管理器中把沒(méi)用的文件刪了,或者用rm命令刪了:

rm readme.md 

這個(gè)時(shí)候,Git 知道你刪除了文件,因此,工作區(qū)和版本庫(kù)就不一致了,git status命令會(huì)立刻告訴你哪些文件被刪除了。

現(xiàn)在你有兩個(gè)選擇,一是確實(shí)要從版本庫(kù)中刪除該文件,那就用命令git rm刪掉,并且git commit:

git rm readme.md git commit -m "remove readme.md" 

現(xiàn)在,文件就從版本庫(kù)中被刪除了。

另一種情況是刪錯(cuò)了,因?yàn)榘姹編?kù)里還有呢,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:

git checkout -- readme.md 

生成SSH key

創(chuàng)建 SSH Key。在用戶主目錄下,看看有沒(méi)有.ssh目錄,如果有,再看看這個(gè)目錄下有沒(méi)有id_rsa和id_rsa.pub這兩個(gè)文件,如果已經(jīng)有了,可直接跳到下一步。如果沒(méi)有,打開(kāi) Shell(Windows下打開(kāi)Git Bash),創(chuàng)建SSH Key:

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

你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認(rèn)值即可。

如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個(gè)文件,這兩個(gè)就是SSH Key的秘鑰對(duì),id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

然后登錄GitHub(或者其它Git代碼托管平臺(tái)),打開(kāi)Account settings,SSH Keys頁(yè)面,點(diǎn)Add SSH Key,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容。

為什么GitHub需要SSH Key呢?因?yàn)镚itHub需要識(shí)別出你推送的提交確實(shí)是你推送的,而不是別人冒充的,而Git支持SSH協(xié)議,所以GitHub只要知道了你的公鑰,就可以確認(rèn)只有你自己才能推送。

當(dāng)然,GitHub允許你添加多個(gè)Key。假定你有若干電腦,你一會(huì)兒在公司提交,一會(huì)兒在家里提交,只要把每臺(tái)電腦的Key都添加到GitHub,就可以在每臺(tái)電腦上往GitHub推送了。

遠(yuǎn)程服務(wù)器

Git 最強(qiáng)大的功能之一是可以有一個(gè)以上的遠(yuǎn)程服務(wù)器(另一個(gè)事實(shí),你總是可以運(yùn)行一個(gè)本地倉(cāng)庫(kù))。你不一定總是需要寫(xiě)訪問(wèn)權(quán)限,你可以從多個(gè)服務(wù)器中讀。ㄓ糜诤喜ⅲ缓髮(xiě)到另一個(gè)服務(wù)器中。添加一個(gè)遠(yuǎn)程服務(wù)器很簡(jiǎn)單:

git remote add origin(別名,根據(jù)愛(ài)好命名) [email protected]:bukas/bukas.git 

如果你想查看遠(yuǎn)程服務(wù)器的相關(guān)信息,你可以這樣做:

# shows URLs of each remote server git remote -v   # gives more details about origin git remote show origin(別名) 

下一步,就可以把本地庫(kù)的所有內(nèi)容推送到遠(yuǎn)程庫(kù)上:

git push -u origin master 

把本地庫(kù)的內(nèi)容推送到遠(yuǎn)程,用git push命令,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程。

由于遠(yuǎn)程庫(kù)是空的,我們第一次推送master分支時(shí),加上了-u參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái),在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。

從現(xiàn)在起,只要本地作了提交,就可以通過(guò)命令把本地master分支的最新修改推送至GitHub:

git push origin master 

SSH警告

當(dāng)你第一次使用Git的clone或者push命令連接GitHub時(shí),會(huì)得到一個(gè)警告:

The authenticity of host ‘github.com (xx.xx.xx.xx)’ can’t be established.

RSA key fingerprint is xx.xx.xx.xx.xx.

Are you sure you want to continue connecting (yes/no)?

這是因?yàn)镚it使用SSH連接,而SSH連接在第一次驗(yàn)證GitHub服務(wù)器的Key時(shí),需要你確認(rèn) GitHub的Key的指紋信息是否真的來(lái)自GitHub的服務(wù)器,輸入yes回車即可。

從遠(yuǎn)程庫(kù)克隆

當(dāng)已經(jīng)有一個(gè)遠(yuǎn)程庫(kù)的時(shí)候,我們可以用命令git clone克隆一個(gè)本地庫(kù):

git clone [email protected]:test/testgit.git 

你也許還注意到,GitHub給出的地址不止一個(gè),還可以用https://github.com/test/testgit.git這樣的地址。實(shí)際上Git支持多種協(xié)議,默認(rèn)的git://使用ssh,但也可以使用https等其他協(xié)議。使用https除了速度慢以外,還有個(gè)最大的麻煩是每次推送都必須輸入口令,但是在某些只開(kāi)放http端口的公司內(nèi)部就無(wú)法使用ssh協(xié)議而只能用https。

創(chuàng)建與合并分支

首先我們創(chuàng)建dev分支,然后切換到dev分支:

git checkout -b dev 

git checkout命令加上-b參數(shù)表示創(chuàng)建并切換,相當(dāng)于以下兩條命令:

git branch dev git checkout dev 

然后用git branch命令查看當(dāng)前分支:

git branch 

我們?cè)赿ev分支上進(jìn)行添加修改操作,然后我們把dev分支的工作成果合并到master分支上:

git checkout master git merge dev 

git merge命令用于合并指定分支到當(dāng)前分支。

注意到git merge的信息里面可能有Fast-forward字樣,Git告訴我們,這次合并是“快進(jìn)模式”,也就是直接把master指向dev的當(dāng)前提交,所以合并速度非常快。

當(dāng)然也不是每次合并都能Fast-forward。

合并完成后,就可以放心地刪除dev分支了:

git branch -d dev 

如果要丟棄一個(gè)沒(méi)有被合并過(guò)的分支,可以通過(guò)git branch -D <branch>強(qiáng)行刪除。

在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支,使用git checkout -b branch-name origin/branch-name,本地和遠(yuǎn)程分支的名稱最好一致;

建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián),使用git branch --set-upstream branch-name origin/branch-name;

從遠(yuǎn)程抓取分支,使用git pull,如果有沖突,要先處理沖突。

解決沖突

人生不如意之事十之八九,合并分支往往也不是一帆風(fēng)順的。

有時(shí)候我們進(jìn)行合并的時(shí)候,會(huì)提示有沖突出現(xiàn)CONFLICT (content),必須手動(dòng)解決沖突后再提交。git status也可以告訴我們沖突的文件。

打開(kāi)沖突文件我們會(huì)看到Git用<<<<<<<,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容,我們修改后提交:

git add readme.md git commit -m "conflict fixed" 

用帶參數(shù)的git log也可以看到分支的合并情況:

git log --graph --pretty=oneline --abbrev-commit 

分支管理策略

通常,合并分支時(shí),如果可能,Git會(huì)用Fast forward模式,但這種模式下,刪除分支后,會(huì)丟掉分支信息。

如果要強(qiáng)制禁用Fast forward模式,Git就會(huì)在merge時(shí)生成一個(gè)新的commit,這樣,從分支歷史上就可以看出分支信息。

下面我們實(shí)戰(zhàn)一下--no-ff方式的git merge:

首先,仍然創(chuàng)建并切換dev分支:

git checkout -b dev 

修改readme.md文件,并提交一個(gè)新的commit:

git add readme.md git commit -m "add merge" 

現(xiàn)在,我們切換回master:

git checkout master 

準(zhǔn)備合并dev分支,請(qǐng)注意--no-ff參數(shù),表示禁用Fast forward:

git merge --no-ff -m "merge with no-ff" dev 

Bug分支

軟件開(kāi)發(fā)中,bug就像家常便飯一樣。有了bug就需要修復(fù),在Git中,由于分支是如此的強(qiáng)大,所以,每個(gè)bug都可以通過(guò)一個(gè)新的臨時(shí)分支來(lái)修復(fù),修復(fù)后,合并分支,然后將臨時(shí)分支刪除。

當(dāng)你接到一個(gè)修復(fù)一個(gè)代號(hào)101的bug的任務(wù)時(shí),很自然地,你想創(chuàng)建一個(gè)分支issue-101來(lái)修復(fù)它,但是,等等,當(dāng)前正在dev上進(jìn)行的工作還沒(méi)有提交。

并不是你不想提交,而是工作只進(jìn)行到一半,還沒(méi)法提交,預(yù)計(jì)完成還需1天時(shí)間。但是,必須在兩個(gè)小時(shí)內(nèi)修復(fù)該bug,怎么辦?

幸好,Git還提供了一個(gè)stash功能,可以把當(dāng)前工作現(xiàn)場(chǎng)“儲(chǔ)藏”起來(lái),等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作:

git stash 

現(xiàn)在,用git status查看工作區(qū),就是干凈的(除非有沒(méi)有被 Git 管理的文件),因此可以放心地創(chuàng)建分支來(lái)修復(fù)bug。

首先確定要在哪個(gè)分支上修復(fù)bug,假定需要在master分支上修復(fù),就從master創(chuàng)建臨時(shí)分支:

git checkout master git checkout -b issue-101 

現(xiàn)在修復(fù)bug,然后提交:

git add readme.md git commit -m "fix bug 101" 

修復(fù)完成后,切換到master分支,并完成合并,最后刪除issue-101分支:

git checkout master git merge --no-ff -m "merged bug fix 101" issue-101 

太棒了,原計(jì)劃兩個(gè)小時(shí)的bug修復(fù)只花了5分鐘!現(xiàn)在,是時(shí)候接著回到dev分支干活了!

git checkout dev git status 

工作區(qū)是干凈的,剛才的工作現(xiàn)場(chǎng)存到哪去了?用git stash list命令看看:

git stash list 

工作現(xiàn)場(chǎng)還在,Git把stash內(nèi)容存在某個(gè)地方了,但是需要恢復(fù)一下,有兩個(gè)辦法:

一是用git stash apply恢復(fù),但是恢復(fù)后,stash內(nèi)容并不刪除,你需要用git stash drop來(lái)刪除;

另一種方式是用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪了:

git stash pop 

再用git stash list查看,就看不到任何stash內(nèi)容了。

你可以多次stash,恢復(fù)的時(shí)候,先用git stash list查看,然后恢復(fù)指定的stash,用命令

git stash apply [email protected]{0} 

標(biāo)簽管理

發(fā)布一個(gè)版本時(shí),我們通常先在版本庫(kù)中打一個(gè)標(biāo)簽,這樣,就唯一確定了打標(biāo)簽時(shí)刻的版本。將來(lái)無(wú)論什么時(shí)候,取某個(gè)標(biāo)簽的版本,就是把那個(gè)打標(biāo)簽的時(shí)刻的歷史版本取出來(lái)。所以,標(biāo)簽也是版本庫(kù)的一個(gè)快照。

命令git tag <tagname>用于新建一個(gè)標(biāo)簽,默認(rèn)為HEAD,也可以指定一個(gè)commit id。

git tag -a <tagname> -m "blablabla..."可以指定標(biāo)簽信息。

還可以通過(guò)-s用私鑰簽名一個(gè)標(biāo)簽:

git tag -s v0.5 -m "signed version 0.2 released" fec145a 

git tag可以查看所有標(biāo)簽。

用命令git show <tagname>可以查看某個(gè)標(biāo)簽的詳細(xì)信息。

如果標(biāo)簽打錯(cuò)了,也可以刪除:

git tag -d v0.1 

因?yàn)閯?chuàng)建的標(biāo)簽都只存儲(chǔ)在本地,不會(huì)自動(dòng)推送到遠(yuǎn)程。所以,打錯(cuò)的標(biāo)簽可以在本地安全刪除。

如果要推送某個(gè)標(biāo)簽到遠(yuǎn)程,使用命令git push origin <tagname>:

git push origin v1.0 

或者,一次性推送全部尚未推送到遠(yuǎn)程的本地標(biāo)簽:

git push origin --tags 

如果標(biāo)簽已經(jīng)推送到遠(yuǎn)程,要?jiǎng)h除遠(yuǎn)程標(biāo)簽就麻煩一點(diǎn),先從本地刪除:

git tag -d v0.9 

然后,從遠(yuǎn)程刪除。刪除命令也是push,但是格式如下:

git push origin :refs/tags/v0.9 

忽略特殊文件

在安裝Git一節(jié)中,我們已經(jīng)配置了user.name和user.email,實(shí)際上,Git還有很多可配置項(xiàng)。

比如,讓Git顯示顏色,會(huì)讓命令輸出看起來(lái)更醒目:

git config --global color.ui true 

有些時(shí)候,你必須把某些文件放到Git工作目錄中,但又不能提交它們,比如保存了數(shù)據(jù)庫(kù)密碼的配置文件啦,等等,每次git status都會(huì)顯示Untracked files…,有強(qiáng)迫癥的童鞋心里肯定不爽。

好在Git考慮到了大家的感受,這個(gè)問(wèn)題解決起來(lái)也很簡(jiǎn)單,在 Git工作區(qū)的根目錄下創(chuàng)建一個(gè)特殊的.gitignore文件,然后把要忽略的文件名填進(jìn)去,Git就會(huì)自動(dòng)忽略這些文件。

不需要從頭寫(xiě).gitignore文件,GitHub已經(jīng)為我們準(zhǔn)備了各種配置文件,只需要組合一下就可以使用了。所有配置文件可以直接在線瀏覽:https://github.com/github/gitignore

當(dāng)然也可以配置全局忽略的文件,這樣就不用每個(gè)項(xiàng)目都加gitignore了:

git config --global core.excludesfile '~/.gitignore' 

配置別名

有沒(méi)有經(jīng)常敲錯(cuò)命令?比如git status?status這個(gè)單詞真心不好記。

如果敲git st就表示git status那就簡(jiǎn)單多了,當(dāng)然這種偷懶的辦法我們是極力贊成的。

我們只需要敲一行命令,告訴Git,以后st就表示status:

git config --global alias.st status 

當(dāng)然還有別的命令可以簡(jiǎn)寫(xiě):

git config --global alias.co checkout git config --global alias.ci commit git config --global alias.br branch 

--global參數(shù)是全局參數(shù),也就是這些命令在這臺(tái)電腦的所有Git倉(cāng)庫(kù)下都有用。

在撤銷修改一節(jié)中,我們知道,命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)。既然是一個(gè)unstage操作,就可以配置一個(gè)unstage別名:

git config --global alias.unstage 'reset HEAD' 

配置一個(gè)git last,讓其顯示最后一次提交信息:

git config --global alias.last 'log -1' 

甚至還有人把lg配置成了:

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" 

配置文件

配置Git的時(shí)候,加上–global是針對(duì)當(dāng)前用戶起作用的,如果不加,那只針對(duì)當(dāng)前的倉(cāng)庫(kù)起作用。

配置文件放哪了?每個(gè)倉(cāng)庫(kù)的Git配置文件都放在.git/config文件中。

而當(dāng)前用戶的Git配置文件放在用戶主目錄下的一個(gè)隱藏文件.gitconfig中。

原文:http://w3cboy.com/post/2015/09/those-common-svn-and-git-commands/

標(biāo)簽: isp 安全 代碼 服務(wù)器 權(quán)限 數(shù)據(jù)庫(kù)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:如何做好架構(gòu)之識(shí)別問(wèn)題

下一篇:認(rèn)識(shí)概念是理解架構(gòu)的基礎(chǔ)