? ? 最近工作中用到了git,但是之前真的只是聽到過,但是沒有實際的用過。在百度了很多資料后。參照廖雪峰官方網(wǎng)站的Git教程,結(jié)合我實際用到的一些東西,整理了一些新手的使用指南。
? ? 在這里首先你要知道到git是開源的版本控制系統(tǒng),可以幫我們管理我們的項目。我們先來理解一下這個版本控制系統(tǒng)的概念。
一、什么是版本控制系統(tǒng)
? ? 將我們的項目比作一個超長的文檔,每一個開發(fā)人員負(fù)責(zé)其中的一個章節(jié),或者說兩個開發(fā)人員負(fù)責(zé)同一個章節(jié)。寫的時候每個人肯定要分開寫的,那怎么放到一起呢?一份份的復(fù)制粘貼?粘貼后其中一個人改了呢?要再重新的復(fù)制粘貼,然后再發(fā)給每個人嗎?那我要是想刪除一部分呢?或者說某個章節(jié)我想還原成以前的版本呢?難道我們都要不停的查找和復(fù)制粘貼,然后還要去通知每一個參與其中的人重新拷貝一份?那拷貝之前別人做的改動呢?
? ? 可以看到這是非常麻煩的一個事情,那現(xiàn)在有了一個叫g(shù)it的東西,可以記錄每一個人的更改,還可以管理每一個人寫出來的東西,幫你去整合到一起,不需要我們不停的拷貝才能達到每個人看到的都是最新的完成的東西。想回去看某一次的改動,只要到軟件里去產(chǎn)看一下更改的記錄就可以了。
二、版本控制系統(tǒng)的門派
?版本控制系統(tǒng)不只有g(shù)it這一個,還有CVS和SVN等,那么為什么現(xiàn)在越來越多的人愿意用git呢?這是因為git與他們不是一個門派的。git是分布式的版本管理系統(tǒng),而CVS和SVN是集中式管理系統(tǒng)。
2.1 集中式版本控制系統(tǒng)
? ? 集中式的版本控制系統(tǒng)需要一個中央服務(wù)器,版本庫集中存放在這個服務(wù)器上,而我們工作的時候都是在自己的電腦上,所以我們開始干活之前要再服務(wù)器上獲取最新的版本才能開始工作,工作完,再把自己做的東西傳到服務(wù)器上。
? ? 但是這么做,會有很大的缺點和局限性。首先,是工作起來額硬性條件要求--網(wǎng)絡(luò),因為要和服務(wù)器進行交互,所以必須要在聯(lián)網(wǎng)的狀態(tài)下才能工作。但是這就對你的網(wǎng)速要求很高了,如果網(wǎng)速慢或者傳送文件太大,那么就需要很長的時間做這些上傳和下載的功能。其次,由于是集中式管理,那么每個人的電腦上的代碼肯定不是大家都更新過的,最多是你從服務(wù)器上獲取的代碼庫,和你自己最新的改動,那么一旦中央的控制器出了問題,所有人都沒辦法工作了,無法獲取到新的版本庫,也無法提交工作的內(nèi)容。
2.2 分布式版本控制系統(tǒng)
分布式版本控制系統(tǒng)不需要中央服務(wù)器,代碼庫就在每個參與人員的電腦上,這一點就解決了集中式版本控制系統(tǒng)的兩大重要問題。第一個是聯(lián)網(wǎng)問題,代碼庫就在自己的電腦上所以我們不需要聯(lián)網(wǎng)去獲取代碼庫,聯(lián)網(wǎng)提交工作內(nèi)容。再有就是,既然代碼庫就在自己的電腦上,那么即使一臺電腦出了問題,也不會影響其他人的工作。
那么分布式管理系統(tǒng)怎么來完成多個人員的協(xié)作的呢?比如電腦A和電腦B同時對一個文件進行了改動,這是只要將各自改動的部分推送給對方就可以了。
這里提一下:理論上是兩臺電腦之間相互推送修改就可以,但是在我們的實際工作中,由于兩個人可能處在不同的網(wǎng)絡(luò)環(huán)境,無法相互訪問,或者其中一臺電腦沒有開機工作,所以在實際的工作中,我們一般會有一臺充當(dāng)‘中央服務(wù)器’的電腦,這個電腦知識方便大家交換修改的成果,沒有這臺電腦也沒有關(guān)系的。
三、? git 實際使用
3.1 git項目創(chuàng)建
在進行g(shù)it的學(xué)習(xí)操作之前,我們需要自己創(chuàng)建一個git項目。不要在你的電腦上直接執(zhí)行,尤其是你的電腦上有公司的項目的時候。這里簡單教大家弄一個git的項目地址出來,就是我們的版本庫。
首先你需要注冊一個gitHub賬號,注冊登錄之后進到這個頁面。牢記你的用戶名和密碼

