工作中如何使用GIT開發(fā)項目?

注意:
?如果你熟悉Linux操作系統(tǒng),那么這篇文章閱讀速度會加倍
另外:
?如果你熟悉SVN,那么Git只是一個更高級的版本管理工具而已
But:
?如果不熟悉Linux,也不知道SVN,那么沒關(guān)系,至少你使用過云盤來管理你日常的文件
如果你連云盤都沒用過。那么你還是早點回火星吧,地球很危險的。

為啥需要版本管理?

假設(shè):
下周就要做年終工作匯報了,你打算今天把PPT做完。
反反復(fù)復(fù)用了一上午的時間,總算是完成了一半。
中午吃飯的時候,你依然在思考后半部分該怎么完成。
然后你突然間覺得,上午的方案有些問題,還需要再改一改
下午5點20分.....
在你反復(fù)閱讀自己的方案后, 仍然覺得,還是上午的方案更好
可這個時候麻煩來了
?, 上午的方案早就被改的面目全非了
當(dāng)時寫的話術(shù),使用的圖片動畫等等,都已經(jīng)被你刪除了
想用Ctrl + Z
解決? 可惜PPT最多只支持150次操作回退,默認(rèn)設(shè)置好像只有80次
這個時候,是不是特別想來一瓶后悔藥?
朋友,是時候了解一下百度云盤會員了。
不要998! 不要998! ,只要96元,就可享受包年服務(wù)

?

上面的付款是假的,真的付款碼在這里:

好了,剛才是個玩笑,?但百度云盤真的有記錄文件版本的功能
因此,我們認(rèn)為,一個好用的云盤軟件,應(yīng)該具備以下幾個功能:
1、用戶A和B之間能夠方便的進(jìn)行文件共享
2、用戶A和B可以修改同一個文件,云盤能夠及時解決沖突問題
3、用戶A對文件的修改提交后會同步給用戶B
4、所有用戶對文件的每一次提交都會有記錄保存,操作失誤時,可以還原之前的版本
版本管理,?不正是因此而得名么?

SVN的優(yōu)勢?
在使用git之前,你必須了解一下SVN

說起來,SVN可是曾經(jīng)風(fēng)靡全球的版本管理工具
SVN軟件的使用,確實非常簡單
它有兩個安裝包

?

第二個安裝包是服務(wù)器端,也就是說,你可以通過安裝這個服務(wù)器端的軟件,很輕易的在公司內(nèi)部搭建一個SVN服務(wù)器
這樣大家就可以在公司內(nèi)網(wǎng)進(jìn)行文件或是 代碼的共享了
程序員在寫代碼時,經(jīng)常需要協(xié)同開發(fā)(多個人維護(hù)一個項目)
SVN帶來的方便,自然不言而喻,幾乎所有的主流開發(fā)工具,都會配有SVN的插件
SVN的具體用法,這里不再詳細(xì)描述。請讀者自行百度

有了SVN,為什么會出現(xiàn)Git?

git這個軟件的作者,是大名鼎鼎的Linus(Linux系統(tǒng)內(nèi)核的發(fā)明人,編程界神話級的程序員)
不得不說,git這個軟件,在易用性上,跟SVN差了不是一個數(shù)量級
但畢竟是專門給程序員用的,誰還考慮用戶體驗??
由于linus嚴(yán)重的個人興趣傾向,他非常不喜歡文件集中式的管理
于是git軟件打一開始就是分布式的
簡單的說:就是任何人都可以向任何人的電腦上提交代碼,任何人也可以從任何人的電腦上下載代碼,任何人都可以被看作服務(wù)器端
再加上linus這種崇尚命令行主導(dǎo)一切的思維,git這個軟件,打一開始就沒有圖形界面?

所以使用git的時候,特別有種當(dāng)黑客的感覺,有木有??


盡管,git率先發(fā)明了分支的設(shè)計,但是,這糟糕的用戶體驗,并沒能使它在全球范圍迅速流行起來,直到?github
的出現(xiàn).....

git和github是啥關(guān)系?

