Git簡介及使用說明

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,首先需要下載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保存并退出

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末场钉,一起剝皮案震驚了整個(gè)濱河市蚊俺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逛万,老刑警劉巖泳猬,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泣港,居然都是意外死亡暂殖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門当纱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呛每,“玉大人,你說我怎么就攤上這事坡氯〕亢幔” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵箫柳,是天一觀的道長手形。 經(jīng)常有香客問我,道長悯恍,這世上最難降的妖魔是什么库糠? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮涮毫,結(jié)果婚禮上瞬欧,老公的妹妹穿的比我還像新娘。我一直安慰自己罢防,他們只是感情好艘虎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咒吐,像睡著了一般野建。 火紅的嫁衣襯著肌膚如雪属划。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天候生,我揣著相機(jī)與錄音同眯,去河邊找鬼。 笑死唯鸭,一個(gè)胖子當(dāng)著我的面吹牛嗽测,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肿孵,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疏魏!你這毒婦竟也來了停做?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤大莫,失蹤者是張志新(化名)和其女友劉穎蛉腌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體只厘,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烙丛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了羔味。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片河咽。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赋元,靈堂內(nèi)的尸體忽然破棺而出忘蟹,到底是詐尸還是另有隱情,我是刑警寧澤搁凸,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布媚值,位于F島的核電站,受9級特大地震影響护糖,放射性物質(zhì)發(fā)生泄漏褥芒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一嫡良、第九天 我趴在偏房一處隱蔽的房頂上張望锰扶。 院中可真熱鬧,春花似錦皆刺、人聲如沸少辣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漓帅。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忙干,已是汗流浹背器予。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捐迫,地道東北人乾翔。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像施戴,于是被迫代替她去往敵國和親反浓。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Git 是目前最流行的分布式版本控制系統(tǒng)之一赞哗。 版本控制指的是雷则,記錄每次版本變更的內(nèi)容和時(shí)間等細(xì)節(jié),保留各版本之間...
    神齊閱讀 1,409評論 0 7
  • 還是老規(guī)矩肪笋,這篇看完后月劈,還是學(xué)不會git版本控制的,你來砍我 是兄弟就來砍我吧L僖摇2戮尽! Git是分布式版本控制系統(tǒng)坛梁,...
    Zteen閱讀 3,148評論 0 6
  • 轉(zhuǎn)載自:http://www.open-open.com/lib/view/open1414396787325.h...
    Bbooo閱讀 410評論 0 3
  • 原文地址主要用到的命令: git config user.name 設(shè)置用戶名 git config user....
    AFinalStone閱讀 465評論 0 2
  • 如何關(guān)聯(lián)遠(yuǎn)程庫而姐? 1.新建本地庫 2.通過git官網(wǎng)新建遠(yuǎn)程庫 3.輸入指令: git remote add or...
    諸子大人閱讀 16,416評論 1 9