?Git操作
一、創(chuàng)建git倉(cāng)庫(kù)
git init --bare fasloan.git
授權(quán)限
chown -R git:git fasloan.git ????
遠(yuǎn)程庫(kù)克隆
git clone git@X.X.X.X:/home/yd_fasloan/fasloan.git
二甸赃、創(chuàng)建與合并分支
(分支管理:你創(chuàng)建了一個(gè)屬于你自己的分支,別人看不到上枕,還繼續(xù)在原來(lái)的分支上正常工作丸卷,而你在自己的分支上干活,想提交就提交捐名,直到開(kāi)發(fā)完畢后旦万,再一次性合并到原來(lái)的分支上,這樣镶蹋,既安全纸型,又不影響別人工作。其他版本控制系統(tǒng)如SVN等都有分支管理梅忌,但是用過(guò)之后你會(huì)發(fā)現(xiàn),這些版本控制系統(tǒng)創(chuàng)建和切換分支比蝸牛還慢除破,簡(jiǎn)直讓人無(wú)法忍受牧氮,結(jié)果分支功能成了擺設(shè),大家都不去用瑰枫。但Git的分支是與眾不同的踱葛,無(wú)論創(chuàng)建、切換和刪除分支光坝,Git在1秒鐘之內(nèi)就能完成尸诽!無(wú)論你的版本庫(kù)是1個(gè)文件還是1萬(wàn)個(gè)文件。)
1.創(chuàng)建dev分支盯另,然后切換到dev分支:
$ git checkout -b dev
git checkout命令加上-b參數(shù)表示創(chuàng)建并切換性含,相當(dāng)于以下兩條命令:
$ git branch dev
$ git checkout dev
Switchedto branch'dev'
2.?用git branch命令查看當(dāng)前分支:
$ git branch? ? ? ? ? ? ? ? ? ?
* dev? ? ? ? ? ? ? ?
master
git branch命令會(huì)列出所有分支,當(dāng)前分支前面會(huì)標(biāo)一個(gè)*號(hào)鸳惯。
在dev分支上正常提交商蕴,比如對(duì)fasloan_view.py 做個(gè)修改,刪除一行:print111然后提交:
3. 先查看當(dāng)前狀態(tài):
表示修改了fasloan_view.py的文件內(nèi)容芝发,現(xiàn)在提交一下將文件加入暫存區(qū):
對(duì)剛提交的文件進(jìn)行描述绪商,實(shí)際上是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支:
簡(jiǎn)單解釋一下git commit命令,-m后面輸入的是本次提交的說(shuō)明辅鲸,可以輸入任意內(nèi)容格郁,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄独悴。查看現(xiàn)在的狀態(tài)例书,該工作區(qū)是干凈的沒(méi)有任務(wù)去提交:
現(xiàn)在,dev分支的工作完成刻炒,我們就可以切換回master分支:
查看fasloan_view.py文件茬射,發(fā)現(xiàn)剛才刪除那行仍然存在:
1.查看fasloan_view.py文件
2.內(nèi)容未修改:
解決辦法:
因?yàn)槟莻€(gè)提交實(shí)在dev分支上碑诉,而master分支此刻提交點(diǎn)并沒(méi)有變。我們把dev分支上的工作修改合并到master分支上:
git merge命令用于合并指定分支到當(dāng)前分支诬乞。合并后,再查看fasloan_view.py的內(nèi)容糊肤,就可以看到,和dev分支的最新提交是完全一樣的。
現(xiàn)在將所有改動(dòng)都合并到主分支了旺嬉,用git log看看分支歷史:
在實(shí)際開(kāi)發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
(首先厨埋,master分支應(yīng)該是非常穩(wěn)定的邪媳,也就是僅用來(lái)發(fā)布新版本,平時(shí)不能在上面干活荡陷;
那在哪干活呢雨效?干活都在dev 分支上,也就是說(shuō)废赞,dev 分支是不穩(wěn)定的徽龟,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí)唉地,再把dev分支合并到master上据悔,在master分支發(fā)布1.0版本;你和你的小伙伴們每個(gè)人都在dev分支上干活耘沼,每個(gè)人都有自己的分支极颓,時(shí)不時(shí)地往dev分支上合并就可以了。)
合并分支時(shí)群嗤,加上--no-ff參數(shù)就可以用普通模式合并菠隆,合并后的歷史有分支,能看出來(lái)曾經(jīng)做過(guò)合并狂秘,而fast forward合并就看不出來(lái)曾經(jīng)做過(guò)合并浸赫。
?因?yàn)楸敬魏喜⒁獎(jiǎng)?chuàng)建一個(gè)新的commit,所以加上-m參數(shù)赃绊,把commit描述寫(xiě)進(jìn)去既峡。
$ git merge --no-ff? -m "merge with no-ff " dev
$ git log--graph --pretty=oneline --abbrev-commit
三、查看遠(yuǎn)程庫(kù)的信息用git remote::
或者碧查,用git remote -v顯示更詳細(xì)的信息:
上面顯示了可以抓取和推送的origin的地址运敢。如果沒(méi)有推送權(quán)限,就看不到push的地址忠售。
四传惠、推送分支
1.推送分支,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫(kù)稻扬。推送時(shí)卦方,要指定本地分支,這樣泰佳,Git就會(huì)把該分支推送到遠(yuǎn)程庫(kù)對(duì)應(yīng)的遠(yuǎn)程分支上
并不是一定要把本地分支往遠(yuǎn)程推送
master分支是主分支盼砍,因此要時(shí)刻與遠(yuǎn)程同步尘吗;
dev分支是開(kāi)發(fā)分支,團(tuán)隊(duì)所有成員都需要在上面工作浇坐,所以也需要與遠(yuǎn)程同步睬捶;
2. 多人協(xié)作工作模式:
(1)使用git push origin ?<分支名> 推送自己的修改
(2)如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新近刘,需要先用git pull試圖合并
(3)]如果和并有沖突擒贸,則解決沖突,并在本地提交
(4)沒(méi)有沖突或者解決掉沖突后觉渴,再用git push origin <分支名>就能推送成功
如果git pull提示no tracking information, 則說(shuō)明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒(méi)有創(chuàng)建介劫,用命令git branch --set-upstream-to <分支名> origin/<分支名>
五、解決沖突:
新分支開(kāi)發(fā)feature1:
修改fasloan_view.py,添加了一行print(11)
提交:
在master分支上把fasloan_view.py文件修改添加print(1111)案淋, 文件已被修改:
添加文件到暫存區(qū)并提交:
這種情況git無(wú)法執(zhí)行快速合并座韵,只能試圖把各自的修改合并起來(lái),但這種合并可能會(huì)有沖突:
Git告訴我們哎迄,fasloan_view.py文件存在沖突,必須手動(dòng)解決沖突后再提交隆圆。git status也可以告訴我們沖突的文件:
修改內(nèi)容之后保存漱挚,再提交:
刪除feature1分支:
最后推到遠(yuǎn)程:
六、版本回退
Git每當(dāng)文件修改到一定程度的時(shí)候渺氧,就可以“保存”一個(gè)快照旨涝,這個(gè)快照在Git里被稱為commit,一旦把文件改亂了侣背,或者誤刪了文件白华,還可以從最近的一個(gè)commit恢復(fù),繼續(xù)工作贩耐。
git log命令顯示從最近到最遠(yuǎn)的提交日志弧腥,如果嫌輸出信息太多,看得眼花繚亂的潮太,可以試試加上--pretty=oneline參數(shù):
看到一大串類似7feo2的是commit id(版本號(hào))管搪, 一個(gè)通過(guò)SHA1計(jì)算出來(lái)的非常大的數(shù)字,用十六進(jìn)制表示铡买。
回到上個(gè)版本更鲁,首先Git要知道當(dāng)前版本是哪個(gè),在Git中奇钞,用HEAD表示當(dāng)前版本澡为,也就是最新。上個(gè)版本HEAD^景埃,上上個(gè)版本時(shí)HEAD^^, 當(dāng)然網(wǎng)上100個(gè)版本媒至,寫(xiě)成HEAD~100.
回退上一個(gè)版本:
已被還原:
若想再回去顶别,只要命令行窗口還沒(méi)有被關(guān)掉,可以順著找commit id塘慕,于是就可以回到未來(lái)的某個(gè)版本筋夏,版本號(hào)沒(méi)必要寫(xiě)全,前幾位就可以了图呢,Git會(huì)自動(dòng)去找条篷。當(dāng)然也不能只寫(xiě)前一兩位,因?yàn)镚it可能會(huì)找到多個(gè)版本號(hào)蛤织,就無(wú)法確定是哪一個(gè)了:
你回退到了某個(gè)版本赴叹,關(guān)掉了電腦,第二天早上就后悔了指蚜,想恢復(fù)到新版本乞巧,Git提供了一個(gè)命令git reflog用來(lái)記錄你的每一次命令:
又找回了你想回到指定版本的commit id。
七摊鸡、撤銷修改:
git checkout -- file可以丟棄工作區(qū)的修改:把文件在工作區(qū)的修改全部撤銷有兩種情況:
(1)文件自修改后還沒(méi)有被放到暫存區(qū)绽媒,現(xiàn)在撤銷修改就回到和版本庫(kù)一模一樣的狀態(tài)。
(2)文件已經(jīng)添加到暫存區(qū)免猾,又做了修改是辕,現(xiàn)在撤銷修改就回到添加到暫存區(qū)后的狀態(tài)×蕴幔總之获三,就是讓文件回到最近一次git commit或者git add時(shí)的狀態(tài)。
修改文件并添加到了暫存區(qū)锨苏,慶幸的是在commit之前疙教,用git status查看,修改到了暫存區(qū)伞租,還沒(méi)有提交;
用命令git reset HEAD fasloan_view.py可以把暫存區(qū)的修改撤銷掉贞谓,重新放回工作區(qū)。假設(shè)不但改錯(cuò)東西葵诈,還從暫存區(qū)提交到了版本庫(kù)经宏,就只能回到上一個(gè)版本(條件是還沒(méi)把本地版本庫(kù)推送到遠(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 ,就回到了場(chǎng)景1主之,第二步按場(chǎng)景1操作择吊。
(3)已經(jīng)提交了不合適的修改到版本庫(kù)時(shí),想要撤銷本次提交槽奕,只能回退版本几睛,不過(guò)前提是沒(méi)有推送到遠(yuǎn)程庫(kù)。