github, 這個被大家戲稱為全球最大的同性交友網(wǎng)站
它是如何崛起的呢?
github網(wǎng)站提供了如下的服務(wù):
1、你可以到這個網(wǎng)站注冊一個賬號
2、通過這個賬號,你可以建立自己的倉庫
3、使用你本地的git軟件將你的代碼提交到github服務(wù)器
4、如果你的同事也注冊了github賬號,那你可以一鍵轉(zhuǎn)載分享給他
5、github上面的項目都是可以公開分享給其他人看的
6、我們不提供交友,只能提供代碼分享及管理
你可以看到,github給我們帶來了兩個巨大的好處
第一
?github讓我們似乎又回到了SVN的服務(wù)器時代,方便。
第二
?全世界所有知名的開源代碼,都提交到了github上面并公開,這樣一來,所有人都可以向這個開源項目提交自己的修改建議
它帶動了git軟件的流行,這就是今天你不得不學(xué)git的原因

git到底咋用?

首先,下個一個git軟件?https://git-scm.com/downloads
,并安裝
在github上,建立一個空的project
建好項目后,會看到項目的地址

現(xiàn)在,把項目的下載地址復(fù)制好了
找到一個合適的目錄,例如E盤,在該目錄下點擊右鍵選擇git bash here
輸入命令?git clone https://github.com/ay8yt/teach.git
項目就會自動下載,這時E盤會多出一個teach
目錄
好了,你現(xiàn)在可以打開你的開發(fā)工具,到這個目錄下,編寫你的代碼了
1 項目寫完了,咋提交呢?
在命令行使用cd teach,進(jìn)入teach目錄
輸入命令:?git add -A?, 將所有文件添加至緩存區(qū),準(zhǔn)備提交
然后,輸入git commit -m '這里可以做一些描述,本次做了哪些修改'
提交成功!

可能還需要一些準(zhǔn)備工作

如果你第一次使用git,提交時,系統(tǒng)會提示你先設(shè)置用戶信息,那我們就設(shè)置一下:
git config --global user.email "隨便郵箱"
git config --global user.name "隨便用戶名"
另外,由于項目通常是多人開發(fā),你必須建立一個自己的分支
我知道你一定想問
,?啥是分支? 。。。。。這個說來有點話長了
假設(shè)張三和李四要共同開發(fā)一個項目
雖然,他們倆負(fù)責(zé)的是不同的模塊
但是
,張三的模塊如果出了BUG或者錯誤,會導(dǎo)致李四的項目也無法啟動
為了避免沖突和互相干擾
張三和李四在開發(fā)之前,都把項目進(jìn)行了一次克隆拷貝
接下來,他們分別在自己克隆的副本上進(jìn)行修改和提交

接下來,張三就可以在自己的副本上進(jìn)行修改和提交,和李四不會產(chǎn)生任何沖突
這就是分支
的概念了
當(dāng)然,張三的所有操作都是在自己的電腦本地進(jìn)行的
如果本地電腦出了問題,本地記錄的版本依然會全部丟失
所以,張三可以把自己本地的全部版本都推送到遠(yuǎn)程github服務(wù)器上

同樣,李四也可以把自己本地的全部版本都推送到遠(yuǎn)程github服務(wù)器上

這時,我們查看github遠(yuǎn)程,會發(fā)現(xiàn)變成了這樣:

這樣一來,我們不僅把所有人的版本做了記錄,而且整個開發(fā)過程中,張三和李四沒有任何交集,也不會產(chǎn)生任何沖突
怎么樣?有沒有感覺這個分支的發(fā)明特別的帥氣?

盡管SVN后來也迅速的推出了分支的功能,但它沒有一個像github這么流行并統(tǒng)一的服務(wù)器。
github不僅提供了代碼的托管,現(xiàn)在已經(jīng)演變成了全球最大的代碼分享社區(qū)
并在2018年6月份,以75億美元的價格,賣給了微軟
留給SVN的,只有一首《涼涼》

了解了基本原理,還是得學(xué)學(xué)具體如何使用

