一、Git是什么
1.Git是目前世界上最先進的分布式版本管理系統
2.工作原理/流程
workspace:工作區
Index/Stage:暫存區
Repository:倉庫區(本地倉庫)
Remote:遠程倉庫
二、SVN和Git的最主要的區別
1.SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而干活的時候,用的都是自己的電腦,所以首先要從中央服務器那里得到最新的版本,然后干活,干完后,需要把自己做的活推送到中央服務器,集中式版本控制系統是必須聯網才能工作,如果在局域網中還可以,帶寬夠大,速度夠快,如果是在互聯網中,如果網速慢的話,就納悶了。
2.Git是分布式版本控制系統,它沒有中央服務器,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都在自己的電腦上,既然每個人的電腦都有一個完整的版本庫,那么多人如何協作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們倆之間只需要把各自修改推送給對方,就可以看到對方修改了。
三、Git的安裝
1.比較傻瓜化,一路向前一下步即可。
四、如何操作Git
1.創建版本庫
什么是版本庫,版本庫又名倉庫,英文名Repository,你可以簡單的理解就是一個目錄,只是這個目錄里面的所有文件都被Git管理起來了,每個文件的修改、刪除,Git都能跟蹤,一般任何時刻都可以追蹤歷史,或者在將來的某個時刻將文件“還原”。
所以創建版本庫也比較簡單,比如在某一個盤下面新建一個文件夾”testgit”作為版本庫,例如在F盤創建一個testgit文件夾,然后右鍵該文件夾使用”Git Bash Here”打開:
然后在Git的命令窗口中運行”git init”將當前的testgit目錄初始化成Git可以管理的倉庫,如下:
此時,在testgit目錄下會多一個”.git”的隱藏目錄,這個目錄是Git用來跟蹤和管理版本的,不要亂動這個目錄的文件,否則會將Git倉庫破壞掉:
2.把文件添加到版本庫
在testgit目錄下新建一個文件readme.txt,輸入內容:111111111111111111
第一步:使用”git add readme.txt”將文件添加到暫存區(Index/Stage)
第二步:使用命令”git commit”將暫存區的文件提交給本地倉庫(倉庫/版本庫)
-m后面的文字是注釋
此時,我們可以使用”git status”命令來查看是否還有其他文件沒有提交給本地倉庫:
說明沒有任何文件未提交
現在我們繼續修改readme.txt,比如添加一行222222222222222,繼續使用”git status”來查看:
上面的命令告訴我們readme.txt文件已經被修改,但是沒有添加到暫存區從而可以提交給本地倉庫,如果我們想看看readme.txt文件到底修改了哪些內容,可以使用如下命令:git diff readme.txt
可以看到,readme.txt增加了22222222222222222的內容,知道了readme.txt修改了什么內容之后,我們就可以將其提交給倉庫,提交修改的方式和提交文件的方式相同:
總結:
添加新文件或修改文件:
1. 添加到暫存區:git add 文件名
2. 提交到本地倉庫:git commit -m ‘注釋’
五、版本回退
之前我們已經學習了修改文件,現在我們繼續修改readme.txt,再增加一行33333333333333,繼續add和commit:
現在我們已經對readme.txt進行了3次修改,那么我們想查看一下歷史記錄,如何查看呢?我們可以使用”git log”來查看:
“git log”命令顯示從近到遠的日志,最近一次是增加33333333333333,上一次是添加22222222222222,第一次是默認的111111111111111,如果覺得日志顯示內容太多,可以使用命令”git log --pretty=oneline”:
現在我們想使用版本回退功能,把當前版本回退到上一個版本,可以使用如下兩個命令:
第一種:”git reset --hard HEAD^”,表示回退到上一個版本,要回退到上上版本,就把HEAD^改為HEAD^^,以此類推,如果要回退100個版本,這種方式肯定不方便,可以使用第二種方式。
第二種:”git reset --hard HEAD~100”,回退到之前的第100個版本
示例:
當然我們可以繼續使用”git log”來查看當前的歷史記錄:
我們可以看到增加3333333333333的歷史記錄不見了,但是現在我們又想回退到最新的版本,我們可以通過“版本號”回退,使用命令:”git reset --hard 版本號”,現在的問題是如何獲取版本號,我們可以通過”git reflog”來查看版本號:
我們可以看到,增加3333333333333的版本號是:2fa4a8e,現在我們可以通過命令來恢復:
現在我們又恢復到了增加3333333333333333的版本上了。
總結:
回退版本:git reset --hard HEAD^,git reset --hard HEAD~100
查看歷史記錄:git log,git log --pretty=oneline
查看版本:git reflog
回退到指定版本:git reset --hard 版本號
六、理解工作區和暫存區的區別
1.工作區:就是你電腦上看到的目錄,比如目錄testgit里面的文件(.git隱藏目錄版本庫除外),或者以后需要再新建的目錄文件等等都是屬于工作區范疇。
2.版本庫:Repository,工作區中有一個隱藏目錄.git,這個不屬于工作區,是版本庫,其中包含了很多東西,其中最重要的就是stage(暫存區),還有Git為我們自動創建的第一個分支master,以及指向master分支的一個指針HEAD。
我們前面說明使用Git提交文件到版本庫有兩步:
第一步:使用”git add”把文件添加到暫存區
第二步:使用”git commit”將暫存區的內容提交到版本(本地倉庫)的當前分支上
現在我們在readme.txt中增加444444444444444444內容,并且在該目錄中新加文件test.txt,先用”git status”查看一下狀態:
然后我們使用”git add”將兩個文件都添加到暫存區,再使用”git status”查看:
接著使用”git commit”一次性將兩個文件都提交到當前分支:
所以我們總結出來,不管是第一次創建文件,還是修改文件,還是新增文件,處理方式都一致,都是add之后commit就行。
七、Git撤銷修改和刪除文件操作
1.撤銷修改
比如我們在readme.txt中增加一行555555555555555555,先通過命令查看一下:
在還沒有提交之前,我們發現添加的5555555555555555有錯,需要恢復到以前的版本,可以有如下做法:
(1)如果我們知道要刪除哪些內容的話,直接手動修改文件,然后再add到暫存區,最后commit掉
2.刪除文件
假如版本庫testgit目錄中添加了一個文件b.txt,然后提交:
我們可以直接在目錄下刪除文件:
再運行git status:
可以看到b.txt文件已經被刪除,此時有兩種選擇:一種是直接commit掉,二是從版本庫中恢復被刪除的文件。
一般情況下,可以直接在文件目錄中將文件刪除,如果想徹底從版本庫中刪除此文件的話,可以再運行commit命令提交,只要沒有commit之前,我們可以通過”git checkout -- 文件名”就可以恢復被刪除的文件:
如果想徹底刪除:
從暫存區刪除:
提交版本庫:
總結:
已經提交的文件被刪除
恢復:git checkout -- 文件名
徹底刪除:
暫存庫刪除:git rm 文件名
提交:git commit -m ‘注釋’
八、遠程倉庫
如何添加遠程倉庫:
現在的場景是:我們已經在本地創建了Git倉庫,又想在Gitee(碼云)(或GitHub(國外))上創建Git的遠程倉庫,并且希望這兩個倉庫同步,這樣Gitee的遠程倉庫可以作為備份,其他人也可以通過該遠程倉庫來協作。
首先,注冊Gitee,登陸Gitee,創建一個新的倉庫:
因為Git是分布式版本控制系統,所以需要填寫用戶名和郵箱來作為一個標識,注意:git config --global參數,有了這個參數,標識你的機器上的所有的Git倉庫都會使用這個配置,當然你可以對某個倉庫指定不同的用戶名和郵箱:
現在我們對本地倉庫進行Git全局設置:
然后給Git指定遠程個倉庫的地址:git remote add origin 遠程倉庫的URL地址,URL地址在這里:
我們把之前testgit目錄下的所有文件commit到本地倉庫:
當所有文件都add到暫存區,并且commit到本地倉庫后,就可以使用push命令把本地倉庫的內容推送到遠程倉庫,而上面設置的就是遠程倉庫的地址:(第一次推送的時候要加上-u參數)
注意:有時候要輸入用戶名和密碼:你需要輸入你注冊Gitee的手機號和密碼
到遠程倉庫看一下:
把本地倉庫的內容推送到遠程倉庫,使用”git push”命令,實際上是把當前分支master推送到遠程,由于遠程是空的,所以第一次推送master分支的時候,要加上”-u”參數,Git不但會把本地的master分支內容推送到遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或拉取時就可以簡化命令。從現在起,只要本地做了提交commit,就可以通過”git push origin master”把本地的master分支的最新修改推送到Gitee遠程倉庫上,現在你就擁有了真正的分布式版本庫了。
如何從遠程倉庫克隆到本地:
假如遠程倉庫有新的內容,我們想克隆到本地,如何克隆?首先登陸Gitee,創建一個新的倉庫,名叫testgit2,并添加文件到倉庫中:
點擊“初始化readme.txt”生成遠程倉庫的新文件:
此時,遠程倉庫就準備好了,下一步使用”git clone”克隆一個本地庫,首先在本地創建一個testgit2文件夾,然后在該文件夾中克隆:
克隆的地址在這里:
此時我們就可以在克隆的目錄中進行修改,然后再add,commit,push到遠程倉庫
遠程倉庫:
九、創建合并分支
1.在版本回退里,我們知道,每次提交,Git都把它們串成一條時間線,這條時間線就是第一個分支,到目前為止,我們只有一條時間線,在Git中這個分支(時間線)叫做主分支,即master分支,HEAD嚴格來說不是指向提交,而是指向master,而master才是指向提交的,所以HEAD指向的就是當前分支。
(1)首先我們來創建dev分支,然后切換到dev分支(使用之前的testgit倉庫):
?
查看分支:
其中”git checkout”命令加上”-b”參數表示創建并切換分支,相當于執行了如下兩條命令:
git branch dev #創建dev分支
git checkout dev #切換到dev分支
git branch命令會列出所有的分支,并且當前分支前面有一個”*”。
(2)然后我們在dev分支繼續做,比如現在給readme.txt增加6666666666666
(3)現在dev分支工作已經完成,現在我們切換到master分支,繼續查看readme.txt內容
發現沒有66666666666666內容,因為現在不是dev分支
十、分支管理策略
通常合并分支時,Git一般使用”Fast forward”模式,在這種模式下,刪除分支后,會丟掉分支信息,我們可以使用帶參數”--no-ff”禁用”Fast forward”模式。
(1)現在我們可以將dev分支的內容合并到master分支,使用命令”git merge dev”:
“git merge”命令用于合并指定分支到當前分支,合并后,再查看readme.txt內容,可以看到和dev分支最新提交的內容完全一致。
注意到上的”Fast-forward”信息,Git告訴我們,這次合并使用”快進方式”,也就是直接把master分支指向dev的當前提交,所以合并速度非常快,合并完成之后,我們就可以把dev分支刪除了:
(2)如何解決分支的沖突?
我們新建一個分支,名叫fenzhi1,然后在readme.txt中添加一行7777777777777777,然后提交:
同樣,切換到master分支,也在最后一行增加88888888888888888
現在我們在master分支上合并fenzhi1:
查看merge之后的文件,發現Git使用<<<<<<<<,========,>>>>>>>>>標記出不同分支的內容,其中<<<<<<<<<<HEAD是指主分支內容,>>>>>>>>>fenzhi1是指fenzhi1上修改的內容,我們可以手動修改文件之后提交:
如果我們想查看分支合并的情況的話,可以使用”git log”:
十一、Bug分支
在開發過程中,經常會碰到bug,那么有了bug就要修復,在Git中,分支是很強大的,每個bug都可以通過一個臨時分支來修復,修改完成后,合并分支,然后將臨時分支刪除掉。
比如我們在開發過程中遇到了一個404 bug的時候,可以創建一個404分支來修復它,但是當前dev分支上還有工作沒有提交,比如:
并不是我們不想commit這個dev分支,而是工作進行了一半,還不能提交,比如dev分支還需要2天完成,但是issue-404的bug需要5小時內完成,那怎么辦呢?Git還提供了一個stash的功能,可以將當前的工作現場”隱藏起來”,等到以后要用的時候恢復現場繼續工作,例如:
此時查看dev分支的狀態,發現所有內容已經提交,是干凈的。
現在我們就可以創建issue-404分支來修復404的bug了
首先我們要確定在哪個分支上修改bug,比如我們現在是在主分支master上來修復的,所以要在master分支上創建一個臨時分支issue404:
?
修復bug完成之后,切換到master分支,完成合并,最后刪除issue-404分支:
切換到master分支,然后禁用了”Fast Forward”模式的前提下進行issue-404分支merge到master分支,然后刪除issue-404分支。
現在我們可以回到dev分支繼續干活:
運行”git status”發現dev分支是干凈的,那么我們的工作現場在哪里呢?我們可以使用命令”git stash list”來查看:
工作現場還在,Git把stash內容存在了某個地方,需要恢復一下,有兩種方法恢復現場:
1)”git stash apply”恢復后,在使用”git stash drop”刪除
2)“git stash pop”恢復現場的同時把stash內容刪除
然后我們就可以在dev分支上繼續做后面的工作了。
十二、多人協作‘
當你從遠程倉庫克隆的時候,實際上Git自動把本地的master分支和遠程的master分支對應起來,并且遠程庫默認的名稱是origin
查看遠程庫的信息使用:git remote,如果要查看詳細信息:git remote -v
1. 推送分支
推送分支就是把該分支上的所有本地內容提交到遠程庫中,推送時,要指定本地分支,這樣Git就會把該分支推送到遠程對應的分支上,使用命令:git push origin master
比如本地的readme.txt:
遠程倉庫:
現在我們想把本地更新的readme.txt推送到遠程倉庫,可以使用如下命令:
遠程庫:
?
可以看到推送成功,如果我們現在要推送到其他分支,比如dev分支,那么還是這個命令:
git push origin dev
那么一般情況下,哪些分支要推送呢?
master是主分支,因此要與遠程同步,一些修復bug的分支不需要推送到遠程,可以先合并到主分支(master),然后再把主分支master推送到遠程去。
2. 抓取分支
多人協作時,大家都會往master分支推送各自的修改,現在我們可以模擬另一個同事,可以在另外一臺電腦或同一個電腦的另一個目錄中克隆,新建目錄名為testgit2,接著進入testgit2目錄,進行克隆遠程庫到本地來:
如下目錄:
現在我們的同事要在dev分支上做開發,就必須把遠程的origin的dev分支弄到本地來,于是可以使用命令創建dev分支:git checkout -b origin/dev
首先我們需要將dev分支推送到遠程倉庫(在testgit目錄中完成):
遠程倉庫:
其次使用”git checkout -b dev origin/dev”命令把遠程origin庫的dev分支弄到本地來(在testgit2目錄中完成)
如果命令運行出錯,則運行”git fetch origin”進行遠程同步即可
修改readme.txt(在testgit2中):
遠程倉庫:
同事已經向origin/dev分支推送了修改內容,而我的目錄文件中也對同一個地方做修改,也試圖推送到遠程庫時,如下:
由上可知:推送失敗,因為我的同事最新提交的和我試圖推送的有沖突,解決辦法也很簡單,上面已經給出提示了,先用”git pull”把最新的提交從”origin/dev”抓取下來,然后在本地合并,解決沖突,再推送:
git pull也失敗了,原因是沒有指定本地dev分支與遠程origin/dev分支的連接,根據提示,設置本地dev分支和遠程origin/dev的連接:
這會”git pull”成功了,并且提示合并有沖突,需要手動解決,解決辦法和分支管理中解決沖突的辦法一致,解決沖突后,在提交,再push到遠程庫:
現在我們已經手動將沖突解決了,所以可以再次提交,再次push:
遠程庫:
因此,多人協作的工作模式一般是這樣的:
首先:可以試圖使用”git push origin 分支名”去推送自己的修改,如果推送失敗,則因為遠程分支比你本地更新的早,需要先試用”git pull”試圖合并,如果合并有沖突,則手動解決沖突,然后在本地再次提交,再次”git push origin 分支名”去推送。多人遠程協作的經驗就是,先pull之后進行本地修改,改完再去提交和push。