選擇Start a project 按鈕,輸入你的項目名稱,記住不要寫中文,不要犯常識錯誤。

創(chuàng)建成功后,按下復(fù)制按鈕。就可以復(fù)制項目地址了。

其實我們在這里是相當(dāng)于搭建了一個git服務(wù)器,在后面會為大家詳細(xì)的講解。因為我個人覺得這樣更有助于大家快速上手。
3.2 git安裝。
請大家自行百度。根據(jù)電腦的系統(tǒng)來。
3.3 實際使用
上面的章節(jié)中我們已經(jīng)說了怎么去創(chuàng)建一個實際的git項目環(huán)境。
現(xiàn)在打開我們的命令行工具,進到一個文件夾(你想在你的本地放置文件庫 的地方)
執(zhí)行第一個git命令
1)git init 再文件夾里創(chuàng)建git版本庫
2)克隆項目git clone url (這個url就是拷貝的項目地址)
執(zhí)行完成你會發(fā)現(xiàn)你的文件夾下多了一個文件夾,名字就是你的git項目名稱。(這里先不用管里面的說項目是空的)
執(zhí)行cd 文件名 進入克隆下來的文件目錄
2)添加文件 git add fileName
現(xiàn)在在你克隆下來的項目文件里新建一個index.html 文件
然后執(zhí)行 git add index.html ?現(xiàn)在我們已經(jīng)將文件添加到倉庫里,但是注意現(xiàn)在只是將這個文件添加到一個叫暫存區(qū)的地方。
3)提交 git commit -m '注釋'
這里引號里的內(nèi)容是對你提交文件的注釋,方便我們以后查找。這一步是將我們的文件提交到了倉庫(版本庫,后面還會講解)。
4)上傳到服務(wù)器 git push
將我們前面兩部步提交到版本庫的修改上傳到遠端服務(wù)器,就是我們的gitHub創(chuàng)建的項目地址。這時候看下我們gitHub項目。

在這里我們還要說的一點是,在add的時候我們可以同時添加很多文件之后再執(zhí)行commit命令
git add file1 file2?
3.4 git add 的實用用法
在實際的項目總,我們可能會對多個文件進行改動,或者是新建了文件等,我們想提交修改,要怎么做呢?
這時候有人說,git add 然后寫一大串的文件名不就行了,但是這么做一個是浪費時間,還有就是我們很可能會少些、拼錯文件名,造成不必要的麻煩,那么這個時候,git 為我們提供了一些方便快捷的方法。
git add -A? // 添加所有改動
git add *? ? // 添加新建文件和修改,但是不包括刪除
git add .? ? // 添加新建文件和修改,但是不包括刪除
git add -u? // 添加修改和刪除,但是不包括新建文件
3.5 git? status? 和? git? diff
我們提交過一個文件之后很可能胡對其進行修改,現(xiàn)在我們在index.html文件里再輸入一些新的東西。
現(xiàn)在有一個命令可以讓我們隨時掌握我們當(dāng)前倉庫的狀態(tài),例如:文件是否被改動過,有沒有準(zhǔn)備提交的文件,就是 git status

