理解Git!實習老板要我用Git協(xié)作
在公司實習,老板:你git新建一個分支,先讓測試的同學測試完你寫的內(nèi)容,再合并到master里去。
我:???
實習工作的時候,公司的項目代碼往往多人協(xié)同合作,需要用到Git工具,把代碼提交到Gitlab上去, 雖然之前學習過Git的簡單使用,但當昨天老板突然這么一句,我就懵逼了,分支是干啥的?
之前都是在GitHub上建立一個項目,只有master分支,從來沒有遇到過這種多人協(xié)作的場景,也從沒接觸過Git創(chuàng)建分支等操作,但在上級面前,又不好意思都說這些東西沒接觸過(我發(fā)現(xiàn)實習時,要用的工具是默認大家都會的),應(yīng)了一聲,就趕緊偷摸學了一波。
這里主要整理多人協(xié)作時常用的git操作,當然,也有pycharm的Git使用,畢竟這東西比命令可是香太多啦。
1. Git最常用的幾個操作
關(guān)于git是啥,怎么安裝啥的,這里就不說了,網(wǎng)上資料一大堆,這里先整理我個人如果用的話,往往常用的幾個操作。
首先,下載Git,完成一些基本的配置:
首先設(shè)置你的用戶名和郵件地址。這一點很重要,因為每一個 Git 提交都會使用這些信息,它們會寫入到你的每一次提交中。
# github或者gitlab用到的用戶名和郵箱
$ git config --global user.name "John Doe"
$ git config --global user.email "[email protected]"
# 查看基本配置
git config --list
然后,配置ssh提交
# 生成秘鑰
ssh-keygen -t rsa -C "[email protected]" # ~/.ssh目錄下面會有id_rsa和id_rsa.pub兩個文件
cat id_rsa.pub # 把這個里面的內(nèi)容復制
復制上面的內(nèi)容之后,打開你的github,進入配置頁:Settings – SSH and GPG keys,添加本地生成的ssh秘鑰,選擇New SSH key(這里已經(jīng)配置了一個key,如果是未配置秘鑰的用戶,這里是空的),把復制的內(nèi)容貼過來,然后保存:
#測試是否配置成功
用ssh鏈接git:ssh -T [email protected]
這樣做的原因是后面提交代碼的時候,用的是ssh服務(wù),還可以用http服務(wù),不過那個還得每次git push的時候,得輸入GitHub用戶名和密碼登陸太麻煩,而走ssh這個,就可以直接提交。這樣,Git的基本配置就完成了。
下面就是常用操作,首先我經(jīng)常會先從GitHub上新建一個倉庫,然后git clone下來,這樣的話,就可以從本地修改,提交了。但注意,git clone的時候復制地址用ssh格式的才行,啥意思?
SSH的這個,而不是HTTPS下面的那個。常用操作如下:
# 克隆項目下來
git clone [email protected]:zhongqiangwu960812/AI-RecommenderSystem.git
# 如果新改了某個文件,需要同步到遠程
# 如果是新增了某個文件,可以直接
git add 文件名
git status # 可以查看修改情況
git commit -m '新加文件' # 提交說明
git push # 提交
# 這樣,就搞定了
# 如果是刪除了某個或者修改了很多地方等,可以
git add .
git commit -m 'update many'
git push
# 如果是從遠程倉庫改了文件,需要先拉到本地,讓本地和遠程保持一致之后再push
git pull
這些命令,就是在學校里面自學的命令了,當時我記得也看到過分支啥的,但由于場景有限,不知道怎么運用,所以就難理解,而在公司,竟然這些才是最基礎(chǔ)操作。下面是昨天剛學習的一些東西:
2. git 分支
關(guān)于分支是啥什么時候用?場景至關(guān)重要,這里只說針對我現(xiàn)在的處境的一個理解。目前公司在Gitlab上,我們組共同維護著一個大項目, 每個人都可以對這個項目根據(jù)需求進行修改。而我實習之后,拿到的第一個任務(wù),就是遷移接口和隊列的操作,需要改一些配置啥的,這時候我git clone下這個項目來之后,用pycharm打開,然后進行修改。
我按照需求和老板指示,修改完了第一版代碼,然后打算去提測(就是開發(fā)完成,去找測試的同學測試),這時候,由于我的代碼沒有經(jīng)過測試,根本不知道能不能運行成功。而測試的同學拿我代碼,只能通過gitlab去拿,然后可以code diff,順便測試等。一時間,我既不能把代碼直接提交到master上,因為master是維護最終正確代碼的;而我又必須得提交到gitlab。于是乎,老板說,你建立個分支就行了,把你代碼提交到分支上,測試的同學測試成功之后,再merge到master上就解決了。
所以有了場景之后,有些東西自然會有感覺,分支現(xiàn)在給我的感覺,仿佛是面臨多個需求,需要修改代碼的時候,或者多個人共同維護一個項目,但是又不能直接往master提交的時候,分支是作為了每個人進行代碼緩沖的地方。
我建立分支之后,就可以在這個分支下按照需求進行修改,這樣還不影響最終代碼,當有好幾個版本,或者有好幾個需求的時候,就非常適合建立分支,一個分支對應(yīng)一個需求,開發(fā)完畢,進行push到分支,接著從另一個分支上開發(fā),這樣互不影響,最后還可以merge起來。
如何建立分支呢?
# 分支的創(chuàng)建與切換, 也可以直接用一行代碼:git brance -b 分支名
git branch 分支名
git checkout 分支名
# 修改完了代碼,需要push到遠程分支上,可以下面操作
git push --set-upstream origin 分支名
# 查看分支
git branch # 本地分支
git branch -r # 遠程分支
git brance -a # 查看所有分支
上面這些命令估計看了就頭大,沒關(guān)系,下面還有種非常簡單的傻瓜式操作,就是pycharm的Git。
3. Pycharm的git
關(guān)于這個東西,也是不介紹,直接說是咋用的。我是先把gitlab上的項目git clone到本地。然后pycharm打開,此時:

