Git的使用以及Git協(xié)同工作流的選擇

Git的使用以及Git協(xié)同工作流的選擇

[TOC]

為什么要使用Git

  • Git 是一個(gè)分布式的版本管理工具馅笙,而且可以是單機(jī)版的浆洗,所以催束,你在沒(méi)有網(wǎng)絡(luò)的時(shí)候同樣可以提交(commit)代碼。對(duì)于我們來(lái)說(shuō)伏社,這意味著在出差途中或是沒(méi)有網(wǎng)絡(luò)的環(huán)境中依然可以工作寫代碼。
  • Git 從一個(gè)分支向另一個(gè)分支合并代碼的時(shí)候塔淤,會(huì)把要合并的分支上的所有提交一個(gè)一個(gè)應(yīng)用到被合并的分支上摘昌,合并后也能看得到整個(gè)代碼的變更記錄。而其他的版本管理工具則不能高蜂。
  • Git 切換分支的時(shí)候通常很快聪黎。不像其他版本管理器,每個(gè)分支一份拷貝
  • Git 有很多非常有用的命令备恤,讓你可以很方便地工作稿饰。
  1. git stash命令,可以把當(dāng)前沒(méi)有完成的事先暫存一下露泊,然后去忙別的事喉镰。
  2. git cherry-pick命令可以讓你有選擇地合并提交。
  3. git grep $regexp $(git rev-list --all)可以用來(lái)在所有的提交中找代碼惭笑。因?yàn)槎际潜镜夭僮髀履罚阅銜?huì)覺(jué)得飛快生真。
  4. ... ...
  • 除此之外,由 Git 衍生出來(lái)的 GitHub/GitLab 可以幫你很好地管理編程工作捺宗,比如 wiki柱蟀、fork、pull request蚜厉、issue……集成了與編程相關(guān)的工作长已。

概念

版本庫(kù) Repository

理解成一個(gè)目錄,這個(gè)目錄里面的所有文件都可以被Git管理起來(lái)昼牛,每個(gè)文件的修改术瓮、刪除,Git都能跟蹤匾嘱,以便任何時(shí)刻都可以追蹤歷史斤斧,或者在將來(lái)某個(gè)時(shí)刻可以“還原”。 簡(jiǎn)單理解成 .git目錄霎烙。

工作區(qū) working directory

就是你在電腦里能看到的目錄撬讽,比如我的test目錄就是一個(gè)工作區(qū):

暫存區(qū) stage/index

Git的版本庫(kù)里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)悬垃。
[圖片上傳失敗...(image-dd4519-1520338302455)]
第一步是用git add把文件添加進(jìn)去游昼,實(shí)際上就是把文件修改添加到暫存區(qū);
[圖片上傳失敗...(image-f3ca47-1520338302455)]

第二步是用git commit提交更改尝蠕,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支烘豌。

遠(yuǎn)程倉(cāng)庫(kù) origin repository

遠(yuǎn)程服務(wù)器上的git倉(cāng)庫(kù), 讓其他人通過(guò)該倉(cāng)庫(kù)來(lái)協(xié)作看彼。

分支 Branch

因?yàn)閯?chuàng)建廊佩、合并和刪除分支非常快靖榕,所以Git鼓勵(lì)你使用分支完成某個(gè)任務(wù)标锄,合并后再刪掉分支。

標(biāo)簽 Tag

在branch上面打tag茁计, 可以用來(lái)做版本管理料皇。

HEAD指針

HEAD指向的版本就是當(dāng)前版本,因此星压,Git允許我們?cè)诎姹镜臍v史之間穿梭

用Shell還是GUI

  • 圖形化工具 : SoureTree, 或者IDE里面的git插件
  • 圖形化界面更加直觀践剂, 敲命令更快, 看個(gè)人喜好娜膘。

日常場(chǎng)景

初次使用

  • 本地安裝git
  • (可選)本地安裝圖形化工具SourceTree
  • (可選)IDE中安裝git插件并配置
  • 在github 創(chuàng)建代碼庫(kù)
  • 復(fù)制項(xiàng)目地址 比如:git@git.xxx.com:themis/themis.git
  • git clone git@git.xxx.com:themis/themis.git逊脯。 Git支持多種協(xié)議,默認(rèn)的git://使用ssh劲绪,但也可以使用https等其他協(xié)議男窟。ssh需要用到公私鑰盆赤,https需要用戶名密碼。

提交文件

git add file1.txt
git add file2.txt file3.txt --將文件添加到暫存區(qū)
git commit -m "add 3 files." --將暫存區(qū)內(nèi)容提交到本地
git push origin master -- 將本地內(nèi)容推送到遠(yuǎn)程