最后一行提示我們沒有準(zhǔn)備提交的的文件,需要我們執(zhí)行g(shù)it add 。
還有一種情況是,我們很久沒有改動文件了,不知道上次做了什么修改,這個時候我們有一個可以查看上一次文件改動的命令 git diff ?查看的文件名就是different(不同)的意思。
3.6 版本回退
這里的版本回退是指,我們很可能誤操作了一些我們不想做的操作,或者改動提交之后,產(chǎn)品跑過來告訴你還是之前的樣子更好,雖然這個時候我們很像揍他,但是怎么辦呢?難道要回想之前的代碼,刪掉現(xiàn)在的重新寫?在git中我們不必這么做,記得我們的commit命令嗎?這個命令幫我們記住了我們么每一次的修改,我們可以通過這個命令恢復(fù)最近的一個commit恢復(fù)。這就是版本回退,下面來看下版本回退是怎么實現(xiàn)的把。
3.6.1 查看日志 git log
這個命令可以顯示我們從最近一次到最早一次的提交日志

這里顯示了我們從一開始到現(xiàn)在執(zhí)行的所有提交命令,就是commit的時候進行的記錄,這時候知道注釋是多重要的事情了吧。(提示,退出這個操作按q就可以了)
可以將每一個改動顯示到一行,給git log 后面加上--pretty=oneline就可以了
3.6.2 git reset
現(xiàn)在我么來學(xué)習(xí)怎么回到之前的版本:
1)先知道我們當(dāng)前是哪個版本 ,用 HEAD 表示。
2)回到上一個版本是HEAD^,上上個是HEAD^^,以此類推,但是太多個我們不能準(zhǔn)確計數(shù),可以簡寫成HEAD~100
3)執(zhí)行版本回退 git reset --hard HEAD^
文件就可以回到上一步的狀態(tài)。注意:這里只是你本地的狀態(tài)改變了。版本庫里的狀態(tài)改變了。如果push了這個操作是不可以達到目的的。
那么現(xiàn)在問題來了,我后悔了怎么辦?產(chǎn)品又告訴你,還是后來的好,呵呵,現(xiàn)在是不是頭疼。
不要擔(dān)心,我們的git是很仁義的。
我們每一次的commit 都是有一個id的 ,就是git log 里面每個commit后面顯示的一串字符
現(xiàn)在找到這個id 有兩種情況
第一:命令行一直沒關(guān)那我可以直接找到那一步的id? 78705e8
第二:我關(guān)掉了命令行窗口,甚至關(guān)掉了電腦。這時候有一個命令
git reflog 記錄每一次的命令

這時候最前面的一列就是id,找到對應(yīng)的id ,可以看到這里顯示的id沒有那么長,這樣就夠用了,不用寫完整的id,當(dāng)然也不能只寫1或2個字。只要能夠表示到這個唯一的id就好。
現(xiàn)在有了id我們就可以找回我們想要的版本了。
四、git工作機制
4.1工作區(qū)和暫存區(qū)
前面說git add的時候,稍微提了下暫存區(qū),但是沒有細(xì)說。這一節(jié)我們來說說這個概念。首先要告訴你的是暫存區(qū)也是GIT相比較其他的版本控制系統(tǒng)(如svn)的不同的概念。
4.1.1 工作區(qū)
我們說的工作區(qū),就是我們自己電腦里可以看到的目錄。
4.1.2 暫存區(qū)
其實在這個工作區(qū)里面有一個隱藏的目錄.git,之前已經(jīng)教過大家怎么看了。這個東西并不是我們的工作區(qū),這是GIT的版本庫。
在GIT的版本庫里為我們存了很多的東西。其中最重要的就是這個暫存區(qū)(stage)。還有g(shù)it為我們自動創(chuàng)建的一個分支master,以及指向master的一個指針叫HEAD。
之前我們將文件往git的版本庫里添加的時候,分了兩部:
第一步:git add 把文件添加進去,之前說過這時候是放在了這個暫存區(qū)里,還沒有真的放在版本庫中。
第二部:git commit 提叫更改,這時候就把暫存區(qū)的內(nèi)容提交到了當(dāng)前的分支。
在創(chuàng)建Git的版本庫時,Git自動為我們創(chuàng)建了唯一一個master分支,所以我們執(zhí)行commit命令的時候就是提交到了master就是提交到了這個分支上。
4.2 管理修改
這里的管理修改是什么意思呢?是指git的又一個比其他版本控制系統(tǒng)優(yōu)秀的地方,git跟蹤并管理的是修改,而不是整個文件。
接下來我們來解釋這一點。
我們先來對我們的READMEA做一個修改,向里面添加一行內(nèi)容,然后執(zhí)行g(shù)it add *,然后我們再修改一下我們的README文件,現(xiàn)在直接提交 git commit -m ‘change’。這時候我們通過git status看下狀態(tài)
你會發(fā)現(xiàn)我么第二次的修改沒有被提交上,這是為什么呢?
我們來看一下我么 的操作流程:修改1 =》git add =》修改2 =》git commit
現(xiàn)在記住,git管理的是修改,使用git add命令是將修改1的修添加到了暫存區(qū),而不是將整個文件添加進去,當(dāng)我們第二次修改的時候,我們沒放在暫存區(qū),所以提交的時候只提交了第一次的修改。
不信的話我們來看下工作區(qū)和版本庫里最新版本的區(qū)別: git diff HEAD -- README
想提交第二次的修改可以使用再次的git add
4.3 撤銷修改 git checkout --? 和 git? reset? HEAD? file
現(xiàn)在我們原來有一個index.html文件,但是現(xiàn)在我們不需要了就把他刪除了,我們git status一下