1. 怎么把gibhub上新建的項目down下來?
如果你還有這樣的疑問,顯然你沒有好好聽課,因為上面已經(jīng)講過了。
算了,再說一次,下不為例。git clone https://github.com/ay8yt/teach.git
2. 怎么在本地克隆一個副本,也就是創(chuàng)建一個分支?
使用branch命令。git branch yintao01
3. 怎么進(jìn)入這個分支呢?
git checkout yintao01

好了,你現(xiàn)在應(yīng)該能很明顯的看到,你已經(jīng)切換到了自己的分支,接下來的所有操作,都在這個副本上進(jìn)行。
4. 寫了一部分功能,想保存一個版本,怎么做?
第一步,git add -A, 所有文件提交到緩存區(qū)
5.等等! 我有些文件不想提交,例如 node_modules文件夾,怎么忽略它?
你要在項目的根目錄下,創(chuàng)建一個叫做.gitignore
的文件,內(nèi)容如下:

6.可是我剛才已經(jīng)把不需要的文件提交到緩存區(qū)了,怎么撤銷?
很簡單,重置一下,git reset,然后就可以提交了。
7.等等!我想在正式提交之前,先查看一下,都有哪些文件提交到了緩存區(qū)?
你TM事兒真多!好吧,你可以使用git status命令查看,都做了哪些改動,以及所有文件的狀態(tài)。
8.好了,那正式提交是不是commit命令?
沒錯!使用git commit -m '這里一定要把做了什么修改寫清楚'
9.每次提交一個版本都得寫?。?那多麻煩? 不寫清楚行嗎?
你可以試試,把你腸子悔青。
10.剛提交完,就后悔了,感覺提交錯了,想撤銷這次提交,或覆蓋這次提交,怎么做?
版本管理的好處,就是允許你后悔,首先你把錯誤的內(nèi)容先修復(fù)好
然后再次add添加緩存,但這次提交時,注意使用git commit --amend -m '剛才的提交就覆蓋了'
11.我想直接還原到上一個版本,怎么做?
使用git reset head^
12.我想直接還原到前兩個版本,怎么做?
使用git reset head^^
13.那還原到前N個版本呢?
git reset head^^^^^^^^^^...
14.你逗我呢? 這么麻煩?
沒開玩笑,就是這樣,當(dāng)然你可以指定版本號直接還原
git reset --hard?7e2ec0f51e9ae2e7cbc7c4deca18b77b242148d6
15.版本號是個哈希值? 這么長咋記得住?
你可以用git log查看所有版本
16.我查了,可是每個版本都改了什么看不到啊,這aaaaa,bbbb,cccc,dddd都是什么鬼?

這不都是你自己提交時寫的注釋么? 不認(rèn)真寫注釋的下場就是這樣。活該。
另外,任何時候?qū)懘a,一定要想清楚了,測試通過了再提交,這是程序員的基本素質(zhì)。
回滾操作雖然好用,但它不應(yīng)該成為你的日常命令。如果一個程序員把各種回滾操作用的特別熟
通常表明他的代碼水平不怎么樣。
17.我看你用的就挺熟的呀
滾~~~~~~
18.如果本地我已經(jīng)測試完并提交了,怎么推送到遠(yuǎn)程github上面?
為了方便做遠(yuǎn)程推送,通常我們會給遠(yuǎn)程倉庫地址做個快捷方式。
git remote add miaodong https://git.oschina.net/ay8yt/test.git
這個miaodong
就是快捷名稱,接下來你提交時,就可以這樣寫:
git push -u miaodong yintao01?這句話的意思就是把yintao01這個分支推送到miaodong這個倉庫地址
-u
?的意思就是把yintao01設(shè)為默認(rèn)分支
下次再推送,就可以直接寫git push miaodong
19.我的模塊已經(jīng)開發(fā)完成,并測試通過,也推送到了github上,怎么把我的分支合并回主分支
在github上合并分支非常簡單,找到Pull request,自己看說明去吧

至此,你已經(jīng)掌握了日常工作中g(shù)it的基本使用