創(chuàng)建分支歉眷,切換分支牺六,合并分支,刪除分支

git branch dev -創(chuàng)建
git checkout dev -切換
git branch -查看當(dāng)前分支
git merge branch-name -合并某分支到當(dāng)前分支
git branch -d branch-name - 刪除本地分支
git push origin branch-name - 推送到遠(yuǎn)程倉(cāng)庫(kù)
注意:如果此分支是需要走cd發(fā)布的汗捡,請(qǐng)?jiān)趐hoebus平臺(tái)上創(chuàng)建淑际,不然平臺(tái)無(wú)法獲取新建的分支。

合并分支中的沖突解決

git checkout -b feature1
修改readme.txt
git add readme.txt
git commit -m '11'

git checkout master
git add readme.txt
git commit -m '22'

git merge feature1 -- 這一步就沖突了,修改完再提交

版本回退

回退本地版本

git reset --hard commit-id

強(qiáng)制推送到遠(yuǎn)程分支

git push -f

參考附錄3

多人協(xié)作

多人協(xié)作的工作模式通常是這樣:
1. 首先扇住,可以試圖用git push origin branch-name推送自己的修改春缕;
2. 如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新艘蹋,需要先用git pull試圖合并锄贼;
3. 如果合并有沖突,則解決沖突女阀,并在本地提交宅荤;
4. 沒(méi)有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功浸策!

那么 多人多版本多環(huán)境協(xié)作怎么搞冯键?這時(shí)候就需要有一個(gè)工作流來(lái)指導(dǎo)我們進(jìn)行代碼管理。

工作流

中心式協(xié)同工作流

Git 是可以像 SVN 這樣的中心工作流一樣工作的庸汗。很多程序員都是在采用這樣的工作方式惫确。

這個(gè)過(guò)程一般是下面這個(gè)樣子的。

  1. 從服務(wù)器上做git pull origin master把代碼同步下來(lái)蚯舱。
  2. 改完后改化,git commit到本地倉(cāng)庫(kù)中。
  3. 然后git push origin master到遠(yuǎn)程倉(cāng)庫(kù)中枉昏,這樣其他同學(xué)就可以得到你的代碼了所袁。
  4. 如果在第 3 步發(fā)現(xiàn) push 失敗,因?yàn)閯e人已經(jīng)提交了凶掰,那么你需要先把服務(wù)器上的代碼給 pull 下來(lái)。

功能分支協(xié)同工作流

上面的那種方式有一個(gè)問(wèn)題蜈亩,就是大家都在一個(gè)主干上開(kāi)發(fā)程序懦窘,對(duì)于小團(tuán)隊(duì)或是小項(xiàng)目你可以這么干,但是對(duì)比較大的項(xiàng)目或是人比較多的團(tuán)隊(duì)稚配,這么干就會(huì)有很多問(wèn)題畅涂。

最大的問(wèn)題就是代碼可能干擾太嚴(yán)重。尤其是道川,我們想安安靜靜地開(kāi)發(fā)一個(gè)功能時(shí)午衰,我們想把各個(gè)功能的代碼變動(dòng)隔離開(kāi)來(lái)立宜,同時(shí)各個(gè)功能又會(huì)有多個(gè)開(kāi)發(fā)人員在開(kāi)發(fā)。

這時(shí)臊岸,我們不想讓各個(gè)功能的開(kāi)發(fā)人員都在 Master 分支上共享他們的代碼橙数。我們想要的協(xié)同方式是這樣的:同時(shí)開(kāi)發(fā)一個(gè)功能的開(kāi)發(fā)人員可以分享各自的代碼,但是不會(huì)把代碼分享給開(kāi)發(fā)其他功能的開(kāi)發(fā)人員帅戒,直到整個(gè)功能開(kāi)發(fā)完畢后灯帮,才會(huì)分享給其他的開(kāi)發(fā)人員(也就是進(jìn)入主干分支)。

因此逻住,我們引入“功能分支”钟哥。這個(gè)協(xié)同工作流的開(kāi)發(fā)過(guò)程如下。

  1. 首先使用 git checkout -b new-feature 創(chuàng)建 “new-feature”分支瞎访。
  2. 然后共同開(kāi)發(fā)這個(gè)功能的程序員就在這個(gè)分支上工作腻贰,進(jìn)行 add、commit 等操作扒秸。
  3. 然后通過(guò) git push -u origin new-feature 把分支代碼 push 到服務(wù)器上播演。
  4. 其他程序員可以通過(guò)git pull --rebase來(lái)拿到最新的這個(gè)分支的代碼。
  5. 最后通過(guò) Pull Request 的方式做完 Code Review 后合并到 Master 分支上鸦采。