提示我們有一個文件被刪除了,可是我們后悔了,
?git 提示我們git checkout -- file可以丟棄工作區(qū)的修改
現(xiàn)在我們執(zhí)行下 git checkout -- index.html,執(zhí)行完成后你會發(fā)現(xiàn)你的工作區(qū)中index.html文件又回來了
但是注意,當(dāng)我們把刪除提交到git add 暫存區(qū),還沒commit得時候這種方法就不行了,要把暫存區(qū)的修改撤銷掉 git reset HEAD file 放回工作區(qū)。之后再撤銷工作區(qū)的修改
撤銷修改總結(jié):
1)只改了工作區(qū)的文件或文件內(nèi)容的時候,想丟棄工作區(qū)的修改,直接git checkout -- file
2)改了工作區(qū)的文件或文件內(nèi)容,并且添加到了暫存區(qū),想丟棄修改需要兩步,
第一步:git reset HEAD file 撤銷暫存區(qū)修改,回到上一情況
第二部:撤銷工作區(qū)修改
3)已經(jīng)提交到了版本庫,commit 就要使用 git reset --hard HEAD^或者git reset --hard id
這些都是沒有推送到遠程庫(沒有執(zhí)行g(shù)it push)才可以。
4.4 刪除文件
如果我們真的想在版本庫中刪除一個文件,在工作區(qū)中刪除后,要先執(zhí)行 git rm file 然后再git commit
五、分支管理
我們知道在實際的開發(fā)過程中,我們肯定是很多人同時開發(fā),如果每個人都在同一條分支上,當(dāng)你的工作剛剛完成了50%,上傳到遠程服務(wù)器可能會導(dǎo)致項目無法運行,妨礙其他人的開發(fā)。不上傳又擔(dān)心會丟失項目文件,這個時候git為我們提供了一個很好的功能,就是分支管理。為每個人創(chuàng)建不同的分支,大加在開發(fā)過程中切換到不同的分支,將自己的工作提交到不同的分支上,最后當(dāng)工作完成時,再將分支合并。
5、1 創(chuàng)建合并分支
所有的分支的最終指向都是咱們之前提到過的master?,F(xiàn)在我們實際運行一下吧。
1、創(chuàng)建分支并切換到分支:git checkout -b 分支名稱。這里相當(dāng)于是創(chuàng)建分支: git branch 分支名稱 和切換分支:git checkout 分支名稱
例如:現(xiàn)在我要創(chuàng)建一個名為dev的分支執(zhí)行 git checkout -b dev 命令,就可以為我們創(chuàng)建這個分支并切換到這個分支中。
2、查看當(dāng)前分支 git branch。這條命令會為你展示出所有的分支,你所處的當(dāng)前分支,前面會有*標(biāo)識。分支創(chuàng)建切換完成后,我們提交和推送到遠端服務(wù)器的代碼和之前的一樣。直接運行g(shù)it ?branch就可以,不需要加任何路徑。
3、合并分支 git merge 分支名稱。要合并分支首先要切換回master分支 git checkout master,然后在master分支上合并你所做的分支工作,git merge dev。
4、刪除分支 git branch -d 分支名稱。合并完成后,我們可以放心大膽的刪除dev分支,git branch -d dev。
5、2 解決沖突
首先我們先通過一個例子來理解一下什么是沖突,再來說怎么解決。
1)我們準(zhǔn)備一個分支 dev,并且換到我們的新分支上 ,git checkout -b dev
2)現(xiàn)在我們將index.html文件的內(nèi)容區(qū)最后一行加上<div>A and B </div>
3)然后在分支上提交 git add * ==> git commit -m 'dev commit'
4)? 切換回主分支master ,git checkout master
5)現(xiàn)在將index.html內(nèi)容區(qū)最后一行加上 <div>A & B </div>
6)提交 git add * ==> git commit -m 'master commit'
7)現(xiàn)在我們來合并分支 git merge dev
這時候我們發(fā)現(xiàn)我們無法合并分支,沖突了.

