1.git的安裝
1.1 在Windows上安裝Git
msysgit是Windows版的Git,從https://git-for-windows.github.io下載(網(wǎng)速慢的同學(xué)請(qǐng)移步國內(nèi)鏡像),然后按默認(rèn)選項(xiàng)安裝即可钉迷。
安裝完成后惯殊,在開始菜單里找到“Git”->“Git Bash”,蹦出一個(gè)類似命令行窗口的東西,就說明Git安裝成功馒疹!
安裝完成后谬泌,還需要最后一步設(shè)置滔韵,設(shè)置自己的用戶名和郵箱,在命令行輸入:
$ git config --global user.name "Your Name" (設(shè)置用戶名)
$ git config --global user.email "email@example.com" (設(shè)置常用郵箱掌实,最好與guihub用的郵箱一致)
因?yàn)镚it是分布式版本控制系統(tǒng)陪蜻,所以,每個(gè)機(jī)器都必須自報(bào)家門:你的名字和Email地址贱鼻。
注意git config
命令的--global
參數(shù)宴卖,用了這個(gè)參數(shù),表示你這臺(tái)機(jī)器上所有的Git倉庫都會(huì)使用這個(gè)配置邻悬,當(dāng)然也可以對(duì)某個(gè)倉庫指定不同的用戶名和Email地址症昏。
1.2 在Mac OS X上安裝Git
如果你正在使用Mac做開發(fā),有兩種安裝Git的方法父丰。
一是安裝homebrew肝谭,然后通過homebrew安裝Git,具體方法請(qǐng)參考homebrew的文檔:http://brew.sh/蛾扇。
第二種方法更簡單攘烛,也是推薦的方法,就是直接從AppStore安裝Xcode镀首,Xcode集成了Git医寿,不過默認(rèn)沒有安裝,你需要運(yùn)行Xcode蘑斧,選擇菜單“Xcode”->“Preferences”靖秩,在彈出窗口中找到“Downloads”须眷,選擇“Command Line Tools”,點(diǎn)“Install”就可以完成安裝了沟突。
Xcode是Apple官方IDE花颗,功能非常強(qiáng)大,是開發(fā)Mac和iOS App的必選裝備惠拭,而且是免費(fèi)的扩劝!
2.創(chuàng)建版本庫
2.1版本庫
版本庫又名倉庫,英文名repository,你可以簡單的理解一個(gè)目錄职辅,這個(gè)目錄里面的所有文件都可以被Git管理起來棒呛,每個(gè)文件的修改,刪除域携,Git都能跟蹤簇秒,以便任何時(shí)刻都可以追蹤歷史,或者在將來某個(gè)時(shí)刻還可以將文件”還原”秀鞭。所以創(chuàng)建一個(gè)版本庫也非常簡單趋观,如下我是E盤 目錄下新建一個(gè)testgit版本庫。
$ cd E:(找到E盤)
$ cd www(假如在www文件夾下)
$ mkdir testgit(新建名叫testgit的文件夾)
$ cd testgit(找到testgit文件夾)
$ pwd (顯示當(dāng)前目錄)
/e/testgit
pwd命令用于顯示當(dāng)前目錄锋边。在我的電腦上皱坛,這個(gè)倉庫位于/e/testgit
如果你使用Windows系統(tǒng),為了避免遇到各種莫名其妙的問題豆巨,請(qǐng)確保目錄名(包括父目錄)不包含中文剩辟。
第二步,通過git init命令把這個(gè)目錄變成Git可以管理的倉庫:
$ git init
Initialized empty Git repository in E:/testgit/.git/
瞬間Git就把倉庫建好了往扔,而且告訴你是一個(gè)空的倉庫(empty Git repository)贩猎,細(xì)心的讀者可以發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè).git的目錄,這個(gè)目錄是Git來跟蹤管理版本庫的瓤球,沒事千萬不要手動(dòng)修改這個(gè)目錄里面的文件融欧,不然改亂了,就把Git倉庫給破壞了卦羡。
如果你沒有看到.git目錄噪馏,那是因?yàn)檫@個(gè)目錄默認(rèn)是隱藏的,用ls -ah
命令就可以看見绿饵。
也不一定必須在空目錄下創(chuàng)建Git倉庫欠肾,選擇一個(gè)已經(jīng)有東西的目錄也是可以的。不過拟赊,不建議你使用自己正在開發(fā)的公司項(xiàng)目來學(xué)習(xí)Git刺桃,否則造成的一切后果概不負(fù)責(zé)。
以上全部步驟在git上操作如下圖:
電腦磁盤下的.git
2.2把文件添加到版本庫中吸祟。
首先這里再明確一下瑟慈,所有的版本控制系統(tǒng)桃移,其實(shí)只能跟蹤文本文件的改動(dòng),比如TXT文件葛碧,網(wǎng)頁借杰,所有的程序代碼等等,Git也不例外。版本控制系統(tǒng)可以告訴你每次的改動(dòng),比如在第5行加了一個(gè)單詞“Linux”踢京,在第8行刪了一個(gè)單詞“Windows”。而圖片鲸阔、視頻這些二進(jìn)制文件,雖然也能由版本控制系統(tǒng)管理,但沒法跟蹤文件的變化,只能把二進(jìn)制文件每次改動(dòng)串起來济蝉,也就是只知道圖片從100KB改成了120KB,但到底改了啥呻纹,版本控制系統(tǒng)不知道堆生,也沒法知道专缠。
不幸的是雷酪,Microsoft的Word格式是二進(jìn)制格式,因此涝婉,版本控制系統(tǒng)是沒法跟蹤Word文件的改動(dòng)的哥力,前面我們舉的例子只是為了演示,如果要真正使用版本控制系統(tǒng)墩弯,就要以純文本方式編寫文件吩跋。
因?yàn)槲谋臼怯芯幋a的,比如中文有常用的GBK編碼渔工,日文有Shift_JIS編碼锌钮,如果沒有歷史遺留問題,強(qiáng)烈建議使用標(biāo)準(zhǔn)的UTF-8編碼引矩,所有語言使用同一種編碼梁丘,既沒有沖突,又被所有平臺(tái)所支持旺韭。
演示demo:
我在版本庫testgit目錄下新建一個(gè)記事本文件 readme.txt 內(nèi)容如下:Git is a version control system.
一定要放到testgit目錄下(子目錄也行)氛谜,因?yàn)檫@是一個(gè)Git倉庫,放到其他地方Git再厲害也找不到這個(gè)文件区端。
第一步值漫,用命令git add
告訴Git,把文件添加到倉庫:
$ git add readme.txt
執(zhí)行上面的命令织盼,沒有任何顯示杨何,這就對(duì)了酱塔,Unix的哲學(xué)是“沒有消息就是好消息”,說明添加成功危虱。
第二步延旧,用命令git commit
告訴Git,把文件提交到倉庫:
$ git commit -m "wrote a readme file" [master (root-commit) cb926e7] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt
如下圖:
簡單解釋一下git commit
命令槽地,-m
后面輸入的是本次提交的說明迁沫,可以輸入任意內(nèi)容,當(dāng)然最好是有意義的捌蚊,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄集畅。
嫌麻煩不想輸入-m "xxx"行不行?確實(shí)有辦法可以這么干缅糟,但是強(qiáng)烈不建議你這么干挺智,因?yàn)檩斎胝f明對(duì)自己對(duì)別人閱讀都很重要。實(shí)在不想輸入說明的童鞋請(qǐng)自行Google窗宦,我不告訴你這個(gè)參數(shù)赦颇。
git commit
命令執(zhí)行成功后會(huì)告訴你,1個(gè)文件被改動(dòng)(我們新添加的readme.txt文件)赴涵,插入了兩行內(nèi)容(readme.txt有兩行內(nèi)容)媒怯。
為什么Git添加文件需要add,commit一共兩步呢髓窜?因?yàn)閏ommit可以一次提交很多文件扇苞,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
小結(jié):
初始化一個(gè)Git倉庫寄纵,使用git init命令鳖敷。
添加文件到Git倉庫,分兩步:
第一步程拭,使用命令git add <file>
定踱,注意,可反復(fù)多次使用恃鞋,添加多個(gè)文件崖媚;
第二步,使用命令git commit
山宾,完成至扰。
現(xiàn)在我們已經(jīng)提交了一個(gè)readme.txt文件了,我們下面可以通過命令git status
來查看是否還有文件未提交资锰,如下:
說明沒有任何文件未提交敢课,但是我現(xiàn)在繼續(xù)來改下readme.txt內(nèi)容,比如我在下面添加一行123456內(nèi)容,繼續(xù)使用
git status
來查看下結(jié)果直秆,如下:上面的命令告訴我們 readme.txt文件已被修改濒募,但是未被提交的修改。
接下來我想看下readme.txt文件到底改了什么內(nèi)容圾结,如何查看呢瑰剃?可以使用如下命令:
git diff
readme.txt 如下:
git diff顧名思義就是查看difference,顯示的格式正是Unix通用的diff格式.
如上可以看到筝野,readme.txt文件內(nèi)容從兩行Git is a version control system.Git is free software.改成 二行 添加了一行123456內(nèi)容晌姚。
知道了對(duì)readme.txt文件做了什么修改后,我們可以放心的提交到倉庫了歇竟,提交修改和提交文件是一樣的2步(第一步是git add 第二步是:git commit挥唠。)
小結(jié):
要隨時(shí)掌握工作區(qū)的狀態(tài),使用git status
命令焕议。
如果git status
告訴你有文件被修改過宝磨,用git diff
可以查看修改內(nèi)容。
3.操作追蹤
3.1 版本回退
如上盅安,我們已經(jīng)學(xué)會(huì)了修改文件唤锉,現(xiàn)在我繼續(xù)對(duì)readme.txt文件進(jìn)行修改,再修改一次內(nèi)容為:
Git is a distributed version control system.
Git is free software distributed under the GPL.
繼續(xù)執(zhí)行命令如下:
$ git add readme.txt
$ git commit -m "append GPL"
[master 3628164] append GPL
1 file changed, 1 insertion(+), 1 deletion(-)
不斷對(duì)文件進(jìn)行修改别瞭,然后不斷提交修改到版本庫里窿祥,每當(dāng)你覺得文件修改到一定程度的時(shí)候,就可以“保存一個(gè)快照”畜隶,這個(gè)快照在Git中被稱為commit壁肋。一旦你把文件改亂了号胚,或者誤刪了文件籽慢,還可以從最近的一個(gè)commit恢復(fù),然后繼續(xù)工作猫胁,而不是把幾個(gè)月的工作成果全部丟失箱亿。
現(xiàn)在我已經(jīng)對(duì)readme.txt文件做了三次修改了,那么我現(xiàn)在想查看下歷史記錄弃秆,如何查呢届惋?我們現(xiàn)在可以使用命令 git log
演示如下所示:
git log
命令顯示從最近到最遠(yuǎn)的提交日志,我們可以看到2次提交菠赚,最近的一次是append GPL脑豹,最早的一次是wrote a readme file。.如果嫌上面顯示的信息太多的話衡查,我們可以使用命令 git log –pretty=oneline
演示如下:需要友情提示的是瘩欺,你看到的一大串類似3628164...882e1e0的是commit id(版本號(hào)),和SVN不一樣,Git的commit id不是1俱饿,2歌粥,3……遞增的數(shù)字,而是一個(gè)SHA1計(jì)算出來的一個(gè)非常大的數(shù)字拍埠,用十六進(jìn)制表示失驶,而且你看到的commit id和我的肯定不一樣,以你自己的為準(zhǔn)枣购。為什么commit id需要用這么一大串?dāng)?shù)字表示呢嬉探?因?yàn)镚it是分布式的版本控制系統(tǒng),后面我們還要研究多人在同一個(gè)版本庫里工作棉圈,如果大家都用1甲馋,2,3……作為版本號(hào)迄损,那肯定就沖突了定躏。
現(xiàn)在我想使用版本回退操作,我想把當(dāng)前的版本回退到上一個(gè)版本芹敌,要使用什么命令呢痊远?可以使用如下2種命令,第一種是:git reset –hard HEAD^
那么如果要回退到上上個(gè)版本只需把HEAD^
改成 HEAD^^
以此類推氏捞。那如果要回退到前100個(gè)版本的話碧聪,使用上面的方法肯定不方便,我們可以使用下面的簡便命令操作:git reset –hard HEAD~100
即可液茎。
未回退之前的readme.txt內(nèi)容如下:
如果想回退到上一個(gè)版本就可以使用git reset
命令:
$ git reset --hard HEAD^
再來查看下 readme.txt內(nèi)容逞姿,通過命令cat readme.txt
查看
最后我們用git log
再看看現(xiàn)在版本庫的狀態(tài)。
現(xiàn)在我想回退到最新的版本:只要上面的命令行窗口還沒有被關(guān)掉捆等,你就可以順著往上找啊找啊滞造,找到那個(gè)append GPL的commit id是fc632000db...,于是就可以指定回到未來的某個(gè)版本:
$ git reset --hard fc632000db
HEAD is now at fc632000db append GPL
版本號(hào)沒必要寫全栋烤,前幾位就可以了谒养,Git會(huì)自動(dòng)去找。當(dāng)然也不能只寫前一兩位明郭,因?yàn)镚it可能會(huì)找到多個(gè)版本號(hào)买窟,就無法確定是哪一個(gè)了。
再看看readme.txt的內(nèi)容:
果然薯定,我胡漢三又回來了始绍。
Git的版本回退速度非常快话侄,因?yàn)镚it在內(nèi)部有個(gè)指向當(dāng)前版本的HEAD指針亏推,當(dāng)你回退版本的時(shí)候苛败,Git僅僅是把HEAD從指向append GPL.
假如我已經(jīng)關(guān)掉過一次命令行或者commit id內(nèi)容的版本號(hào)我并不知道呢?要如何知道commit id內(nèi)容的版本號(hào)呢径簿?可以通過如下命令即可獲取到版本號(hào):git reflog
演示如下:
git reflog
用來記錄你的每一次命令.
小結(jié):
HEAD指向的版本就是當(dāng)前版本罢屈,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭篇亭,使用命令git reset --hard commit_id缠捌。
穿梭前,用git log可以查看提交歷史译蒂,以便確定要回退到哪個(gè)版本曼月。
要重返未來,用git reflog查看命令歷史柔昼,以便確定要回到未來的哪個(gè)版本哑芹。
3.2 工作區(qū)與暫存區(qū)的區(qū)別
工作區(qū):就是你在電腦上看到的目錄,比如目錄下testgit里的文件(.git隱藏目錄版本庫除外)捕透〈献耍或者以后需要再新建的目錄文件等等都屬于工作區(qū)范疇。
版本庫(Repository):工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不屬于工作區(qū)乙嘀,這是版本庫末购。其中版本庫里面存了很多東西,其中最重要的就是stage(暫存區(qū))虎谢,還有Git為我們自動(dòng)創(chuàng)建了第一個(gè)分支master,以及指向master的一個(gè)指針HEAD盟榴。
我們前面說過使用Git提交文件到版本庫有兩步:
第一步:是使用 git add 把文件添加進(jìn)去,實(shí)際上就是把文件添加到暫存區(qū)婴噩。
第二步:使用git commit提交更改擎场,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支上。
因?yàn)槲覀儎?chuàng)建Git版本庫時(shí)几莽,Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支迅办,所以,現(xiàn)在银觅,git commit就是往master分支上提交更改礼饱。你可以簡單理解為,需要提交的文件修改通通放到暫存區(qū)究驴,然后,一次性提交暫存區(qū)的所有修改匀伏。
現(xiàn)在洒忧,我們?cè)倬毩?xí)一遍,先對(duì)readme.txt做個(gè)修改够颠,比如加上一行內(nèi)容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
接著在目錄下新建一個(gè)文件為test.txt 內(nèi)容為test
先用git status
查看一下狀態(tài):
Git非常清楚地告訴我們熙侍,readme.txt被修改了,而test還從來沒有被添加過,所以它的狀態(tài)是Untracked蛉抓。
現(xiàn)在我們先使用git add 命令把2個(gè)文件都添加到暫存區(qū)中庆尘,再使用git status來查看下狀態(tài),如下:
接著我們可以使用git commit
一次性提交到分支上巷送,如下:
小結(jié)
暫存區(qū)是Git非常重要的概念驶忌,弄明白了暫存區(qū),就弄明白了Git的很多操作到底干了什么笑跛。
沒弄明白暫存區(qū)是怎么回事的童鞋付魔,請(qǐng)向上滾動(dòng)頁面,再看一次飞蹂。
3.3 Git管理修改操作几苍。
Git比其他版本控制系統(tǒng)設(shè)計(jì)得優(yōu)秀,因?yàn)镚it跟蹤并管理的是修改陈哑,而非文件妻坝。什么是修改?比如你新增了一行惊窖,這就是一個(gè)修改惠勒,刪除了一行,也是一個(gè)修改爬坑,更改了某些字符纠屋,也是一個(gè)修改,刪了一些又加了一些盾计,也是一個(gè)修改售担,甚至創(chuàng)建一個(gè)新文件,也算一個(gè)修改署辉。
為什么說Git管理的是修改族铆,而不是文件呢?我們還是做實(shí)驗(yàn)哭尝。第一步哥攘,對(duì)readme.txt做一個(gè)修改,比如加一行內(nèi)容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.
查看readme.txt內(nèi)容:
然后材鹦,添加:
然后逝淹,再修改readme.txt:
提交后,然后查看狀態(tài):
我們回顧一下操作過程:
第一次修改 -> git add -> 第二次修改 -> git commit
你看桶唐,我們前面講了栅葡,Git管理的是修改,當(dāng)你用git add命令后尤泽,在工作區(qū)的第一次修改被放入暫存區(qū)欣簇,準(zhǔn)備提交规脸,但是,在工作區(qū)的第二次修改并沒有放入暫存區(qū)熊咽,所以莫鸭,git commit只負(fù)責(zé)把暫存區(qū)的修改提交了,也就是第一次的修改被提交了横殴,第二次的修改不會(huì)被提交被因。
提交后,用git diff HEAD -- readme.txt
命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別:
可見滥玷,第二次修改確實(shí)沒有被提交氏身。
那怎么提交第二次修改呢?你可以繼續(xù)git add
再git commit
惑畴,也可以別著急提交第一次修改蛋欣,先git add
第二次修改,再git commit
如贷,就相當(dāng)于把兩次修改合并后一塊提交了:
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
好陷虎,現(xiàn)在,把第二次修改提交了杠袱。
小結(jié):
現(xiàn)在尚猿,你又理解了Git是如何跟蹤修改的,每次修改楣富,如果不add到暫存區(qū)页眯,那就不會(huì)加入到commit中贵涵。
3.4 Git撤銷修改和刪除文件操作礁击。
3.4.1 撤銷修改
比如我現(xiàn)在在readme.txt文件里面增加一行 內(nèi)容為My stupid boss still prefers SVN.我們先通過命令查看如下:在準(zhǔn)備提交前迹恐,發(fā)現(xiàn)My stupid boss still prefers SVN這句話有錯(cuò)誤,想恢復(fù)上一個(gè)版本的狀態(tài)塘安,有如下幾種方法可以做修改:
如果我知道要?jiǎng)h掉那些內(nèi)容的話糠涛,直接手動(dòng)更改去掉那些需要的文件,然后add添加到暫存區(qū)兼犯,最后commit掉忍捡。
我可以按以前的方法直接恢復(fù)到上一個(gè)版本。使用
git reset –hard HEAD^
但是現(xiàn)在我不想使用上面的2種方法切黔,我想直接想使用撤銷命令該如何操作呢砸脊?首先在做撤銷之前,我們可以先用 git status
查看下當(dāng)前的狀態(tài)绕娘。如下所示:
可以發(fā)現(xiàn)脓规,Git會(huì)告訴你,git checkout — file 可以丟棄工作區(qū)的修改险领,如下命令:
git checkout — readme.txt
,如下所示:
命令 git checkout –readme.txt 意思就是侨舆,把readme.txt文件在工作區(qū)做的修改全部撤銷,這里有2種情況绢陌,如下:
readme.txt自動(dòng)修改后挨下,還沒有放到暫存區(qū),使用 撤銷修改就回到和版本庫一模一樣的狀態(tài)脐湾。
另外一種是readme.txt已經(jīng)放入暫存區(qū)了臭笆,接著又作了修改,撤銷修改就回到添加暫存區(qū)后的狀態(tài)秤掌。
假如你不但寫錯(cuò)了愁铺,還git add到暫存區(qū)了。
對(duì)于第二種情況闻鉴,我想我們繼續(xù)做demo來看下茵乱,假如現(xiàn)在我對(duì)readme.txt添加一行 內(nèi)容為My stupid boss still prefers SVN.,我git add 增加到暫存區(qū)后孟岛,接著添加內(nèi)容good jop see you瓶竭,我想通過撤銷命令讓其回到暫存區(qū)后的狀態(tài)。如下所示:
注意:命令git checkout -- readme.txt
中的--
很重要渠羞,如果沒有--
的話斤贰,那么命令變成創(chuàng)建分支了。
在commit之前次询。用git status查看一下荧恍,修改只是添加到了暫存區(qū),還沒有提交 ,并且Git還告訴我們屯吊,用命令git reset HEAD file
可以把暫存區(qū)的修改撤銷掉(unstage)送巡,重新放回工作區(qū):
git reset
命令既可以回退版本,也可以把暫存區(qū)的修改回退到工作區(qū)雌芽。當(dāng)我們用HEAD時(shí)授艰,表示最新的版本。
再用git status查看一下世落,現(xiàn)在暫存區(qū)是干凈的淮腾,工作區(qū)有修改:
下面,我們?cè)賮G棄工作區(qū)的修改:
現(xiàn)在屉佳,假設(shè)你不但改錯(cuò)了東西谷朝,還從暫存區(qū)提交到了版本庫,怎么辦呢武花?還記得版本回退一節(jié)嗎圆凰?可以回退到上一個(gè)版本。不過体箕,這是有條件的专钉,就是你還沒有把自己的本地版本庫推送到遠(yuǎn)程挑童。還記得Git是分布式版本控制系統(tǒng)嗎?我們后面會(huì)講到遠(yuǎn)程版本庫跃须,一旦你把“stupid boss”提交推送到遠(yuǎn)程版本庫站叼,你就真的慘了……
小結(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)程庫志秃。
3.4.2 刪除文件
假如我現(xiàn)在版本庫testgit目錄添加一個(gè)文件b.txt,然后提交怔球。如下:
如上:一般情況下,可以直接在文件目錄中把文件刪了浮还,或者使用如上rm命令:rm b.txt 竟坛,如果我想徹底從版本庫中刪掉了此文件的話,可以再執(zhí)行commit命令 提交掉钧舌,現(xiàn)在目錄是這樣的:
只要沒有commit之前担汤,如果我想在版本庫中恢復(fù)此文件如何操作呢?
可以使用如下命令 git checkout — b.txt洼冻,如下所示:
再來看看我們testgit目錄崭歧,添加了1個(gè)文件了。如下所示:
4. 遠(yuǎn)程倉庫
在了解之前撞牢,先注冊(cè)github賬號(hào)率碾,由于你的本地Git倉庫和github倉庫之間的傳輸是通過SSH加密的,所以需要一點(diǎn)設(shè)置:
第一步:創(chuàng)建SSH Key屋彪。在用戶主目錄下所宰,看看有沒有.ssh目錄,如果有畜挥,再看看這個(gè)目錄下有沒有id_rsa和id_rsa.pub這兩個(gè)文件仔粥,如果有的話,直接跳過此如下命令,如果沒有的話躯泰,打開命令行谭羔,輸入如下命令:
ssh-keygen -t rsa –C "youremail@example.com"
, 你需要把郵件地址換成你自己的郵件地址,并且必須要用雙引號(hào),不能用單引號(hào)斟冕。然后一路回車口糕,使用默認(rèn)值即可缅阳。由于我本地此前運(yùn)行過一次磕蛇,所以本地有,如下所示:
id_rsa是私鑰十办,不能泄露出去秀撇,id_rsa.pub是公鑰,可以放心地告訴任何人向族。
第二步:登錄github,打開” settings”中的SSH Keys頁面呵燕,然后點(diǎn)擊“Add SSH Key”,填上任意title,在Key文本框里黏貼id_rsa.pub文件的內(nèi)容件相。點(diǎn)擊 Add Key再扭,你就應(yīng)該可以看到已經(jīng)添加的key。
為什么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推送了骡送。確保你擁有一個(gè)GitHub賬號(hào)后,我們就即將開始遠(yuǎn)程倉庫的學(xué)習(xí)喷众。
4.1 添加遠(yuǎn)程倉庫
現(xiàn)在的情景是:我們已經(jīng)在本地創(chuàng)建了一個(gè)Git倉庫后各谚,又想在github創(chuàng)建一個(gè)Git倉庫,并且希望這兩個(gè)倉庫進(jìn)行遠(yuǎn)程同步到千,這樣github的倉庫可以作為備份昌渤,又可以其他人通過該倉庫來協(xié)作。
首先憔四,登錄github上膀息,然后在右上角找到“create a new repo”創(chuàng)建一個(gè)新的倉庫般眉。如下:
在Repository name填入testgit,其他保持默認(rèn)設(shè)置潜支,點(diǎn)擊“Create repository”按鈕甸赃,就成功地創(chuàng)建了一個(gè)新的Git倉庫(我的github被我漢化了,有興趣的可以關(guān)注我的github賬號(hào)冗酿,倉庫里有插件埠对,有安裝教程):
目前,在GitHub上的這個(gè)testgit倉庫還是空的裁替,GitHub告訴我們项玛,可以從這個(gè)倉庫克隆出新的倉庫,也可以把一個(gè)已有的本地倉庫與之關(guān)聯(lián)弱判,然后襟沮,把本地倉庫的內(nèi)容推送到GitHub倉庫。
現(xiàn)在昌腰,我們根據(jù)GitHub的提示开伏,在本地的testgit倉庫下運(yùn)行命令:
git remote add origin https://github.com/tugenhua0707/testgit.git
或者
$ git remote add origin git@github.com:michaelliao/learngit.git
所有的如下:
添加后,遠(yuǎn)程庫的名字就是origin遭商,這是Git默認(rèn)的叫法固灵,也可以改成別的,但是origin這個(gè)名字一看就知道是遠(yuǎn)程庫株婴。
下一步怎虫,就可以把本地庫的所有內(nèi)容推送到遠(yuǎn)程庫上:
報(bào)錯(cuò)解釋:git clone git://github.com/username/testgit.git 這是使用 git 協(xié)議。
git@github.com:username/testgit.git 這是使用 ssh 協(xié)議困介。ssh 會(huì)驗(yàn)證對(duì)方服務(wù)器的 key大审。它沒辦法確認(rèn)服務(wù)器出示的 key 是受信的,所以問你這個(gè) key 是不是真的是你要連接的那個(gè)服務(wù)器的座哩。你沒說「yes」所以 ssh 認(rèn)為你不想繼續(xù)連接徒扶,所以連接失敗。
把本地庫的內(nèi)容推送到遠(yuǎn)程根穷,用git push命令姜骡,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程。
由于遠(yuǎn)程庫是空的屿良,我們第一次推送master分支時(shí)圈澈,加上了 –u參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支尘惧,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來康栈,在以后的推送或者拉取時(shí)就可以簡化命令。推送成功后,可以立刻在github頁面中看到遠(yuǎn)程庫的內(nèi)容已經(jīng)和本地一模一樣了:
從現(xiàn)在起啥么,只要本地作了提交登舞,就可以通過命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub,現(xiàn)在悬荣,你就擁有了真正的分布式版本庫菠秒!
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的指紋信息是否真的來自GitHub的服務(wù)器,輸入yes回車即可囚戚。
Git會(huì)輸出一個(gè)警告酵熙,告訴你已經(jīng)把GitHub的Key添加到本機(jī)的一個(gè)信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
這個(gè)警告只會(huì)出現(xiàn)一次,后面的操作就不會(huì)有任何警告了驰坊。
如果你實(shí)在擔(dān)心有人冒充GitHub服務(wù)器,輸入yes前可以對(duì)照GitHub的RSA Key的指紋信息是否與SSH連接給出的一致哮独。
小結(jié)
要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫拳芙,使用命令git remote add origin git@server-name:path/repo-name.git;
關(guān)聯(lián)后皮璧,使用命令git push -u origin master
第一次推送master分支的所有內(nèi)容舟扎;
此后,每次本地提交后悴务,只要有必要睹限,就可以使用命令git push origin master
推送最新修改;
分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠(yuǎn)程庫的存在讯檐,也就是有沒有聯(lián)網(wǎng)都可以正常工作羡疗,而SVN在沒有聯(lián)網(wǎng)的時(shí)候是拒絕干活的!當(dāng)有網(wǎng)絡(luò)的時(shí)候别洪,再把本地提交推送一下就完成了同步叨恨,真是太方便了!
4.2 從遠(yuǎn)程庫克隆
上次我們講了先有本地庫挖垛,后有遠(yuǎn)程庫的時(shí)候痒钝,如何關(guān)聯(lián)遠(yuǎn)程庫。
現(xiàn)在痢毒,假設(shè)我們從零開發(fā)送矩,那么最好的方式是先創(chuàng)建遠(yuǎn)程庫,然后哪替,從遠(yuǎn)程庫克隆栋荸。
首先,登陸GitHub,創(chuàng)建一個(gè)新的倉庫蒸其,名字叫testgit2(注意:倉庫名是不能重名的):
我們勾選Initialize this repository with a README敏释,這樣GitHub會(huì)自動(dòng)為我們創(chuàng)建一個(gè)README.md文件。創(chuàng)建完畢后摸袁,可以看到README.md文件:
現(xiàn)在钥顽,遠(yuǎn)程庫已經(jīng)準(zhǔn)備好了,下一步是用命令git clone
克隆一個(gè)本地庫:
接著在我本地testgit目錄下 生成testgit2目錄了靠汁,如下所示:
如果有多個(gè)人協(xié)作開發(fā)蜂大,那么每個(gè)人各自從遠(yuǎn)程克隆一份就可以了。
你也許還注意到蝶怔,GitHub給出的地址不止一個(gè)奶浦,還可以用https://github.com/michaelliao/gitskills.git這樣的地址。實(shí)際上踢星,Git支持多種協(xié)議澳叉,默認(rèn)的git://使用ssh,但也可以使用https等其他協(xié)議沐悦。
使用https除了速度慢以外成洗,還有個(gè)最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http端口的公司內(nèi)部就無法使用ssh協(xié)議而只能用https藏否。
小結(jié):
要克隆一個(gè)倉庫瓶殃,首先必須知道倉庫的地址,然后使用git clone命令克隆副签。
Git支持多種協(xié)議遥椿,包括https,但通過ssh支持的原生git協(xié)議速度最快淆储。
5. 分支管理
5.1 創(chuàng)建與合并分支
在版本回填退里冠场,你已經(jīng)知道,每次提交遏考,Git都把它們串成一條時(shí)間線慈鸠,這條時(shí)間線就是一個(gè)分支。截止到目前灌具,只有一條時(shí)間線青团,在Git里,這個(gè)分支叫主分支咖楣,即master分支督笆。HEAD嚴(yán)格來說不是指向提交,而是指向master诱贿,master才是指向提交的娃肿,所以咕缎,HEAD指向的就是當(dāng)前分支。
首先料扰,我們來創(chuàng)建dev分支凭豪,然后切換到dev分支上。如下操作:
git checkout 命令加上 –b參數(shù)表示創(chuàng)建并切換晒杈,相當(dāng)于如下2條命令
git branch dev
git checkout dev
然后嫂伞,用git branch命令查看當(dāng)前分支,git branch命令會(huì)列出所有分支拯钻,當(dāng)前分支前面會(huì)標(biāo)一個(gè)*號(hào)帖努。
然后,我們就可以在dev分支上正常提交粪般,比如對(duì)readme.txt做個(gè)修改拼余,加上一行:Creating a new branch is quick.
首先我們先來查看下readme.txt內(nèi)容,接著添加內(nèi)容Creating a new branch is quick亩歹,如下:
現(xiàn)在dev分支工作已完成匙监,現(xiàn)在我們切換到主分支master上,繼續(xù)查看readme.txt內(nèi)容如下:
切換回master分支后捆憎,再查看一個(gè)readme.txt文件舅柜,剛才添加的內(nèi)容不見了!因?yàn)槟莻€(gè)提交是在dev分支上躲惰,而master分支此刻的提交點(diǎn)并沒有變:
現(xiàn)在,我們把dev分支的工作成果合并到master分支上变抽,使用如下命令 git merge dev
如下所示:
git merge
命令用于合并指定分支到當(dāng)前分支础拨。合并后,再查看readme.txt的內(nèi)容岂嗓,就可以看到悟狱,和dev分支的最新提交是完全一樣的要拂。
注意到上面的Fast-forward信息,Git告訴我們塔沃,這次合并是“快進(jìn)模式”,也就是直接把master指向dev的當(dāng)前提交阳谍,所以合并速度非持瘢快。
當(dāng)然矫夯,也不是每次合并都能Fast-forward鸽疾,我們后面會(huì)講其他方式的合并。
合并完成后训貌,就可以放心地刪除dev分支了,操作如下:
刪除后制肮,查看branch冒窍,就只剩下master分支了。
小結(jié):
查看分支:git branch
創(chuàng)建分支:git branch
切換分支:git checkout
創(chuàng)建+切換分支:git checkout -b
合并某分支到當(dāng)前分支:git merge
刪除分支:git branch -d
5.2 解決沖突
有時(shí)候合并分支并不會(huì)很順利豺鼻,會(huì)出現(xiàn)一些意外综液,下面我們先來創(chuàng)建一個(gè)新的分支叫做feature1,繼續(xù)我們的新分支開發(fā)儒飒,并在readme.txt添加一行內(nèi)容8888888谬莹,然后提交,如下所示:
同樣约素,我們現(xiàn)在切換到master分支上來届良,也在最后一行添加內(nèi)容,內(nèi)容為99999999圣猎,如下所示:
現(xiàn)在我們需要在master分支上來合并feature1士葫,如下操作:
果然沖突了!Git告訴我們送悔,readme.txt文件存在沖突慢显,必須手動(dòng)解決沖突后再提交。git status也可以告訴我們沖突的文件欠啤。
查看一下readme.txt文件:
Git用<<<<<<<荚藻,=======,>>>>>>>
標(biāo)記出不同分支的內(nèi)容洁段,其中<<<HEAD
是指主分支修改的內(nèi)容应狱,>>>>>feature1
是指feature1上修改的內(nèi)容,我們可以修改下如下后保存祠丝,然后再提交:
如果我想查看分支合并的情況的話疾呻,需要使用命令 git log.命令行演示如下:
小結(jié):
當(dāng)Git無法自動(dòng)合并分支時(shí),就必須首先解決沖突写半。解決沖突后岸蜗,再提交,合并完成叠蝇。
用git log --graph命令可以看到分支合并圖璃岳。
5.3 分支管理策略
通常合并分支時(shí),git一般使用”Fast forward”模式悔捶,在這種模式下铃慷,刪除分支后,會(huì)丟掉分支信息炎功,現(xiàn)在我們來使用帶參數(shù) –no-ff來禁用”Fast forward”模式枚冗。首先我們來做demo演示下,操作步驟如下:
- 創(chuàng)建一個(gè)dev分支蛇损。
- 修改readme.txt內(nèi)容赁温。
- 添加到暫存區(qū)坛怪。
- 切換回主分支(master)。
- 合并dev分支股囊,使用命令 git merge –no-ff -m “注釋” dev
- 查看歷史記錄
截圖如下:
因?yàn)楸敬魏喜⒁獎(jiǎng)?chuàng)建一個(gè)新的commit袜匿,所以加上-m參數(shù),把commit描述寫進(jìn)去稚疹【拥疲可以看到,不使用Fast forward模式内狗,merge后就像這樣:
分支策略:
在實(shí)際開發(fā)中怪嫌,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
首先,master分支應(yīng)該是非常穩(wěn)定的柳沙,也就是僅用來發(fā)布新版本岩灭,平時(shí)不能在上面干活;
那在哪干活呢赂鲤?干活都在dev分支上噪径,也就是說,dev分支是不穩(wěn)定的数初,到某個(gè)時(shí)候找爱,比如1.0版本發(fā)布時(shí),再把dev分支合并到master上泡孩,在master分支發(fā)布1.0版本车摄;
你和你的小伙伴們每個(gè)人都在dev分支上干活,每個(gè)人都有自己的分支仑鸥,時(shí)不時(shí)地往dev分支上合并就可以了练般。
所以,團(tuán)隊(duì)合作的分支看起來就像這樣:
小結(jié):
Git分支十分強(qiáng)大锈候,在團(tuán)隊(duì)開發(fā)中應(yīng)該充分應(yīng)用。
合并分支時(shí)敞贡,加上--no-ff參數(shù)就可以用普通模式合并泵琳,合并后的歷史有分支,能看出來曾經(jīng)做過合并誊役,而fast forward合并就看不出來曾經(jīng)做過合并获列。
5.4 bug分支
在開發(fā)中,會(huì)經(jīng)常碰到bug問題蛔垢,那么有了bug就需要修復(fù)击孩,在Git中,分支是很強(qiáng)大的鹏漆,每個(gè)bug都可以通過一個(gè)臨時(shí)分支來修復(fù)巩梢,修復(fù)完成后创泄,合并分支,然后將臨時(shí)的分支刪除掉括蝠。
比如我在開發(fā)中接到一個(gè)404 bug時(shí)候鞠抑,我們可以創(chuàng)建一個(gè)404分支來修復(fù)它,但是忌警,當(dāng)前的dev分支上的工作還沒有提交搁拙。比如如下:
并不是我不想提交,而是工作進(jìn)行到一半時(shí)候法绵,我們還無法提交箕速,比如我這個(gè)分支bug要2天完成,但是我issue-404 bug需要2個(gè)小時(shí)內(nèi)完成朋譬。怎么辦呢盐茎?還好,Git還提供了一個(gè)stash功能此熬,可以把當(dāng)前工作現(xiàn)場 ”隱藏起來”庭呜,等以后恢復(fù)現(xiàn)場后繼續(xù)工作。如下:
現(xiàn)在犀忱,用git status查看工作區(qū)募谎,就是干凈的(除非有沒有被Git管理的文件),因此可以放心地創(chuàng)建分支來修復(fù)bug∫趸悖現(xiàn)在我可以通過創(chuàng)建issue-404分支來修復(fù)bug了数冬。
首先我們要確定在那個(gè)分支上修復(fù)bug,假定需要在主分支master上來修復(fù)的搀庶,現(xiàn)在我要在master分支上創(chuàng)建一個(gè)臨時(shí)分支拐纱,演示如下:
bug修復(fù)完成后,切換到master分支上哥倔,并完成合并秸架,最后刪除issue-404分支。演示如下:
現(xiàn)在咆蒿,我們回到dev分支上干活了东抹。
工作區(qū)是干凈的,那么我們工作現(xiàn)場去哪里呢沃测?我們可以使用命令 git stash list
來查看下缭黔。如下:
工作現(xiàn)場還在,Git把stash內(nèi)容存在某個(gè)地方了蒂破,但是需要恢復(fù)一下馏谨,可以使用如下2個(gè)方法:
-
git stash apply
恢復(fù),恢復(fù)后附迷,stash內(nèi)容并不刪除惧互,你需要使用命令git stash drop
來刪除哎媚。 - 另一種方式是使用
git stash pop
,恢復(fù)的同時(shí)把stash內(nèi)容也刪除了。
演示如下:
你可以多次stash壹哺,恢復(fù)的時(shí)候抄伍,先用git stash list查看,然后恢復(fù)指定的stash管宵,用命令:
小結(jié):
修復(fù)bug時(shí)截珍,我們會(huì)通過創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并箩朴,最后刪除岗喉;
當(dāng)手頭工作沒有完成時(shí),先把工作現(xiàn)場git stash一下炸庞,然后去修復(fù)bug钱床,修復(fù)后,再git stash pop
埠居,回到工作現(xiàn)場查牌。
5.5 Feature分支
軟件開發(fā)中,總有無窮無盡的新的功能要不斷添加進(jìn)來滥壕。
添加一個(gè)新功能時(shí)纸颜,你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支搞亂了绎橘,所以胁孙,每添加一個(gè)新功能,最好新建一個(gè)feature分支称鳞,在上面開發(fā)涮较,完成后,合并冈止,最后狂票,刪除該feature分支。
現(xiàn)在熙暴,開始一個(gè)新任務(wù):開發(fā)代號(hào)為Vulcan的新功能苫亦。開始開發(fā):
切回dev,準(zhǔn)備合并:一切順利的話怨咪,feature分支和bug分支是類似的,合并润匙,然后刪除诗眨。
但是,就在此時(shí)孕讳,接到上級(jí)命令匠楚,因經(jīng)費(fèi)不足巍膘,新功能必須取消!
雖然白干了芋簿,但是這個(gè)分支還是必須就地銷毀:
銷毀失敗峡懈。Git友情提醒,feature-vulcan分支還沒有被合并与斤,如果刪除肪康,將丟失掉修改,如果要強(qiáng)行刪除撩穿,需要使用命令git branch -D feature-vulcan磷支。
現(xiàn)在我們強(qiáng)行刪除:
小結(jié):
開發(fā)一個(gè)新feature,最好新建一個(gè)分支食寡;
如果要丟棄一個(gè)沒有被合并過的分支雾狈,可以通過git branch -D <name>
強(qiáng)行刪除。
5.6 多人協(xié)作
當(dāng)你從遠(yuǎn)程庫克隆時(shí)候抵皱,實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對(duì)應(yīng)起來了善榛,并且遠(yuǎn)程庫的默認(rèn)名稱是origin。
要查看遠(yuǎn)程庫的信息 使用 git remote
要查看遠(yuǎn)程庫的詳細(xì)信息 使用 git remote –v
如下演示:
5.6.1 推送分支
推送分支呻畸,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫移盆。推送時(shí),要指定本地分支擂错,這樣味滞,Git就會(huì)把該分支推送到遠(yuǎn)程庫對(duì)應(yīng)的遠(yuǎn)程分支上:使用命令 git push origin master
,如果要推送其他分支,比如dev钮呀,就改成: git push origin dev
但是剑鞍,并不是一定要把本地分支往遠(yuǎn)程推送,那么爽醋,哪些分支需要推送蚁署,哪些不需要呢?
master分支是主分支蚂四,因此要時(shí)刻與遠(yuǎn)程同步光戈;
dev分支是開發(fā)分支,團(tuán)隊(duì)所有成員都需要在上面工作遂赠,所以也需要與遠(yuǎn)程同步久妆;
bug分支只用于在本地修復(fù)bug,就沒必要推到遠(yuǎn)程了跷睦,除非老板要看看你每周到底修復(fù)了幾個(gè)bug筷弦;
feature分支是否推到遠(yuǎn)程,取決于你是否和你的小伙伴合作在上面開發(fā)。
總之烂琴,就是在Git中爹殊,分支完全可以在本地自己藏著玩,是否推送奸绷,視你的心情而定梗夸!
比如我現(xiàn)在的github上的readme.txt代碼如下:
本地的readme.txt代碼如下:
現(xiàn)在我想把本地更新的readme.txt代碼推送到遠(yuǎn)程庫中,使用命令如下:
我們可以看到如上号醉,推送成功反症,我們可以繼續(xù)來截圖github上的readme.txt內(nèi)容 如下:
可以看到 推送成功了。
5.6.2 抓取分支
多人協(xié)作時(shí)扣癣,大家都會(huì)往master分支上推送各自的修改《杳保現(xiàn)在我們可以模擬另外一個(gè)同事,可以在另一臺(tái)電腦上(注意要把SSH key添加到github上)或者同一臺(tái)電腦上另外一個(gè)目錄克隆父虑,新建一個(gè)目錄名字叫testgit3
但是我首先要把dev分支也要推送到遠(yuǎn)程去该酗,如下:
接著進(jìn)入testgit3目錄,進(jìn)行克隆遠(yuǎn)程的庫到本地來士嚎,如下:
現(xiàn)在目錄下生成有如下所示:
現(xiàn)在我們的小伙伴要在dev分支上做開發(fā)呜魄,就必須創(chuàng)建遠(yuǎn)程origin的dev分支到本地,于是可以使用命令創(chuàng)建本地dev分支:git checkout –b dev origin/dev
現(xiàn)在小伙伴們就可以在dev分支上做開發(fā)了莱衩,開發(fā)完成后把dev分支推送到遠(yuǎn)程庫爵嗅。
如下:
小伙伴們已經(jīng)向origin/dev分支上推送了提交,而我在我的目錄文件下也對(duì)同樣的文件同個(gè)地方作了修改笨蚁,也試圖推送到遠(yuǎn)程庫時(shí)睹晒,如下:
推送失敗,因?yàn)槲业男』锇榈淖钚绿峤缓臀以噲D推送的提交有沖突括细,解決辦法也很簡單伪很,Git已經(jīng)提示我們,先用git pull把最新的提交從origin/dev抓下來奋单,然后锉试,在本地合并,解決沖突览濒,再推送:
git pull也失敗了呆盖,原因是沒有指定本地dev分支與遠(yuǎn)程origin/dev分支的鏈接,根據(jù)提示贷笛,設(shè)置dev和origin/dev的鏈接:如下:
這回git pull成功应又,但是合并有沖突,需要手動(dòng)解決乏苦,解決的方法和分支管理中的解決沖突完全一樣丁频。解決后,提交,再push:
我們可以先來看看readme.txt內(nèi)容席里。
現(xiàn)在手動(dòng)已經(jīng)解決完了,我接在需要再提交拢驾,再push到遠(yuǎn)程庫里面去奖磁。如下所示:
因此,多人協(xié)作的工作模式通常是這樣:
首先繁疤,可以試圖用git push origin branch-name
推送自己的修改咖为;
如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新稠腊,需要先用git pull
試圖合并躁染;
如果合并有沖突,則解決沖突架忌,并在本地提交吞彤;
沒有沖突或者解決掉沖突后,再用git push origin branch-name
推送就能成功叹放!
如果git pull
提示“no tracking information”
饰恕,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream branch-name origin/branch-name井仰。
這就是多人協(xié)作的工作模式埋嵌,一旦熟悉了,就非常簡單俱恶。
小結(jié):
查看遠(yuǎn)程庫信息雹嗦,使用git remote -v
;
本地新建的分支如果不推送到遠(yuǎn)程合是,對(duì)其他人就是不可見的了罪;
從本地推送分支,使用git push origin branch-name
端仰,如果推送失敗捶惜,先用git pull
抓取遠(yuǎn)程的新提交;
在本地創(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
臀稚,如果有沖突吝岭,要先處理沖突。
6. 標(biāo)簽管理
發(fā)布一個(gè)版本時(shí),我們通常先在版本庫中打一個(gè)標(biāo)簽(tag)窜管,這樣散劫,就唯一確定了打標(biāo)簽時(shí)刻的版本。將來無論什么時(shí)候幕帆,取某個(gè)標(biāo)簽的版本获搏,就是把那個(gè)打標(biāo)簽的時(shí)刻的歷史版本取出來。所以失乾,標(biāo)簽也是版本庫的一個(gè)快照常熙。
Git的標(biāo)簽雖然是版本庫的快照,但其實(shí)它就是指向某個(gè)commit的指針(跟分支很像對(duì)不對(duì)碱茁?但是分支可以移動(dòng)裸卫,標(biāo)簽不能移動(dòng)),所以纽竣,創(chuàng)建和刪除標(biāo)簽都是瞬間完成的墓贿。
因?yàn)镚it的commit號(hào)太長,所以要引入tag退个。所以募壕,tag就是一個(gè)讓人容易記住的有意義的名字,它跟某個(gè)commit綁在一起语盈。
6.1 創(chuàng)建標(biāo)簽
在Git中打標(biāo)簽非常簡單舱馅,首先,切換到需要打標(biāo)簽的分支上刀荒,然后打一個(gè)新標(biāo)簽代嗤,演示如下:
默認(rèn)標(biāo)簽是打在最新提交的commit上的。有時(shí)候缠借,如果忘了打標(biāo)簽干毅,比如,現(xiàn)在已經(jīng)是周五了泼返,但應(yīng)該在周一打的標(biāo)簽沒有打硝逢,怎么辦?
方法是找到歷史提交的commit id绅喉,然后打上就可以了:
比方說要對(duì)add merge這次提交打標(biāo)簽渠鸽,它對(duì)應(yīng)的commit id是5ca7559妹笆,敲入命令:$ git tag v0.9 5ca7559驻呐,再用命令git tag查看標(biāo)簽:
注意冗懦,標(biāo)簽不是按時(shí)間順序列出搂擦,而是按字母排序的〗L樱可以用git show <tagname>
查看標(biāo)簽信息:
可以看到宽涌,v0.9確實(shí)打在add merge這次提交上褐鸥。
還可以創(chuàng)建帶有說明的標(biāo)簽,用-a指定標(biāo)簽名那婉,-m指定說明文字:
用命令
git show <tagname>
可以看到說明文字:小結(jié):
命令git tag <name>
用于新建一個(gè)標(biāo)簽板甘,默認(rèn)為HEAD,也可以指定一個(gè)commit id详炬;
git tag -a <tagname> -m "blablabla..."
可以指定標(biāo)簽信息虾啦;
git tag -s <tagname> -m "blablabla..."
可以用PGP簽名標(biāo)簽;
命令git tag
可以查看所有標(biāo)簽痕寓。
6.2 操作標(biāo)簽
如果標(biāo)簽打錯(cuò)了,也可以刪除:
因?yàn)閯?chuàng)建的標(biāo)簽都只存儲(chǔ)在本地蝇闭,不會(huì)自動(dòng)推送到遠(yuǎn)程呻率。所以,打錯(cuò)的標(biāo)簽可以在本地安全刪除呻引。
如果要推送某個(gè)標(biāo)簽到遠(yuǎn)程礼仗,使用命令git push origin <tagname>
:
或者,一次性推送全部尚未推送到遠(yuǎn)程的本地標(biāo)簽:
如果標(biāo)簽已經(jīng)推送到遠(yuǎn)程逻悠,要?jiǎng)h除遠(yuǎn)程標(biāo)簽就麻煩一點(diǎn)元践,先從本地刪除。然后童谒,從遠(yuǎn)程刪除单旁。刪除命令也是push,操作如下:
小結(jié):
命令git push origin <tagname>
可以推送一個(gè)本地標(biāo)簽饥伊;
命令git push origin --tags
可以推送全部未推送過的本地標(biāo)簽象浑;
命令git tag -d <tagname>
可以刪除一個(gè)本地標(biāo)簽;
命令git push origin :refs/tags/<tagname>
可以刪除一個(gè)遠(yuǎn)程標(biāo)簽琅豆。
最終總結(jié):
Git基本常用命令如下:
mkdir
: XX (創(chuàng)建一個(gè)空目錄 XX指目錄名)
pwd
: 顯示當(dāng)前目錄的路徑愉豺。
git init
把當(dāng)前的目錄變成可以管理的git倉庫,生成隱藏.git文件茫因。
git add XX
把xx文件添加到暫存區(qū)去蚪拦。
git commit –m “XX”
: 提交文件 –m 后面的是注釋。
git status
查看倉庫狀態(tài)
git diff XX
查看XX文件修改了那些內(nèi)容
git log
查看歷史記錄
git reset –hard HEAD^
或者 git reset –hard HEAD~
回退到上一個(gè)版本(如果想回退到100個(gè)版本冻押,使用git reset –hard HEAD~100 )
cat XX
查看XX文件內(nèi)容
git reflog
查看歷史記錄的版本號(hào)id
git checkout — XX
把XX文件在工作區(qū)的修改全部撤銷驰贷。
git rm XX
刪除XX文件
git remote add origin https://github.com/tugenhua0707/testgit 關(guān)聯(lián)一個(gè)遠(yuǎn)程庫
git push –u
(第一次要用-u 以后不需要) origin master 把當(dāng)前master分支推送到遠(yuǎn)程庫
git clone https://github.com/tugenhua0707/testgit 從遠(yuǎn)程庫中克隆
git checkout –b dev
創(chuàng)建dev分支 并切換到dev分支上
git branch
查看當(dāng)前所有的分支
git checkout master
切換回master分支
git merge dev
在當(dāng)前的分支上合并dev分支
git branch –d dev
刪除dev分支
git branch name
創(chuàng)建分支
git stash
把當(dāng)前的工作隱藏起來 等以后恢復(fù)現(xiàn)場后繼續(xù)工作
git stash list
查看所有被隱藏的文件列表
git stash apply
恢復(fù)被隱藏的文件,但是內(nèi)容不刪除
git stash drop
刪除文件
git stash pop
恢復(fù)文件的同時(shí) 也刪除文件
git remote
查看遠(yuǎn)程庫的信息
git remote –v
查看遠(yuǎn)程庫的詳細(xì)信息
git push origin master
Git會(huì)把master分支推送到遠(yuǎn)程庫對(duì)應(yīng)的遠(yuǎn)程分支上