git --分布式版本控制軟件,免費(fèi)而超好用的git
gitHub是使用git進(jìn)行版本控制的代碼管理網(wǎng)站
Linux系統(tǒng)不斷發(fā)展围苫,已經(jīng)成為最大的服務(wù)器系統(tǒng)軟件了锨苏。
CVS和SVN都是集中式的版本控制系統(tǒng)制圈,而Git是分布式版本控制系統(tǒng)睹酌。
區(qū)別:集中式版本控制系統(tǒng)是邓尤,干活的時(shí)候用的都是自己的電腦所以要先從中央服務(wù)器取得最新的版本拍鲤,然后開始干活,干完活了汞扎,再把自己的活推送給中央服務(wù)器季稳。
中央服務(wù)器就好比是一個(gè)圖書館,你要改一本書澈魄,必須先從圖書館借出來景鼠,然后回到家自己改,改完了痹扇,再放回圖書館
集中式版本控制系統(tǒng)最大的毛病就是必須聯(lián)網(wǎng)才能工作铛漓。
分布式版本控制系統(tǒng)根本沒有‘中央服務(wù)器’,每個(gè)人的電腦上都是一個(gè)完整的版本庫鲫构,這樣就可以不用聯(lián)網(wǎng)了浓恶,
但是如果你在自己電腦上修改了文件A,你的同事也修改了A芬迄,你們兩個(gè)需要互相推送就可以看到對方的修改了问顷。
分布式版本控制系統(tǒng)通常也有一臺充當(dāng)‘中央服務(wù)器’的電腦,這個(gè)服務(wù)器用來‘交換大家的修改’禀梳,交換修改更方便杜窄。
Git極其強(qiáng)大的分支管理
總體思路圖解:
使用git,首先需要下載git并進(jìn)行安裝,官方網(wǎng)址為:https://git-scm.com/進(jìn)行下載git
安裝完成后算途,還需要最后一步設(shè)置塞耕,
配置本地用戶信息
?$ git config --global user.name "Your Name"?//配置用戶名,Your Name為起的名字
$ git config --global user.email "email@example.com"?//配置郵箱
$ git config user.name查看配置的用戶名
$ git config?user.email查看配置的郵箱
創(chuàng)建版本庫:
版本庫又名倉庫嘴瓤,英文名repository扫外,可以理解成一個(gè)目錄,這個(gè)目錄里所有文件都可以被Git管理廓脆,每個(gè)文件的修改筛谚、刪除,Git都能跟蹤和修改停忿。
??? $ mkdir learngit創(chuàng)建文件夾
??? $ cd learngit進(jìn)入目錄
??? $ pwd????????????顯示當(dāng)前目錄
pwd命令用于顯示當(dāng)前目錄驾讲,也就是該倉庫位于/Users/michael/learngit
第二步,通過git init命令把這個(gè)目錄變成Git可以管理的倉庫
??? $ git init
瞬間Git就把倉庫建好了,而且也是一個(gè)空的倉庫吮铭,learngit文件下多了一個(gè)
.git目錄时迫。這個(gè)目錄是Git來跟蹤管理版本庫的,不要手動修改
把文件添加到版本庫
版本控制系統(tǒng)是沒法跟蹤word文件的改動谓晌,如果要真正使用版本控制系統(tǒng)掠拳,就要以純文本方式編寫文件
最好不要使用windows自帶的記事本編輯任何文本文件,會遇到很多不可思議的問題纸肉。建議使用Nodepad++去代替記事本溺欧。
言歸正傳
編寫一個(gè)readme.txt文件 一定要放在learngit目錄下,因?yàn)檫@是一個(gè)Git倉庫
第一步
用命令git add readme.txt告訴Git毁靶,把文件添加到倉庫里面胧奔。沒有任何消息,說明添加成功预吆。
第二部
用命令git commit告訴Git,把文件提交到倉庫:
??? git commit -m "wrote a readme file"解釋:git commit命令胳泉,-m后面輸入是本次提交說明拐叉,可以輸入任意內(nèi)容,當(dāng)然通俗易懂
會出現(xiàn)下面內(nèi)容
??? [master (root-commit) 9dfd485] wrote a readme file
??? 1 filechanged, 2 insertions(+)
createmode 100644 readme.txt解釋:1個(gè)文件被改動扇商,插入兩行內(nèi)容
//因?yàn)閏ommit可以一次提交很多文件凤瘦,所以你可以多次add不同的文件
比如:
??? $ git add file1.txt
??? $ git add file2.txt file3.txt
??? $ git commit -m "add 3 files."? ? ? ? ? ? ? ? ? ? ? ? ?
第三步
手動修改readme.txt文件
用命令git status命令查看結(jié)果:git status命令讓我們時(shí)刻掌握倉庫當(dāng)前的狀態(tài),readme.txt被修改了案铺,但還沒有準(zhǔn)備提交的修改
用命令git diff readme.txt命令查看不同蔬芥,(git add命令之前的查看)可以知道具體修改了哪些內(nèi)容
知道修改了具體內(nèi)容我們可以提交修改文件了
第四步
??? git add readme.txt同樣沒有任何提示,添加了文件
??? git status我們可以運(yùn)行這段命令查看倉庫狀態(tài)
??? git commit -m "add distributed"提交的修改文件readme.txt
??? git status提交后再次用這段命令查看倉庫的當(dāng)前狀態(tài)控汉,得到當(dāng)前沒有需要提交的修改笔诵,工作目錄是干凈的
總結(jié):git status命令可以隨時(shí)掌握工作區(qū)的狀態(tài),如果告訴你有文件被修改過姑子,那么就用git diff查看修改內(nèi)容
版本回退
這里我們可以再次對readme.txt進(jìn)行修改乎婿,然后再次提交。
??? git log這段命令我們就可以知道我們什么時(shí)候修改了什么內(nèi)容街佑,可以得到提交的修改
現(xiàn)在我們準(zhǔn)備回到readme.txt回退到上一個(gè)版本谢翎,也就是"add distributed"這個(gè)版本
git中,HEAD表示當(dāng)前版本沐旨。上一個(gè)版本 HEAD^, 上上一個(gè)版本 HEAD^^,上100個(gè)版本寫成HEAD~100
現(xiàn)在我們將當(dāng)前版本回退到上一個(gè)版本"adddistributed"
??? git reset --hard HEAD^便可以得到當(dāng)前版本的上一個(gè)版本
??? cat readme.txt這段命令可以知道readme.txt中的詳細(xì)內(nèi)容
果然退回到上一個(gè)版本
??? git log再次查看當(dāng)前版本庫的狀態(tài)森逮,剛才的版本不見了,21世紀(jì)回到了19世紀(jì)磁携,想再回去21世紀(jì)如何褒侧?
只要命令行沒有關(guān)掉我們就可以往上面找,找到剛才版本的commitid是多少
??? git reset --hard 82aa873c95a1(只需要寫前幾位,沒必要寫全璃搜,Git會自動去找)
??? cat readme.txt再次查看拖吼,發(fā)現(xiàn)剛才的版本已經(jīng)回來了
比如說現(xiàn)在你回退到某一個(gè)版本,關(guān)掉電腦这吻。第二天后悔想恢復(fù)到新版本該咋辦吊档?找不到新版本的commit id?
想要回退到最新的版本唾糯,就必須找到最新版本的commit?id
??? git reflog這段命令用來記錄你的每一次命令便可以得到commit id
總結(jié):
HEAD指向的版本就是當(dāng)前版本怠硼,因此Git允許我們在版本歷史間穿梭 Git reset --hard commit_id
git log可以查看提交歷史,以便確定要回退到哪個(gè)版本
要重返未來版本 用git reflog查看命令歷史移怯,以便確定要回到未來的哪個(gè)版本
工作區(qū)和暫存區(qū)
工作區(qū):
就是電腦里面可以看到的目錄香璃,比如我的learngit文件夾就是一個(gè)工作區(qū)。
版本庫:
工作區(qū)有一個(gè)隱藏的目錄.git?? 是Git的版本庫
Git版本庫存了很多東西舟误,最重要的是stage(index)的暫存區(qū)
還有Git為我們自動創(chuàng)建的第一個(gè)分支master葡秒,以及指向master的一個(gè)指針叫HEAD
前面我們把文件往Git版本庫添加時(shí)候,是分兩步執(zhí)行的:
第一步是用git add把文件添加進(jìn)去嵌溢,實(shí)際上就是把文件修改添加到暫存區(qū)
第二部是用git? commit提交修改眯牧,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支
我們對readme.txt做出修改,
然后在工作區(qū)新增加一個(gè)license文本文件
git status查看一下狀態(tài):readme.txt被修改了赖草,而license沒有被添加過学少,狀態(tài)是Untracked
使用兩次git add命令,將readme.txt和license都添加秧骑,
git status再次查看狀態(tài)
所以git add命令實(shí)際上把要提交的所有修改放到暫存區(qū)(Stage)
然后執(zhí)行g(shù)it? commit就可以一次性把暫存區(qū)的所有修改提交到分支
使用命令
git? commit –m “understand how stage works”執(zhí)行提交
管理修改
Git比其他版本控制系統(tǒng)設(shè)計(jì)的優(yōu)秀在于Git跟蹤并管理的是修改而不是文件
簡單測試:第一次修改文本- git add第二次修改文本 –> git commit
Git管理的是修改版确,當(dāng)我們使用git add命令后,在工作區(qū)的第一次修改被放入暫存區(qū)乎折,準(zhǔn)備提交蓉驹。
但是在工作區(qū)的第二次修改并沒有放入暫存區(qū)我衬,所以git? commit只負(fù)責(zé)把暫存區(qū)的修改提交了也就是第一次的修改被提交了,第二次的修改不會被提交。
當(dāng)然如果你想兩次修改都提交到工作區(qū)雁比,可以
第一次修改文本-git add第二次修改文本 –> git add?
在通過命令git commit
撤銷修改
你一不小心在你的最后一行添加your boss is stupid
使用命令 git?checkout -- readme.txt解釋:把readme.txt文件在工作區(qū)的修改全部撤銷椒功。
1窗骑、readme.txt 從修改后還沒有被放到暫存區(qū)凛忿,現(xiàn)在撤銷修改就回到和版本庫一模一樣的狀態(tài)
2、readme.txt已經(jīng)添加到暫存區(qū)樱衷,又作修改棋嘲,撤銷修改就回到添加暫存區(qū)后的狀態(tài)? ? ? ? ? ? ? ? ? ?
重點(diǎn):你寫了上面的my stupid boss?still prefers VSN.而且使用命令 git add 到暫存區(qū)了
但是修改只是添加到了暫存區(qū),還沒有g(shù)it commit提交
Git同樣告訴我們矩桂,用命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉沸移,重新放回工作區(qū)
使用命令git ?reset ?HEAD ?readme.txt可以把暫存區(qū)的修改撤銷掉,重新放回工作區(qū)
在工作區(qū)中將my stupid boss still?prefers VSN這個(gè)修改丟棄
使用命令git? checkout?-- ?readme.txt將工作區(qū)最后的修改丟棄。
總結(jié):
場景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容雹锣,想直接丟棄工作區(qū)的修改時(shí)网沾,用命令git checkout -- file。
場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容蕊爵,還添加到了暫存區(qū)時(shí)辉哥,想丟棄修改,分兩步攒射,第一步用命令git reset HEAD file醋旦,就回到了場景1,第二步按場景1操作会放。
場景3:已經(jīng)提交了不合適的修改到版本庫時(shí)饲齐,想要撤銷本次提交,參考版本回退一節(jié)咧最,不過前提是沒有推送到遠(yuǎn)程庫捂人。
刪除文件
在Git中,刪除也是一個(gè)修改操作窗市。
一確實(shí)要從版本庫中刪除該文件
git rm test.txt刪除文件
git commit –m ‘remove test.txt’提交? 文件從版本庫中被刪除了
二種是刪錯(cuò)了
因?yàn)榘姹編炖镞€有先慷,所以可以很輕松把誤刪除的文件恢復(fù)到最新版本
??? git checkout --?test.txt
git checkout其實(shí)是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除都可以一鍵還原
-------------------------------------------------git ?end ------------------------------------------
遠(yuǎn)程倉庫
介紹Git的殺手級功能
Git是分布式版本控制系統(tǒng)咨察,同一個(gè)Git倉庫,可以分布到不同的機(jī)器上福青,沒有主次之分摄狱。
實(shí)際情況往往是,一臺電腦充當(dāng)服務(wù)器的角色无午,每天24小時(shí)開機(jī)媒役,其他每個(gè)人都從這個(gè)’服務(wù)器’倉庫克隆一份到自己的電腦上,并且各自把各自的提交推送到服務(wù)器倉庫里宪迟,也從服務(wù)器倉庫中拉取別人的提交酣衷。
GitHub神奇的網(wǎng)站,提供Git倉庫托管服務(wù)的次泽。
本地的Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的穿仪。
第一步:創(chuàng)建SSH Key看看有沒有.ssh目錄,如果有意荤,確定有沒有id_rsa 和id_rsa.pub這兩個(gè)文件啊片,如果有請直接跳至下一步,沒有請使用命令
??? ssh-keygen -t rsa -C ‘759945821@qq.com’?
id_rsa是秘鑰玖像,不能泄露出去
id_rsa.pub是公鑰 可以放心地告訴任何人
第二步登錄GitHub紫谷,打開個(gè)人主頁,SSH Keys頁面
然后點(diǎn)擊”Add SSH Key”,填寫任意的Title,在Key文本框粘貼id_rsa.pub文件的內(nèi)容
點(diǎn)擊Add Key.
為什么GitHub需要SSH key?
因?yàn)镚itHub需要識別出你推送的提交確實(shí)是你推送的笤昨,而不是別人冒充的祖驱,而Git支持SSH協(xié)議。所以GitHub只要知道你的公鑰瞒窒,就可以確認(rèn)你自己才能推送捺僻。
當(dāng)然GitHub允許你添加多個(gè)Key,可以在公司也可以在家根竿,只要把每臺電腦的key都添加到GitHub陵像,就可以在每臺電腦上推送了。
GitHub上免費(fèi)托管的Git倉庫寇壳,任何人都可以看到醒颖,但只有你才可以修改。
可以交錢變成私有的壳炎,也可以自己動手搭一個(gè)Git服務(wù)器泞歉,因?yàn)槟阕约旱姆?wù)器,別人看不見匿辩。這樣我們就可以開始學(xué)習(xí)遠(yuǎn)程庫了腰耙。
添加遠(yuǎn)程庫
已經(jīng)在本地創(chuàng)建了一個(gè)Git倉庫后,又想在GitHub創(chuàng)建一個(gè)Git倉庫铲球,并且讓這兩個(gè)倉庫進(jìn)行遠(yuǎn)程同步挺庞,這樣GitHub上的倉庫既可以備份,也可以讓其他人通過該倉庫來習(xí)作稼病,一舉多得选侨。
在GitHub中找到Create a new repository
輸入Repositoryname,在這里我們是learngit,其他保持不變
就成功地創(chuàng)建了一個(gè)新的Git倉庫
在本地git輸入命令
??? git remote add origin?git@github.com:xxxx/learngit.git?
添加后然走,遠(yuǎn)程庫的名字就是origin這是Git的默認(rèn)叫法origin 是就是遠(yuǎn)程庫援制。
接下來一部就是,可以把本地庫的所有內(nèi)容推送到遠(yuǎn)程庫上
git push –u origin?master?
把本地庫的內(nèi)容推送到遠(yuǎn)程芍瑞,用git push命令晨仑,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程。
由于遠(yuǎn)程庫是空的拆檬,我們第一次推送master分支時(shí)洪己,加上-u參數(shù),Git不但會把本地的master分支推送的遠(yuǎn)程新的master分支秩仆,還會把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來码泛,在以后的推送或者拉取時(shí)就可以簡化命令了。
從現(xiàn)在起澄耍,只要本地作了提交噪珊,就可以通過命令
git push origin master現(xiàn)在也就是正式擁有了分布式版本庫
總結(jié):
要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫晌缘,使用命令git remote?add origin?git@github.com:mangoyi/learngit.git
關(guān)聯(lián)后使用命令
git push –u origin master第一次推送master分支的所有內(nèi)容
之后本地提交后,就可以使用命令git push?origin master推送最新修改
克隆遠(yuǎn)程庫
我們可以先創(chuàng)建遠(yuǎn)程庫痢站,從遠(yuǎn)程庫克隆
我們勾選Initialize thisrepository width a README
這樣GitHub會自動為我們創(chuàng)建一個(gè)REANME.md文件磷箕,創(chuàng)建完畢后可以看到README.md
下一步克隆一個(gè)本地庫
補(bǔ)充:? 命令ssh??git@github.com可以來判斷是否配置好權(quán)限了
克隆命令 git clone?git@github.com:xxx/gitkills.git?
命令? cd gitkills
命令?? ls??????????????????? 得出README.md? 已經(jīng)在我們目錄中了
說明克隆成功
GitHub給出的地址不止一個(gè),還可以使用http://github.com/xxx/gitkills.git
這樣的地址阵难,實(shí)際上岳枷,Git支持多種協(xié)議,默認(rèn)是git://使用ssh呜叫,但也可以使用https等其他協(xié)議空繁。https速度慢,還有個(gè)最大的麻煩每次推送都必須輸入口令朱庆,但是在某些只開放http端口的公司內(nèi)部就無法使用ssh協(xié)議而只能用https
創(chuàng)建并合并一個(gè)分支
具體參考:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000
1盛泡、 創(chuàng)建dev分支
git checkout –b dev得到:Switched to a new branch ‘dev’
git checkout命令加上-b參數(shù)表示創(chuàng)建并切換相當(dāng)于兩條命令
????????????? git branch dev
????????????? git checkout dev
2、git branch命令查看當(dāng)前分支
git branch得到 *dev
??????????????????????????? ?master
3娱颊、這個(gè)時(shí)候已經(jīng)在分支上面傲诵,我們在文件夾創(chuàng)建readme.txt文件,此時(shí)文件是在dev分支上面的箱硕,
4拴竹、然后提交
git add readme.txt
git commit –m “branch test”
5、dev分支工作完成剧罩,我們就可以切換回master分支
git checkout master得到 Switched to branch ‘master’
6栓拜、切換到master時(shí)候我們發(fā)現(xiàn)readme.txt文件不見了,因?yàn)槟莻€(gè)提交在dev分支上惠昔,而master分支此刻的提交點(diǎn)并沒有改變菱属。
7、現(xiàn)在講dev分支上的工作成果合并到master分支上
git merge dev命令用于合并指定分支到當(dāng)前分支舰罚,合并后便可以查看到和dev分支?????????? ??? 提交完全一樣,
8薛耻、合并完成后我們就可以放心地刪除了dev分支了
Git branch –d dev得到:Deleted branch dev(was fec145e)
9营罢、刪除后查看branch就只是剩下master分支了
git branch得到* master? 只剩下master分支
10、創(chuàng)建合并刪除非潮荩快饲漾,所以git鼓勵(lì)你使用分支完成某個(gè)任務(wù)。合并后在刪掉分支 缕溉,這樣和直接在master分支上工作效果是一樣的考传,但是過程更安全。
查看分支:git branch
創(chuàng)建分支:git branch dev(名稱)
切換分支:git checkout dev(切換到dev分支)
創(chuàng)建+切換分支: git? checkout –b dev(分支名稱)
合并某分支到當(dāng)前分支:git merge dev(分支名稱)
刪除分支:git branch –d dev (分支名稱)
-------2019\
解決沖突:我們在合并分支的時(shí)候會出現(xiàn)证鸥,比如兩個(gè)用戶修改了同一個(gè)文件區(qū)域僚楞,git會報(bào)告內(nèi)容沖突所以此時(shí)我們必須對內(nèi)容進(jìn)行修改勤晚。
在今天的學(xué)習(xí)中,
1泉褐、使用命令 cd learngit???? 到達(dá)指定的learngit庫
2赐写、準(zhǔn)備新的分支 feature1分支? git?checkout –b feature1??
3、修改readme.txt最后一行膜赃,修改為Creatinga new branch is quick AND simple
補(bǔ)充:一:我們可以使用命令 vi readme.txt??? 便可以直接在命令行修改了
修改完之后按ESC鍵挺邀,退出編輯模式,切換到命令模式
輸入:wq 保存修改并且退出vi 編輯文檔模式
如果只想保存文件跳座,則只需要輸入:w?? 回后底行會提示寫入操作結(jié)果端铛,并保持停留在命令模式
二:當(dāng)然我們也可以找到文件直接打開修改在保存也是可以的。
4疲眷、git add readme.txt????
?? git commit –m ‘& simple’
現(xiàn)在master分支和feature1分支各自都分別有新的提交
5禾蚕、git在這種情況是無法執(zhí)行快速合并, 我們用gitmerge feature1 會告訴我們沖突了咪橙,
必須手動解決夕膀,然后在提交
6、使用命令git status 也可以看出我們沖突的文件
7美侦、我們查看readme.txt的內(nèi)容产舞,
這里可以直接用命令vi readme.txt 來編輯我們的內(nèi)容,然后在保存并且回到命令行
8菠剩、在git add readme.txt
git commit –m ‘conflict fixed’這樣我們便修改沖突并且提交成功
9易猫、用命令
git ?log?–graph ?–pretty=online ?–abbrev-commit這里我們可以查看分支合并的情況
10、????最后刪除分支
git branch –d feature1工作完成
分支管理策略
通常合并分支時(shí)具壮,git 會采用Fast forward模式准颓,但這種模式下,刪除分支后棺妓,會丟掉分支信息攘已。
我們用–no-ff方式的git merge
1、任然創(chuàng)建并且切換dev分支
??? git checkout –b dev
2怜跑、修改readme.txt文件样勃,并且提交一個(gè)commit??
??? git add readme.txt
??? git commit –m ‘a(chǎn)dd merge’
3、現(xiàn)在我們切換回master
??? Git checkout master
4性芬、準(zhǔn)備合并dev分支峡眶,注意使用—no-ff參數(shù),表示禁用Fast forward模式來合并
git merge? –no-ff?–m? ‘merge with no-ff’ dev
解釋:因?yàn)楸敬魏喜⒁獎?chuàng)建一個(gè)新的commit,所以加上-m參數(shù)植锉,把commit描述寫進(jìn)去
5辫樱、合并后我們可以通過命令 git log? 看看分支歷史
總結(jié):分支策略
后來話:在實(shí)際開發(fā)中,首先master分支時(shí)非常穩(wěn)定的俊庇,也就是僅僅用來發(fā)布新版本狮暑,平時(shí)不能在上面干活鸡挠。
干活都是在dev分支上面,也可以說dev分支不穩(wěn)點(diǎn)心例。
團(tuán)隊(duì)合作每個(gè)人都有自己的dev分支宵凌,dev分支上面合并就可以了
Git分支十分強(qiáng)大,合并分支時(shí)止后,加上—no-ff 參數(shù)就可以用普通模式合并瞎惫,合并后的歷史記錄里面有分支的信息,而fast forward 合并就卡不出來曾經(jīng)做過合并译株。
Bug分支
在軟件開發(fā)中瓜喇,bug就像家常便飯,git分支如此強(qiáng)大歉糜,所以每個(gè)bug都可以通過一個(gè)新的臨時(shí)分支來修復(fù)乘寒,修復(fù)后,合并分支匪补,然后將臨時(shí)分支刪除伞辛。
實(shí)戰(zhàn)演練,當(dāng)你接到一個(gè)101代號的bug任務(wù)時(shí)夯缺,很自然你會想到創(chuàng)建一個(gè)issue-101來修復(fù)它蚤氏,但是當(dāng)前dev分支的工作還沒有提交。
實(shí)際情況是工作只進(jìn)行到一半踊兜,還沒法提交竿滨,預(yù)計(jì)一天才能提交,但是bug要在2個(gè)小時(shí)內(nèi)完成捏境。腫么辦于游?
幸好:Git提供一個(gè)stash功能,可以把當(dāng)前工作現(xiàn)場‘存儲’起來垫言,等之后恢復(fù)現(xiàn)場繼續(xù)工作贰剥。
1、現(xiàn)在我們在dev分支上筷频,我們對文件readme.txt做出了一些修改但是我們還要繼續(xù)修改鸠澈,但是bug在兩個(gè)小時(shí)必須解決,
用命令git stash臨時(shí)保存工作現(xiàn)場
得到Savedworking directory and index state WIP on dev: 3826324 add merge
HEAD is now at 3826324 add merge
2截驮、可以使用git status查看當(dāng)前的工作區(qū)狀態(tài),?????????????????????????????????????????????????????????
首先確定在哪個(gè)分支上修復(fù)bug际度,假定是在master分支上修復(fù)葵袭,就從master分支創(chuàng)建臨時(shí)分支
git checkout master切換到master分支
3、創(chuàng)建issue-101分支
git checkout –b issue-101來創(chuàng)建issue-101分支
4乖菱、現(xiàn)在修復(fù)bug坡锡,比如說將Git is free software 修改為 Git is a free software
然后提交git add readme.txt
??????? ?git commit - m ‘fix bug 101’
5蓬网、修復(fù)完成后,切換到master分支鹉勒,并完成合并最后刪除issue-101分支
git checkout master??????????????
git merge –no-ff –m ‘merged bug fix 101’issue-101解釋:--no-ff參數(shù)合并保存歷史記錄
?? git branch –d ?issue-101? ??
6帆锋、101bug修復(fù)完成,現(xiàn)在我們要回到dev分支繼續(xù)干活了
??? git checkout dev??
git status解釋:查看dev當(dāng)前的工作區(qū)
6禽额、這里是查看工作現(xiàn)場在哪里
git stash list? ?
得到stash@{0}: WIP on dev: 3826324 add merge? ? ?
7锯厢、恢復(fù)工作現(xiàn)場
一:git stash apply 恢復(fù),但是恢復(fù)后stash內(nèi)容并不刪除脯倒,需要用git stash drop 來刪除实辑。
二:另外一種用 git stash pop恢復(fù),恢復(fù)的同時(shí)把stash內(nèi)容也刪除
用命令git stash list查看,這樣我們就看不到stash內(nèi)容了
總結(jié):
修復(fù)bug時(shí)藻丢,我們會通過創(chuàng)建的bug分支進(jìn)行修復(fù)剪撬,然后合并,再刪除
當(dāng)手頭工作還沒完成的時(shí)候悠反,先把工作現(xiàn)場git bash保存
然后修復(fù)bug之后残黑,在git stash pop,回到工作現(xiàn)場斋否。并且刪除了stash內(nèi)容
Feature分支
軟件開發(fā)中梨水,總有無窮無盡的新功能添加進(jìn)來,添加一個(gè)新功能你肯定不希望把主分支搞亂如叼,所以沒添加一個(gè)新功能冰木,最好新建一個(gè)feature分支,在分支上開發(fā)笼恰,完成后踊沸,合并最后刪除該feature分支
實(shí)戰(zhàn):接到一個(gè)新任務(wù),開發(fā)代號為Vulcan的新功能
1社证、準(zhǔn)備開發(fā)創(chuàng)建分支
git checkout –b feature-vulcan
2逼龟、在文件中添加vulcan.py 文件,
3追葡、git add Vulcan.py ?? //添加文件到暫存區(qū)??
git status??????????? //查看當(dāng)前狀態(tài)
git commit –m ‘a(chǎn)dd feature vulcan’? //提交文件到版本庫
4腺律、切回dev分支或者master分支,準(zhǔn)備合并
git checkout master切回master分支
5宜肉、但是此時(shí)上級命令經(jīng)費(fèi)不足匀钧,取消新功能。
git branch –d feature-vulcan???? //想刪除該分支
結(jié)果:error: The branch 'feature-vulcan' is not fully merged.
If you are sure youwant to delete it, run 'git branch -D feature-vulcan
6谬返、Gif提醒feature-vulcan分支還沒有被合并之斯,如果刪除就會丟掉修改,如果想強(qiáng)行刪除
git branch –D? feature-vulcan強(qiáng)行刪除分支?? 完成任務(wù)
多人協(xié)作
---當(dāng)你從遠(yuǎn)成倉庫克隆的時(shí)候遣铝,實(shí)際上Git把本地的master分支和遠(yuǎn)程的master分支對應(yīng)起來佑刷,并且遠(yuǎn)成倉庫的默認(rèn)名稱是origin
查看遠(yuǎn)程庫的信息用git remote
即git?remote結(jié)果: origin
或者更加詳細(xì)的是git remote –v結(jié)果更加的詳細(xì)
推行分支:
推送分支就是把該分支上的所有本地提交推送到遠(yuǎn)程庫莉擒,推送時(shí)候,要指定本地分支瘫絮。Git就會把該分支推送到遠(yuǎn)程庫對應(yīng)的遠(yuǎn)程分支上涨冀。
git push origin master??
當(dāng)然要推送其他分支比如dev就改成 git push origin dev
但是并不是一定要把本地分支往遠(yuǎn)程推送,哪些分支需要推送呢
master分支時(shí)主分支要時(shí)刻與遠(yuǎn)程同步
dev分支時(shí)開發(fā)分支麦萤,團(tuán)隊(duì)所有成員都需要在上面工作鹿鳖,也需要遠(yuǎn)程同步
bug分支只用于本地修復(fù)bug,就沒必要推到遠(yuǎn)程了
feature分支是否推送到遠(yuǎn)程频鉴,取決于你是否和你的小伙伴合作在上面開發(fā)
抓取分支:
多人協(xié)作時(shí)栓辜,大家都會往master和dev分支上推送各自的修改。
補(bǔ)充:比如我們在learngit庫中有一個(gè)文件test.txt
我們需要git add test.txt
????????????? git commit test.txt –m? ‘commit test.txt’
最后我們使用命令 git push origin master
這時(shí)就會將我們修改的test.txt文件上傳到遠(yuǎn)程庫中垛孔,就是放在網(wǎng)上了
注意一定先add然后commit最后在git push…? 少一步都不可以藕甩。
一個(gè)電腦要如何去嘗試多人合作的實(shí)戰(zhàn),首先先創(chuàng)建另外一個(gè)文件目錄test
1周荐、cd test?進(jìn)入到test文件那文檔操作
2狭莱、就會發(fā)現(xiàn)出現(xiàn)了這個(gè) ?? ~/test,說明已經(jīng)進(jìn)入test文件中
3概作、然后我們用命令git clone?git@github.com:mangoyi/learngit.git
這樣我們就可以clone一份learngit庫到我們的test文件中腋妙,
4、cd learngit?用這個(gè)命令進(jìn)入到master分支
這樣便可以操作了也就是說在我們test文件里面的learngit也和遠(yuǎn)程庫連接在了一起讯榕,我們就可以通過修改test.txt然后push到遠(yuǎn)程庫中骤素,但是注意我們現(xiàn)在的操作是在test 文件夾里面的leargit文件中,和test同一級目錄里面還有一個(gè)我們learngit文件愚屁。
在這里我們要知道我們現(xiàn)在是在master分支济竹,而我們模擬的是想在dev分支上開發(fā),所以就必須遠(yuǎn)程創(chuàng)建origin的dev分支到本地霎槐,
一送浊、于是我們用命令
git checkout –b dev origin/dev會報(bào)錯(cuò)
解決方法:http://blog.csdn.net/weichuang_1/article/details/48437911
//我們來創(chuàng)建一個(gè)新的本地分支dev
git checkout –b dev? ? ?
//重置它的起始點(diǎn)
git reset –hard origin/dev????????
// origin/dev意味著origin索引的遠(yuǎn)程倉庫有dev分支
/*也就是理解成如果原創(chuàng)倉庫中沒有origin/dev這個(gè)分支的話,
你只需要創(chuàng)建一個(gè)本地分支dev丘跌,然后將它推送到遠(yuǎn)程倉庫
*/
git push –u origin dev
//這樣本地的分支dev和原創(chuàng)跟中的分支origin/dev之間建立一個(gè)聯(lián)系
到這里一的問題已經(jīng)解決了袭景。
二、現(xiàn)在我們在dev分支上創(chuàng)建一個(gè)文件hello.py
在hello.py上添加內(nèi)容
??? print('helloworld')
我們將dev分支上
通過命令git add hello.py
?????? ? git commit –m ‘a(chǎn)ddtest/learngit/hello.py’
git push origindev??? //推送到遠(yuǎn)程庫分支
(相當(dāng)于一個(gè)小伙伴)另外一個(gè)目錄下的分支已經(jīng)推送了他的提交闭树。
推送完在我的github上面可以看到dev分支的推送內(nèi)容
補(bǔ)充一下:此時(shí)你在的路徑是
你需要返回上一級命令cd .. (cd和后面的.. 之間有一個(gè)空格)
一直退到這里耸棒,在cd learngit到達(dá)我們自己的倉庫master分支
這個(gè)時(shí)候已經(jīng)不是在模擬你的小伙伴了而是你自己,
你用你自己的電腦你自己的leargit庫报辱。
1榆纽、在這個(gè)庫創(chuàng)建一個(gè)dev分支,并且分支里面添加hello.py文件
2、在這里我們
??? git add hello.py
??? git commit –m ‘a(chǎn)dd utf-8’
git push origin dev?? //將本地倉庫dev分支推到遠(yuǎn)程倉庫的dev
發(fā)現(xiàn)推送失斈巫选:因?yàn)槟愕哪M推送(相當(dāng)于你的小伙伴)的最新提交和你試圖推送的提交有沖突,git提示我們鸵赫,先用pit pull 把最新的提交從origin/dev抓下來衣屏,解決沖突在推送
3、我們使用命令git pull
git pull也失敗了辩棒,原因是沒有指定本地dev分支與遠(yuǎn)程origin/dev分支的鏈接狼忱,根據(jù)提示設(shè)置dev和origin/dev鏈接
4、使用git branch –-set-upstream devorigin/dev? 命令設(shè)置鏈接一睁。
5钻弄、再使用git pull??? 成功。(但是合并有沖突者吁,需要解決沖突在提交)
6窘俺、使用git status查看狀態(tài)
在使用命令vi hello.py進(jìn)行修改,解決沖突
使用vi hello.py命令之后出現(xiàn)下圖复凳,圖中不小心添加了一些字段瘤泪,本來是沒有的因?yàn)槭终`才有,但是不影響我們這個(gè)例子育八。
7对途、命令 git add hello.py
??????? git commit –m ‘merge and fix hello.py’
git push origindev???? //推送分支到遠(yuǎn)程庫
推送成功,再次去刷新自己github頁面髓棋,這也就完成了你和小伙伴的協(xié)作
標(biāo)簽管理:
發(fā)布一個(gè)版本時(shí)实檀,就唯一確定了打標(biāo)簽時(shí)刻的版本,標(biāo)簽是版本庫的一個(gè)快照按声。tag就是一個(gè)讓人容易記住有意義的名字膳犹,它跟著某個(gè)commit綁在一起
……..
使用GitHub
GitHub作為免費(fèi)的遠(yuǎn)程倉庫,如果是個(gè)人的開源項(xiàng)目儒喊,放到GitHub是完全沒有問題的镣奋。GitHub也是一個(gè)開源協(xié)作社區(qū),通過GitHub怀愧,既可以讓別人參與尼的開源項(xiàng)目侨颈,也可以參與別人的開源項(xiàng)目
常見錯(cuò)誤解決
3.1如果輸入$ git remote add origin git@github.com:xxx(github帳號名)/xxx(項(xiàng)目名).git
提示出錯(cuò)信息:fatal: remote origin already exists.
解決辦法如下:
1、先輸入$ git remote rm origin
2芯义、再輸入$ git remote add origin git@github.com:djqiang/gitdemo.git 就不會報(bào)錯(cuò)了哈垢!
3、如果輸入$ git remote rm origin 還是報(bào)錯(cuò)的話扛拨,error: Could not remove config section 'remote.origin'. 我們需要修改gitconfig文件的內(nèi)容
4耘分、找到你的github的安裝路徑,我的是C:\Users\ASUS\AppData\Local\GitHub\PortableGit_ca477551eeb4aea0e4ae9fcd3358bd96720bb5c8\etc
5、找到一個(gè)名為gitconfig的文件求泰,打開它把里面的[remote "origin"]那一行刪掉就好了央渣!
3.2如果輸入$ git push origin master
提示出錯(cuò)信息:error:failed to push som refs to .......(此時(shí)說明需要先pull,再push)
解決辦法如下:
1、先輸入$ git pull origin master //先把遠(yuǎn)程服務(wù)器github上面的文件拉下來
2渴频、再輸入$ git push origin master
3芽丹、如果出現(xiàn)報(bào)錯(cuò) fatal: Couldn't find remote ref master或者fatal: 'origin' does not appear to be a git repository以及fatal: Could not read from remote repository.
4榄融、則需要重新輸入$ git remote add origin git@github.com:xxx/xxx.git(如果還有問題尾菇,參看前面)
Linux命令:
[if !supportLists]1.?[endif]ls查看文件
[if !supportLists]2.?[endif]pwd??顯示當(dāng)前的工作目錄
[if !supportLists]3.?[endif]cd?進(jìn)入目錄
???[例子]:?cd回到注冊進(jìn)入時(shí)的目錄?cd?/tmp進(jìn)入?/tmp?目錄?cd?../進(jìn)入上級目錄?
[if !supportLists]4.?[endif]mkdir創(chuàng)建目錄
5.?rmdir??刪除目錄
6.?cat顯示文件至標(biāo)準(zhǔn)輸出
7.cp拷貝
?????[例子]:?cp?file1?file2將文件?file1?拷貝到文件?file2?8.?mv移動
?????-?i在覆蓋已存在文件時(shí)作提示,若回答?y?則覆蓋艾疟,其他則中止
[例子]:?
mv?file1?file2將文件?file1?改名為?file2?mv?file1?file2?/tmp將文件?file1?和文件?file2?移動到目錄?/tmp?下
9.?touch創(chuàng)建文件
10.vi編輯
i 插入編輯內(nèi)容
esc退出編輯
:wq保存并退出