我們可以直接查看我們的index.html文檔,這時候就可以看到?jīng)_突的代碼了。

現(xiàn)在我們已經(jīng)看到了沖突,知道了沖突是如何造成的,那么現(xiàn)在我們就來解決這個問題。
在這里為你標(biāo)記出來了分支的不同,這時候直接沖突的地方改成一致的就可以了。上圖中的代碼直接改為 <div>A and B </div> ,然后再次git add * ==> git commit -m 'master commit' ?,這時候再合并分支就沒有問題了。
上面說的是一個文件又沖突的時候我們可以直接找到文件修改,那么文件很多,改動的文件也多,不知道哪個沖突了怎么辦呢?
當(dāng)發(fā)生沖突的時候使用 git status 就可以告訴我我們沖突的文件啦!這時候我們根據(jù)提示去找文件就可以看到?jīng)_突的地方并進行修改了

六、在分支上解決bug
我們都知道,在開發(fā)的過程中是經(jīng)常會有,我么通常會在git的分支上解決bug,創(chuàng)建一個臨時的分支,解決完bug合并分支,然后刪除分支。如果說你正在開發(fā)其他的東西,還沒有開發(fā)完不能提交,這時候我們可以將開發(fā)分支工作先存儲起來。修改完在回來開發(fā)。但是這些說的都是有沒有提交的修改,如果提交了直接切換分支工作就可以。
1)保存當(dāng)前分支的工作 git stash
2)回到master分支,創(chuàng)建修復(fù)bug的分支。
3)修復(fù)完成,合并修復(fù)bug分支,刪除修復(fù)bug的分支
4)切換到工作分支,調(diào)出工作區(qū) git stash apply ,刪除存儲 git stash drop??梢院喜?條命令git stash pop 。
有多次存儲,然后會恢復(fù)指定工作區(qū)的方法,就是存儲后查看存儲區(qū)的工作列表git stash list,然后恢復(fù)指定的存儲 git stash apply stash@{0},不建議這么做。
強行刪除沒有合并的分支: git branch -D? 分支名稱
七、.gitignore
在實際工作的時候,有些文件可能不需要上傳,比如我們的一些配置文件,或者有些文件是不允許別人進行改動的,就是說其他人改動了也不會被提交上。這時候git提供了一個特殊的.gitignore文件,我們可以叫他為配置忽略文件,就是將你需要被忽略的文件名添加進去。
作為一個新手,看到到這里,應(yīng)該就可以應(yīng)對工作上的問題了。想深入了解git的話,推薦看廖雪峰的git教程。https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000