左下角這里,會有目前所在的分支,默認的時候是master分支,由于我這里修改了三版代碼,所以新建了三個分支。如果面臨新需求,可以點擊上面的New Brance新建立分支,默認會自動切換到此分支,這時候,就可以肆無忌憚的寫代碼了。
此時,如果我們修改代碼,pycharm會自動標記出來,修改是藍色,Add之后變成綠色好像是,修改完代碼,我們右鍵點擊項目名稱,在里面有個git選項,在這里嗎就能夠看到add和commit的操作了,我們可以先Add,把修改的代碼放到暫存區(qū),然后進行commit的操作。
點擊commit director之后,就會看到這樣的一個界面:
上面的窗口就會看到自己修改的東西,而下面,可以添加修改描述,接下來可以直接commit and push,也可以直接commit, 如果是前者,就會自動同步到遠程的對應(yīng)分支上去,如果是后者,還需要push操作才會同步到遠程上去。
所以這個就非常方便了,我今天用的時候,是根據(jù)其中一個需求,建立了分支v1,然后修改代碼,進行提測,提測的時候測試小姐姐讓我提供分支名和commit id(ci id),我對后面這個又一臉懵逼,這個commit id是這么查的, 命令行輸入:
git log
這里面會顯示自己的歷史提交:
最近的一次,commit后面那一長串就是commit id了。
知道了這個之后,又面臨一個需求,所以又建立的了個v2分支,把代碼開發(fā)提交測試,接著新建立一個V3分支,在V2的基礎(chǔ)上繼續(xù)修改代碼,此時測試小姐姐說v2上的代碼有問題,需要修改,此時我面臨的處境在v3分支上新加了新代碼。當我切換到v2的時候,發(fā)現(xiàn),呀,這不和v3是一樣的了嗎?這我還咋改v2。然后老板和我說,你v3改了之后要commit才行呀,這時候,才能看到真正的v2。所以在v3分支上,把修改先commit,此時再切回v2,看到了原來的v2,再從這個基礎(chǔ)上改代碼,push到v2分支,再提測就OK了。
然后又從v3的基礎(chǔ)上,把新的需求改完,add+commit push即可把之前的commit的,和后又新加的都一塊同步到遠程倉庫,確實非常方便。
有分支就有合并。當然,還有merge的需求,場景是這樣子的:
上面我接了2個開發(fā)任務(wù),新建了一個v2分支,去做A需求,這個開發(fā)完成之后, 需要進行提測和上線, 在我提測了之后,接著又在v2的基礎(chǔ)上,建立了一個新的分支v3做B需求, 這時候, v2測試過了,然后需要上線,所以就merge到了master,然后部署上線。 這時候遠程v2分支就沒了(merge了嘛)。
接著,我從v3上做新的開發(fā),做完了之后,本來想提測,這時候發(fā)現(xiàn)了個問題,v3是v2merge,上線之前建立出來的,而v2在merge和上線之前,根據(jù)測試那邊的反饋是做了些改動的,這時候,就面臨著,即使我v3完成了當前的B需求,但A需求v3這個版本是沒有管的,也就是即使提測,相當于能滿足B需求而A需求又沒法滿足了,怎么辦呢?這時就用到了merge。這里老板告訴我的解決辦法:把遠程的master(這個是最新的)pull到你本地的master分支,然后把本地的master合并到v3就可以了,再把v3push到遠程的v3分支。
所以,merge的意思是什么呢?是保留最新的改動,如果把master merge到v3上,由于master是滿足了A需求的,merge到v3后,我v3就不需要再管master的各種修改了,統(tǒng)一到了最新的版本上去,基于新的master進行了再開發(fā), 這個是真的學到了。如果感覺說的比較抽象,可以先看看廖雪峰的Git教程,先了解下從dev合并到master分支是啥意思。而我master分支合并到dev上,其實相當于這個意思:

通過這一天,我算是見識了,之前從沒有體會到Git原來是這么玩的。像上面這個分支, 之前怎么看都感覺不理解,結(jié)果真正用的時候, 一晚上就有感覺了,所以學習知識,真的要想辦法學以致用 ??
