轉(zhuǎn)載請注明出處:http://www.reibang.com/p/f11cdfbc18b5
如果你想了解更多關(guān)于GitHub使用的問題呕童,歡迎查看我的另一篇博客進(jìn)行學(xué)習(xí)與交流:
GitHub的使用詳解
一绑咱、Git簡介及分布式版本控制系統(tǒng)與集中式版本控制系統(tǒng)。
Git是一個(gè)開源的分布式版本控制系統(tǒng)诵肛,可以有效、高速的處理從很小到非常大的項(xiàng)目版本管理祟蚀。它是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個(gè)開放源碼的版本控制軟件水援。Git 是用于 Linux內(nèi)核開發(fā)的版本控制工具魄鸦。與常用的版本控制工具 CVS, Subversion 等不同宴杀,它采用了分布式版本庫的方式,不必服務(wù)器端軟件支持(這要分是用什么樣的服務(wù)端拾因,使用http協(xié)議或者git協(xié)議等不太一樣旺罢。并且在push和pull的時(shí)候和服務(wù)器端還是有交互的旷余。),使源代碼的發(fā)布和交流極其方便扁达。 Git 的速度很快正卧,這對于諸如 Linux kernel 這樣的大項(xiàng)目來說自然很重要。Git 最為出色的是它的合并跟蹤(merge tracing)能力跪解。
我們知道炉旷,CVS及SVN這些屬于集中式版本控制系統(tǒng)。而Git屬于分布式版本控制系統(tǒng)叉讥。
集中式版本控制系統(tǒng)窘行,版本庫是集中存放在中央服務(wù)器的,而干活的時(shí)候图仓,用的都是自己的電腦罐盔,所以要先從中央服務(wù)器取得最新的版本,然后開始干活救崔,干完活了惶看,再把自己的活推送給中央服務(wù)器。集中式版本控制系統(tǒng)最大的毛病就是必須聯(lián)網(wǎng)才能工作六孵,如果在局域網(wǎng)內(nèi)還好纬黎,帶寬夠大,速度夠快劫窒,可如果在互聯(lián)網(wǎng)上莹桅,遇到網(wǎng)速慢的話,可能提交一個(gè)10M的文件就需要5分鐘烛亦,這個(gè)體驗(yàn)就太差了诈泼。
那分布式版本控制系統(tǒng)與集中式版本控制系統(tǒng)有何不同呢?
首先煤禽,分布式版本控制系統(tǒng)根本沒有“中央服務(wù)器”铐达,每個(gè)人的電腦上都是一個(gè)完整的版本庫,這樣檬果,你工作的時(shí)候瓮孙,就不需要聯(lián)網(wǎng)了,因?yàn)榘姹編炀驮谀阕约旱碾娔X上选脊。既然每個(gè)人電腦上都有一個(gè)完整的版本庫杭抠,那多個(gè)人如何協(xié)作呢?比方說你在自己電腦上改了文件A恳啥,你的同事也在他的電腦上改了文件A偏灿,這時(shí),你們倆之間只需把各自的修改推送給對方钝的,就可以互相看到對方的修改了翁垂。
和集中式版本控制系統(tǒng)相比铆遭,分布式版本控制系統(tǒng)的安全性要高很多,因?yàn)槊總€(gè)人電腦里都有完整的版本庫沿猜,某一個(gè)人的電腦壞掉了不要緊枚荣,隨便從其他人那里復(fù)制一個(gè)就可以了。而集中式版本控制系統(tǒng)的中央服務(wù)器要是出了問題啼肩,所有人都沒法干活了橄妆。
二、Git的安裝與配置祈坠。
最早Git是在Linux上開發(fā)的呼畸,很長一段時(shí)間內(nèi),Git也只能在Linux和Unix系統(tǒng)上跑颁虐。不過蛮原,慢慢地有人把它移植到了Windows上。現(xiàn)在另绩,Git可以在Linux儒陨、Unix、Mac和Windows這幾大平臺上正常運(yùn)行了笋籽。
1.在Linux上安裝Git
首先蹦漠,你可以試著輸入git,看看系統(tǒng)有沒有安裝Git:
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
像上面的命令车海,有很多Linux會友好地告訴你Git沒有安裝笛园,還會告訴你如何安裝Git。
如果你碰巧用Debian或Ubuntu Linux侍芝,通過一條sudo apt-get install git就可以直接完成Git的安裝研铆,非常簡單。
老一點(diǎn)的Debian或Ubuntu Linux州叠,要把命令改為sudo apt-get install git-core棵红,因?yàn)橐郧坝袀€(gè)軟件也叫GIT(GNU Interactive Tools),結(jié)果Git就只能叫g(shù)it-core了咧栗。由于Git名氣實(shí)在太大逆甜,后來就把GNU Interactive Tools改成gnuit,git-core正式改為git致板。
如果是其他Linux版本交煞,可以直接通過源碼安裝。先從Git官網(wǎng)下載源碼斟或,然后解壓素征,依次輸入:./config,make,sudo make install這幾個(gè)命令安裝就好了稚茅。
2.在Mac OS X上安裝Git
如果你正在使用Mac做開發(fā),有兩種安裝Git的方法平斩。
一是安裝homebrew亚享,然后通過homebrew安裝Git,具體方法請參考homebrew的文檔:http://brew.sh/绘面。
第二種方法更簡單欺税,也是推薦的方法,就是直接從AppStore安裝Xcode揭璃,Xcode集成了Git晚凿,不過默認(rèn)沒有安裝,你需要運(yùn)行Xcode瘦馍,選擇菜單“Xcode”->“Preferences”歼秽,在彈出窗口中找到“Downloads”,選擇“Command Line Tools”情组,點(diǎn)“Install”就可以完成安裝了燥筷。
3.在Windows上安裝Git
在Windows上使用Git,可以從Git官網(wǎng)直接下載安裝程序院崇,(網(wǎng)速慢的同學(xué)請移步國內(nèi)鏡像肆氓,然后按默認(rèn)選項(xiàng)安裝即可。
安裝完成后底瓣,在開始菜單里找到“Git”->“Git Bash”(也可以右擊選擇Git Bash)谢揪,蹦出一個(gè)類似命令行窗口的東西,就說明Git安裝成功捐凭!
安裝完成后拨扶,還需要最后一步設(shè)置,在命令行輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因?yàn)镚it是分布式版本控制系統(tǒng)茁肠,所以屈雄,每個(gè)機(jī)器都必須自報(bào)家門:你的名字和Email地址。
注意git config命令的--global參數(shù)官套,用了這個(gè)參數(shù)酒奶,表示你這臺機(jī)器上所有的Git倉庫都會使用這個(gè)配置,當(dāng)然也可以對某個(gè)倉庫指定不同的用戶名和Email地址奶赔。
三惋嚎、將本地代碼提交到遠(yuǎn)程倉庫。
1.創(chuàng)建本地代碼庫站刑。
在項(xiàng)目目錄下打開Git Bash另伍,鍵入"git init"命令,會自動(dòng)生成一個(gè)".git"目錄,這代表你已經(jīng)創(chuàng)建成功摆尝。
2.創(chuàng)建遠(yuǎn)程倉庫温艇。
在GitLab上點(diǎn)擊"New Project",之后鍵入項(xiàng)目名堕汞,其它選項(xiàng)默認(rèn)即可勺爱,點(diǎn)擊"Create project"按鈕即可完成創(chuàng)建。
3.將本地倉庫連接推送到遠(yuǎn)程倉庫讯检。
在項(xiàng)目目錄下打開Git Bash琐鲁,鍵入"git remote add origin <遠(yuǎn)程倉庫地址/SSH>"命令。
4.將代碼提交到本地倉庫中人灼。
使用"git add ."命令添加所有文件围段,使用"git commit -m <提交日志信息>"命令將代碼提交到本地倉庫。
5.將代碼提交到遠(yuǎn)程倉庫投放。
鍵入"git push -u origin master"奈泪,這是第一次提交時(shí)用的命令,之后再提交的話使用簡化命令"git push"即可灸芳。
此時(shí)我們再去遠(yuǎn)程倉庫上刷新一下段磨,就能看到我們剛剛提交上去的文件了。
四耗绿、從遠(yuǎn)程倉庫克隆代碼到本地苹支。
先找到項(xiàng)目Git地址或SSH,如下圖误阻,點(diǎn)擊鏈接后面的復(fù)制按鈕:
我們新創(chuàng)建一個(gè)項(xiàng)目目錄债蜜,打開Git Bash,鍵入"git clone 遠(yuǎn)程倉庫地址/SSH"命令究反,回車寻定,就可以將項(xiàng)目克隆下來了。
五精耐、分支管理
1.創(chuàng)建分支狼速。
我們剛剛已經(jīng)將代碼提交到GitLab遠(yuǎn)程倉庫了,默認(rèn)的話會提交到項(xiàng)目的主干目錄卦停,如下圖向胡。這時(shí)候我們點(diǎn)擊項(xiàng)目名后面的加號,會出現(xiàn)下面的彈窗惊完,然后點(diǎn)擊New branch按鈕僵芹。
之后在下面的界面中輸入分支的名字,另外你可以選擇Create from的來源小槐,這會決定從哪個(gè)分支進(jìn)行創(chuàng)建拇派,我這里用了默認(rèn)的master主干目錄,點(diǎn)擊Create branch按鈕即可創(chuàng)建分支。
這時(shí)候再來看項(xiàng)目的分支目錄件豌,可以看到疮方,除了默認(rèn)的master主干目錄,現(xiàn)在多了一個(gè)version_1.1分支目錄茧彤,你也可以點(diǎn)進(jìn)去查看一下詳細(xì)信息骡显,該目錄的創(chuàng)建源是主干目錄,所以你會發(fā)現(xiàn)目錄中的內(nèi)容和master主干目錄完全一致棘街。
2.切換分支蟆盐。
創(chuàng)建完新的分支后承边,我們首先需要執(zhí)行"git pull"命令將變更內(nèi)容拉下來≡庋常現(xiàn)在我們已經(jīng)有master個(gè)version_1.1兩個(gè)分支了,目前我們本地倉庫是master主分支的博助,現(xiàn)在我們要切換到version_1.1分支险污,使用的是"git checkout 要切換的分支名"命令,如下圖富岳,可以看到蛔糯,我們成功從master分支切換到了version_1.1分支,當(dāng)然窖式,如果你想再切回主干分支蚁飒,則使用"git checkout master"命令,你可以去嘗試切換一下萝喘。
3.合并分支淮逻。
使用分支這個(gè)功能另外一個(gè)很重要的操作就是分支的合并,你可以任意將代碼從某一分支合并到另一分支阁簸,那么就讓我們一起來學(xué)習(xí)一下這部分內(nèi)容:
剛剛我們已經(jīng)切換到version_1.1分支了爬早,不妨就直接在這個(gè)分支中改動(dòng)一些內(nèi)容,然后將代碼合并到master分支启妹。
我在當(dāng)前分支目錄下的README.md文件中改動(dòng)了些內(nèi)容筛严,并增加了code3.txt文件,我們依次執(zhí)行"git add ."饶米、"git commit -m <提交日志>"桨啃、"git push"命令三部曲來將代碼提交到遠(yuǎn)程倉庫(相信這部分大家已經(jīng)很熟練了)。
此時(shí)我們再執(zhí)行"git checkout master"切換到主干目錄檬输,可以看到文件發(fā)生了一些變化:我剛剛的改動(dòng)都不見了优幸!這就代表你已經(jīng)成功切換到master目錄。
接下來就到關(guān)鍵的合并步驟了褪猛,使用"git merge 分支名"命令合并某分支到當(dāng)前分支:
可以看到网杆,本地代碼發(fā)生了變化,在version_1.1分支下的改動(dòng)都合并到了當(dāng)前的master主干目錄下。有一點(diǎn)你必須清楚的是碳却,改動(dòng)只是發(fā)生在了本地队秩,而本地倉庫和遠(yuǎn)程倉庫都沒有發(fā)生變化,此時(shí)你仍需要執(zhí)行命令三部曲"git add"昼浦、"git commit"馍资、"git push"來將合并后的代碼提交到遠(yuǎn)程倉庫。此時(shí)你可以發(fā)揮你舉一反三的能力了关噪,試著在主干目錄改動(dòng)代碼并將代碼合并到分支目錄吧鸟蟹。
六、GitLab配置SSH key使兔。
1.首先我們這里說明一下建钥,我們?yōu)槭裁匆褂肧SH協(xié)議呢?因?yàn)镾SH更加安全虐沥,然后更加方便熊经,比如我們的GitLab由http協(xié)議換成了https協(xié)議,那么如果你是使用http協(xié)議管理代碼欲险,那么需要修改所有的項(xiàng)目中的git地址變成https镐依,這簡直是太繁瑣了!但是如果我們一開始就是用SSH協(xié)議天试,這不需要任何的修改槐壳。
2.現(xiàn)在我們這是開始進(jìn)行配置,打開Git Bash窗口喜每,使用命令(ssh-keygen -t rsa -C 'xxx@xxx.com')生成SSH公鑰和私鑰對务唐,-C參數(shù)是你的郵箱,然后一路回車灼卢,使用默認(rèn)值即可绍哎。然后你就可以在用戶主目錄里找到.ssh目錄(比如Windows就是C:\Users\Administrator),里面有id_rsa和id_rsa.pub兩個(gè)文件鞋真,這兩個(gè)就是SSH KEY的秘鑰對崇堰,id_rsa是私鑰,不能泄漏出去涩咖,id_rsa.pub是公鑰海诲,可以放心地告訴任何人。
3.在GitLab中進(jìn)行SSH KEY的配置檩互√蒯#可參考下圖,將上一步中生成的id_rsa.pub文件中的內(nèi)容粘貼到Key的輸入框中闸昨,然后再自定義一下Title蚯斯,點(diǎn)擊"Add key"即可薄风。
4.相信現(xiàn)在你已經(jīng)配置好并可以正常使用了,這里在額外說明一下關(guān)于本地配置多個(gè)SSH KEY的問題拍嵌。想一下這樣的場景遭赂,大多數(shù)時(shí)候,我們的機(jī)器上會有很多的GIT HOST横辆,比如GitLab撇他、Github、OSChina等狈蚤,那我們就可能需要在本地配置多個(gè)SSH KEY困肩,使得不同的HOST能使用不同的SSH KEY。
當(dāng)然脆侮,其中一種解決方案就是所有的GIT HOST都使用同一個(gè)郵箱锌畸,由于郵箱是識別的唯一手段,那么自然的他嚷,這兩者采用同一個(gè)郵箱蹋绽,生成的public key也會是同一個(gè)芭毙,上傳到 Github 或者 Gitlab 上面筋蓖,在 Git 的配置中 ,設(shè)置好 Global 的配置 :git config --global user.name 'mythmayor' && git config --global user.email 'mythmayor@163.com' 進(jìn)行日常的開發(fā)是沒有問題的退敦。
但在實(shí)際開發(fā)中采用同一個(gè)郵箱的可能性并不是太大粘咖,這就引出了方案二,做法如下(以GitLab和Github為例):
(1)為GitLab生成一對秘鑰SSH KEY
ssh-keygen -t rsa -C 'yourEmail1@xxx.com' -f ~/.ssh/gitlab-rsa
(2)為Github生成一對秘鑰SSH KEY
ssh-keygen -t rsa -C 'yourEmail2@xxx.com' -f ~/..sh/github-rsa
(3)在~/.ssh目錄下新建名稱為config的文件(無后綴名)侈百。用于配置多個(gè)不同的host使用不同的SSH KEY瓮下,內(nèi)容如下:
# gitlab
Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitlab_id-rsa
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id-rsa
?
# 配置文件參數(shù)
# Host : Host可以看作是一個(gè)你要識別的模式,對識別的模式钝域,進(jìn)行配置對應(yīng)的的主機(jī)名和ssh文件
# HostName : 要登錄主機(jī)的主機(jī)名
# User : 登錄名
# IdentityFile : 指明上面User對應(yīng)的identityFile路徑
(4)按照上面的步驟分別往gitlab和github上添加生成的公鑰gitlab_id-rsa.pub和github_id-rsa.pub讽坏。
(5)OK,大功告成例证,再次執(zhí)行g(shù)it命令驗(yàn)證是不是已經(jīng)不需要再次驗(yàn)證權(quán)限了路呜。
(6)再次查看~/..ssh目錄下的文件,會有g(shù)itlab_id-rsa、gitlab_id-rsa.pub和github_id-rsa织咧、github_id-rsa.pub四個(gè)文件胀葱。
七、GitLab刪除項(xiàng)目笙蒙。
為什么要單獨(dú)提一下這個(gè)操作呢抵屿?因?yàn)閯h除項(xiàng)目的入口比較深,我第一次使用的時(shí)候也是找了一會才找到了刪除的操作捅位。
首先我們來到項(xiàng)目Settings的Genaral下轧葛,然后可以看到Advanced選項(xiàng)搂抒,點(diǎn)擊右面的Expand按鈕。
向下翻到最后尿扯,你會看到Remove project這一項(xiàng)
點(diǎn)擊Remove project按鈕燕耿,會出現(xiàn)下面的彈窗,這時(shí)候在輸入框中重新鍵入項(xiàng)目名(圖中標(biāo)紅框的名字)姜胖,填寫正確的話Confirm按鈕會變成可點(diǎn)擊的狀態(tài)誉帅,此時(shí)點(diǎn)擊按鈕即可刪除項(xiàng)目。
八右莱、個(gè)人Git常用命令蚜锨。
(ssh-keygen -t rsa -C 'xxx@xxx.com') 生成SSH公鑰和私鑰對
(git remote add origin <遠(yuǎn)程倉庫地址/SSH>) 將本地倉庫連接推送到遠(yuǎn)程倉庫
(git push -u origin master) 第一次提交代碼到遠(yuǎn)程倉庫
(git clone <遠(yuǎn)程倉庫地址/SSH>) 從遠(yuǎn)程倉庫克隆代碼
(git diff) 查看本地代碼差異
(git status) 查看本地代碼狀態(tài)
(git log) 查看提交歷史日志,后面加上--pretty=oneline會輸出簡化日志
(git reflog) 查看每一次命令記錄日志
(git add .) 添加代碼到本地倉庫
(git commit - m <提交信息>) 提交代碼到本地倉庫
(git push) 提交代碼到遠(yuǎn)程倉庫
(git pull) 從遠(yuǎn)程倉庫拉取代碼
(git branch) 查看分支
(git branch <分支名>) 創(chuàng)建分支
(git checkout -b <本地分支目錄> <origin/遠(yuǎn)程分支目錄>) 創(chuàng)建并切換到分支目錄
(git checkout <本地分支目錄>) 切換到分支目錄
(git checkout master) 切換到主干目錄
(git merge <分支名>) 合并某分支到當(dāng)前分支
(git cherry-pick <commit_id>) 合并某分支的某次提交到當(dāng)前分支
(git reset --hard <commit_id>) 版本穿梭慢蜓,HEAD指向當(dāng)前版本
(git branch -d <分支名>) 刪除分支
(git stash) 暫存本地修改
(git stash pop) 拉取暫存本地修改
(git stash clear) 清空暫存本地修改
(ls) 列出當(dāng)前目錄下的所有文件
九亚再、常見問題。
1.在合并時(shí)可能會報(bào)下面的錯(cuò)誤:Please enter a commit message to explain why this merge is necessary.
解決方案:
1.按鍵盤上的“i”鍵可進(jìn)入插入模式
2.這時(shí)可以修改最上方的黃色部分晨抡,改成你想寫的合并原因
3.按鍵盤上的“Esc”鍵退出插入模式
4.最后在最下面輸入":wq"后按回車鍵即可
2.Git在不提交本地修改的情況下拉取代碼氛悬。
解決防范:
1.使用(git stash)命令暫存本地修改。
2.使用(git pull)命令來拉取代碼耘柱。
3.使用(git stash pop)命令拉取緩存本地修改如捅,或者可以使用(git stash apply stash@{0})命令回到拉取之前的本地狀態(tài);此時(shí)若出現(xiàn)文件沖突调煎,酌情解決即可镜遣;至于是使用(git stash apply stash@{0})命令還是使用(git stash apply stash@{1})命令可以通過(git stash list)查看去確定。