就像上面這個(gè)圖顯示的一樣宾巍,紫色的分支就是功能分支,合并后就會(huì)像上面這個(gè)樣子渔伯。

GitFlow 協(xié)同工作流

在真實(shí)的生產(chǎn)過(guò)程中顶霞,前面的協(xié)同工作流還是不能滿足工作的要求锣吼。這主要因?yàn)槲覀兊纳a(chǎn)過(guò)程是比較復(fù)雜的古徒,軟件生產(chǎn)中會(huì)有各式各樣的問(wèn)題寺惫,并要面對(duì)不同的環(huán)境。我們要在不停地開(kāi)發(fā)新代碼的同時(shí)腔呜,維護(hù)線上的代碼膝但,于是,就有了下面這些需求。

  1. 希望有一個(gè)分支是非常干凈的,上面是可以發(fā)布的代碼,上面的改動(dòng)永遠(yuǎn)都是可以發(fā)布到生產(chǎn)環(huán)境中的。這個(gè)分支上不能有中間開(kāi)發(fā)過(guò)程中不可以上生產(chǎn)線的代碼提交是嗜。

  2. 希望當(dāng)代碼達(dá)到可以上線的狀態(tài)時(shí),也就是在 alpha/beta release 時(shí)甫题,在測(cè)試和交付的過(guò)程中芹扭,依然可以開(kāi)發(fā)下一個(gè)版本的代碼麻顶。

  3. 最后赦抖,對(duì)于已經(jīng)發(fā)布的代碼,也會(huì)有一些 Bug-fix 的改動(dòng)辅肾,不會(huì)將正在開(kāi)發(fā)的代碼提交到生產(chǎn)線上去队萤。

面對(duì)這些需求,前面的那些協(xié)同方式就都不行了矫钓。因?yàn)槲覀儾粌H是要在整個(gè)團(tuán)隊(duì)中共享代碼要尔,我們要的更是管理好不同環(huán)境下的代碼不互相干擾。說(shuō)得技術(shù)一點(diǎn)兒就是新娜,要管理好代碼與環(huán)境的一致性赵辕。

為了解決這些問(wèn)題,GitFlow 協(xié)同工作流就出來(lái)了概龄。

整個(gè)代碼庫(kù)中一共有五種分支还惠。

  • (長(zhǎng)期)Master 分支。也就是主干分支私杜,用作發(fā)布環(huán)境蚕键,上面的每一次提交都是可以發(fā)布的。
  • (短期) Feature 分支衰粹。也就是功能分支锣光,用于開(kāi)發(fā)功能,其對(duì)應(yīng)的是開(kāi)發(fā)環(huán)境铝耻。
  • (長(zhǎng)期)Developer 分支誊爹。是開(kāi)發(fā)分支,一旦功能開(kāi)發(fā)完成田篇,就向 Developer 分支合并替废,合并完成后,刪除功能分支泊柬。這個(gè)分支對(duì)應(yīng)的是集成測(cè)試環(huán)境椎镣。
  • (短期) Release 分支。當(dāng) Developer 分支測(cè)試達(dá)到可以發(fā)布狀態(tài)時(shí)兽赁,開(kāi)出一個(gè) Release 分支來(lái)状答,然后做發(fā)布前的準(zhǔn)備工作。這個(gè)分支對(duì)應(yīng)的是預(yù)發(fā)環(huán)境刀崖。之所以需要這個(gè) Release 分支惊科,是我們的開(kāi)發(fā)可以繼續(xù)向前,不會(huì)因?yàn)橐l(fā)布而被 block 住而不能提交亮钦。一旦 Release 分支上的代碼達(dá)到可以上線的狀態(tài)馆截,那么需要把 Release 分支向 Master 分支和 Developer 分支同時(shí)合并,以保證代碼的一致性。然后再把 Release 分支刪除掉蜡娶。
  • (短期)Hotfix 分支混卵。是用于處理生產(chǎn)線上代碼的 Bug-fix,每個(gè)線上代碼的 Bug-fix 都需要開(kāi)一個(gè) Hotfix 分支窖张,完成后幕随,向 Developer 分支和 Master 分支上合并。合并完成后宿接,刪除 Hotfix 分支赘淮。

Git flow的優(yōu)點(diǎn)是清晰可控,缺點(diǎn)是相對(duì)復(fù)雜睦霎,需要同時(shí)維護(hù)兩個(gè)長(zhǎng)期分支梢卸。具體了解可以參考附錄2。

GitHub 協(xié)同工作流

過(guò)于簡(jiǎn)單碎赢,不適合低剔。具體了解可以參考附錄2。

GitLab 協(xié)同工作流

  1. 引入環(huán)境分支肮塞,如下圖所示襟齿,其包含了開(kāi)發(fā)環(huán)境(master)、預(yù)發(fā)布(Pre-Production)和生產(chǎn)(Production)分支枕赵。

