選擇Git的原因
最近打算自己動(dòng)手寫點(diǎn)開(kāi)源項(xiàng)目,所以就需要有個(gè)代碼版本管理的工具衰伯,在公司上班使用的是SVN铡羡,SVN是集中式的版本控制,每個(gè)人代碼都要提交到服務(wù)器意鲸,離線時(shí)無(wú)法做代碼提交烦周,而Git是分布式的版本控制,可以建立本地分支临扮,而且更輕量級(jí)论矾,更貼近我的使用場(chǎng)景教翩,所以選擇了Git杆勇,關(guān)于SVN與Git的對(duì)比參見(jiàn)此文章。
Git獲取
Git是一款免費(fèi)開(kāi)源的分布式版本控制軟件饱亿,支持Windows蚜退、Linux/Unix、Mac OS X操作系統(tǒng)彪笼,以GPL Lv2.0開(kāi)源協(xié)議發(fā)布钻注。最初由Linux之父林納斯·托瓦茲(Linus Torvalds)創(chuàng)作,為了更好的管理Linux內(nèi)核開(kāi)發(fā)而設(shè)計(jì)配猫。在Git官網(wǎng)可獲取到安裝包幅恋。
Git常用命令
創(chuàng)建新倉(cāng)庫(kù)
非裸倉(cāng)庫(kù)
- 在
當(dāng)前目錄
創(chuàng)建一個(gè)本地倉(cāng)庫(kù)
(非裸倉(cāng)庫(kù))
git init
這個(gè)命令執(zhí)行后會(huì)在本地生成一個(gè) .git 的文件夾,用來(lái)追蹤倉(cāng)庫(kù)的所有變更泵肄。
- 指定某個(gè)目錄成為本地倉(cāng)庫(kù)
git init <repo>
執(zhí)行上面命令后捆交, 將創(chuàng)建一個(gè)名為repo的本地倉(cāng)庫(kù)
淑翼。
裸倉(cāng)庫(kù)
在指定目錄創(chuàng)建中心倉(cāng)庫(kù)
(裸倉(cāng)庫(kù))
git init --bare <repo>
使用 --bare
參數(shù)初始化的倉(cāng)庫(kù),我們一般稱之為裸倉(cāng)庫(kù)品追, 因?yàn)檫@樣創(chuàng)建的倉(cāng)庫(kù)并不包含 工作區(qū) 玄括, 也就是說(shuō),我們并不能在這個(gè)目錄下執(zhí)行我們一般使用的 Git 命令肉瓦。
差異
- 從
非裸倉(cāng)庫(kù)
clone下來(lái)的倉(cāng)庫(kù)無(wú)法進(jìn)行push操作遭京,所以非裸倉(cāng)庫(kù)一般作為本地倉(cāng)庫(kù)使用,你可以將非裸倉(cāng)庫(kù)理解為一個(gè)單機(jī)的文件版本管理系統(tǒng)泞莉。 -
裸倉(cāng)庫(kù)
沒(méi)有工作區(qū)哪雕,只能作為中心倉(cāng)庫(kù)使用,因?yàn)闆](méi)有工作區(qū)所以不能直接在裸倉(cāng)庫(kù)上創(chuàng)建和提交文件戒财,需要clone下來(lái)热监,再操作∫可以理解為聯(lián)機(jī)管理系統(tǒng)的中心服務(wù)器孝扛。
詳見(jiàn)文章【 Git 本地倉(cāng)庫(kù)和裸倉(cāng)庫(kù)】
檢出倉(cāng)庫(kù)
執(zhí)行如下命令以創(chuàng)建一個(gè)本地倉(cāng)庫(kù)的克隆版本:
git clone /path/to/repository
如果是遠(yuǎn)端服務(wù)器上的倉(cāng)庫(kù),你的命令會(huì)是這個(gè)樣子:
git clone username@host:/path/to/repository
你檢出的本地倉(cāng)庫(kù)由三部分組成:
- 工作區(qū): 你持有的實(shí)際文件
- 緩存區(qū): 臨時(shí)保存你的改動(dòng)
-
Head: 指向你最近一次提交后的結(jié)果
添加與提交
你可以計(jì)劃改動(dòng)(把它們添加到緩存區(qū))幽崩,使用如下命令:
git add <filename>
git add *
這是 git 基本工作流程的第一步苦始;使用如下命令以實(shí)際提交改動(dòng):
git commit -m "代碼提交信息"
現(xiàn)在,你的改動(dòng)已經(jīng)提交到了 HEAD
慌申,但是還沒(méi)到你的遠(yuǎn)端倉(cāng)庫(kù)
陌选。
推送改動(dòng)
你的改動(dòng)現(xiàn)在已經(jīng)在本地倉(cāng)庫(kù)的HEAD
中了。執(zhí)行如下命令以將這些改動(dòng)提交到遠(yuǎn)端倉(cāng)庫(kù):
git push origin master
可以把 master 換成你想要推送的任何分支蹄溉。
如果你還沒(méi)有克隆現(xiàn)有倉(cāng)庫(kù)咨油,并欲將你的倉(cāng)庫(kù)連接到某個(gè)遠(yuǎn)程服務(wù)器,你可以使用如下命令添加:
git remote add origin <server>
如此你就能夠?qū)⒛愕母膭?dòng)推送到所添加的服務(wù)器上去了柒爵。
創(chuàng)建分支
分支是用來(lái)將特性開(kāi)發(fā)絕緣開(kāi)來(lái)的役电。在你創(chuàng)建倉(cāng)庫(kù)的時(shí)候,master
是“默認(rèn)的”棉胀。在其他分支上進(jìn)行開(kāi)發(fā)法瑟,完成后再將它們合并到主分支上。
創(chuàng)建一個(gè)叫做“feature_x”的分支唁奢,并切換過(guò)去:
git checkout -b feature_x
切換回主分支:
git checkout master
再把新建的分支刪掉:
git branch -d feature_x
除非你將分支推送到遠(yuǎn)端倉(cāng)庫(kù)霎挟,不然該分支就是 不為他人所見(jiàn)的:
git push origin <branch>
更新與合并
要更新你的本地倉(cāng)庫(kù)至最新改動(dòng),執(zhí)行:
git pull
以在你的工作目錄中 獲嚷榈А(fetch
) 并 合并(merge
) 遠(yuǎn)端的改動(dòng)酥夭。
要合并其他分支到你的當(dāng)前分支(例如 master),執(zhí)行:
git merge <branch>
兩種情況下,git 都會(huì)嘗試去自動(dòng)合并改動(dòng)熬北。不幸的是千所,自動(dòng)合并并非次次都能成功藏姐,并可能導(dǎo)致 沖突(conflicts)唧瘾。 這時(shí)候就需要你修改這些文件來(lái)人肉合并這些 沖突(conflicts) 了吗铐。改完之后涡拘,你需要執(zhí)行如下命令以將它們標(biāo)記為合并成功:
git add <filename>
在合并改動(dòng)之前踏拜,也可以使用如下命令查看:
git diff <source_branch> <target_branch>
標(biāo)簽
在軟件發(fā)布時(shí)創(chuàng)建標(biāo)簽悲酷,是被推薦的拗踢。這是個(gè)舊有概念会钝,在 SVN 中也有烈评』鸲恚可以執(zhí)行如下命令以創(chuàng)建一個(gè)叫做 1.0.0
的標(biāo)簽:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要標(biāo)記的提交 ID 的前 10 位字符。使用如下命令獲取提交 ID:
git log
你也可以用該提交 ID 的少一些的前幾位讲冠,只要它是唯一的瓜客。
替換本地改動(dòng)
假如你做錯(cuò)事(自然,這是不可能的)竿开,你可以使用如下命令替換掉本地改動(dòng):
git checkout -- <filename>
此命令會(huì)使用 HEAD 中的最新內(nèi)容替換掉你的工作目錄中的文件谱仪。已添加到緩存區(qū)的改動(dòng),以及新文件否彩,都不受影響疯攒。
假如你想要丟棄你所有的本地改動(dòng)與提交列荔,可以到服務(wù)器上獲取最新的版本并將你本地主分支指向到它:
git fetch origin
git reset --hard origin/master
小貼士
內(nèi)建的圖形化 git:
gitk
彩色的 git 輸出:
git config color.ui true
顯示歷史記錄時(shí),只顯示一行注釋信息:
git config format.pretty oneline
交互地添加文件至緩存區(qū):
git add -i
參考【git - 簡(jiǎn)易指南】