上游優(yōu)先原則:開(kāi)發(fā)分支是預(yù)發(fā)分支的"上游"猜欺,預(yù)發(fā)分支又是生產(chǎn)分支的"上游"。代碼的變化拷窜,必須由"上游"向"下游"發(fā)展开皿。比如,生產(chǎn)環(huán)境出現(xiàn)了bug篮昧,這時(shí)就要新建一個(gè)功能分支赋荆,先把它合并到master,確認(rèn)沒(méi)有問(wèn)題懊昨,再cherry-pick到pre-production窄潭,這一步也沒(méi)有問(wèn)題,才進(jìn)入production酵颁。

只有緊急情況嫉你,才允許跳過(guò)上游,直接合并到下游分支躏惋。

  1. (不一定有這個(gè)需求)而有些時(shí)候幽污,我們還會(huì)有不同版本的發(fā)布,所以簿姨,還需要有各種 release 的分支距误。如下圖所示。Master 分支是一個(gè) roadmap 分支,然后深寥,一旦穩(wěn)定了就建穩(wěn)定版的分支攘乒,如 2.3.stable 分支和 2.4.stable 分支,其中可以 cherry-pick master 分支上的一些改動(dòng)過(guò)去惋鹅。

這樣也就解決了兩個(gè)問(wèn)題:

  1. 環(huán)境和代碼分支對(duì)應(yīng)的問(wèn)題;
  2. 版本和代碼分支對(duì)應(yīng)的問(wèn)題殉簸。

我的選擇

使用GitLab 協(xié)同工作流

其他操作

忽略特殊文件

本地修改不提交到遠(yuǎn)程倉(cāng)庫(kù)

本地修改不提交到遠(yuǎn)程倉(cāng)庫(kù)

git update-index --assume-unchanged 文件名

取消本地忽略

git update-index --no-assume-unchanged 文件名

cherry-pick

參考附錄

  1. 廖雪峰的git教程 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
  2. Git工作流
    http://www.ruanyifeng.com/blog/2015/12/git-workflow.html
  3. 遠(yuǎn)程倉(cāng)庫(kù)版本回退方法
    http://blog.csdn.net/fuchaosz/article/details/52170105
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闰集,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子般卑,更是在濱河造成了極大的恐慌武鲁,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝠检,死亡現(xiàn)場(chǎng)離奇詭異沐鼠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)叹谁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門饲梭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人焰檩,你說(shuō)我怎么就攤上這事憔涉。” “怎么了析苫?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵兜叨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我衩侥,道長(zhǎng)国旷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任茫死,我火速辦了婚禮跪但,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘璧榄。我一直安慰自己特漩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布骨杂。 她就那樣靜靜地躺著涂身,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搓蚪。 梳的紋絲不亂的頭發(fā)上蛤售,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼悴能。 笑死揣钦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漠酿。 我是一名探鬼主播冯凹,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炒嘲!你這毒婦竟也來(lái)了宇姚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤夫凸,失蹤者是張志新(化名)和其女友劉穎浑劳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體夭拌,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡魔熏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸽扁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒜绽。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖献烦,靈堂內(nèi)的尸體忽然破棺而出滓窍,到底是詐尸還是另有隱情,我是刑警寧澤巩那,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布吏夯,位于F島的核電站,受9級(jí)特大地震影響即横,放射性物質(zhì)發(fā)生泄漏噪生。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一东囚、第九天 我趴在偏房一處隱蔽的房頂上張望跺嗽。 院中可真熱鬧,春花似錦页藻、人聲如沸桨嫁。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)璃吧。三九已至,卻和暖如春废境,著一層夾襖步出監(jiān)牢的瞬間畜挨,已是汗流浹背筒繁。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巴元,地道東北人毡咏。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逮刨,于是被迫代替她去往敵國(guó)和親呕缭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git修己,從https:/...
    落魂灬閱讀 12,665評(píng)論 4 54
  • “人生導(dǎo)師箩退,最近負(fù)能量爆棚,快給我點(diǎn)正能量吧佳谦〈骼裕”前天晚上,你給我發(fā)了這樣的一條微信钻蔑。 看到這條消息的時(shí)候是22:3...
    羊小彩閱讀 339評(píng)論 13 3
  • 在這個(gè)世界 我們都不是寵兒 ...
    墨琳琪閱讀 189評(píng)論 0 0
  • “我只希望政治上的平等啥刻,要做到人人享有平等的自由,而千萬(wàn)不要像我們目前隨處可聞的人人平等的屈從于同一個(gè)主人咪笑】擅保”~~...
    教育小碩閱讀 232評(píng)論 0 0