Git使用文档
Git使用文檔
文章目錄
- Git使用文檔
- 一.git簡介
- 1.產生歷史
- 2. git的兩大特點
- 3.安裝與配置
- 二、版本創建與回退
- 1.使用
- 2. 工作區和暫存區
- 3. 管理修改
- 4 撤銷修改
- 5 對比文件的不同
- 6 刪除文件
- 三、分支管理
- 1 概念
- 2 創建與合并分支
- 3案例:
- 4 解決沖突
- 5 分支管理策略
- 6 Bug分支
- 四、使用github
- 1 創建倉庫
- 2 添加ssh賬戶
- 3 克隆項目
- 4 上傳分支
- 5 將本地分支跟蹤服務器分支
- 6 從遠程分支上拉取代碼
史上最詳細的git使用文檔!如果看了還不會,就自己花兩周時間用C寫了一個分布式版本控制系統
一.git簡介
1.產生歷史
- git是目前世界上最先進的分布式版本控制系統。
Linus在1991年創建了開源的Linux,從此,Linux系統不斷發展,已經成為最大的服務器系統軟件了。Linus雖然創建了Linux,但Linux的壯大是靠全世界熱心的志愿者參與的,這么多人在世界各地為Linux編寫代碼,那Linux的代碼是如何管理的呢?
事實是,在2002年以前,世界各地的志愿者把源代碼文件通過diff的方式發給Linus,然后由Linus本人通過手工方式合并代碼!
你也許會想,為什么Linus不把Linux代碼放到版本控制系統里呢?不是有CVS、SVN這些免費的版本控制系統嗎?
因為Linus堅定地反對CVS和SVN,這些集中式的版本控制系統不但速度慢,而且必須聯網才能使用。
有一些商用的版本控制系統,雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。
不過,到了2002年,Linux系統已經發展了十年了,代碼庫之大讓Linus很難繼續通過手工方式管理了,社區的弟兄們也對這種方式表達了強烈不滿,
于是Linus選擇了一個商業的版本控制系統BitKeeper,BitKeeper的東家BitMover公司出于人道主義精神,授權Linux社區免費使用這個版本控制系統。
安定團結的大好局面在2005年就被打破了,原因是Linux社區牛人聚集,不免沾染了一些梁山好漢的江湖習氣。
開發Samba的Andrew試圖破解BitKeeper的協議(這么干的其實也不只他一個),被BitMover公司發現了(監控工作做得不錯!),于是BitMover公司怒了,要收回Linux社區的免費使用權。
Linus可以向BitMover公司道個歉,保證以后嚴格管教弟兄們,嗯,這是不可能的。實際情況是這樣的:Linus花了兩周時間自己用C寫了一個分布式版本控制系統,這就是Git!
一個月之內,Linux系統的源碼已經由Git管理了!牛是怎么定義的呢?大家可以體會一下。
Git迅速成為最流行的分布式版本控制系統,尤其是2008年,GitHub網站上線了,它為開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等
。歷史就是這么偶然,如果不是當年BitMover公司威脅Linux社區,可能現在我們就沒有免費而超級好用的Git了。
2. git的兩大特點
- 版本控制:可以解決多人同時開發的代碼問題,也可以解決找回歷史代碼的問題。
- 分布式:Git是分布式版本控制系統,同一個Git倉庫,可以分布到不同的機器上。
首先找一臺電腦充當服務器的角色,每天24小時開機,其他每個人都從這個“服務器”倉庫克隆一份到自己的電腦上,并且各自把各自的提交推送到服務器倉庫里,也從服務器倉庫中拉取別人的提交。可以自己搭建這臺服務器,也可以使用GitHub網站。
3.安裝與配置
(1)安裝命令如下:
sudo apt-get install git
(2)安裝成功后,運行如下命令:
(3).創建一個版本庫
- 新建一個目錄git_test,在git_test目錄下創建一個版本庫,命令如下:
可以看到在git_test目錄下創建了一個.git隱藏目錄,這就是版本庫目錄。
二、版本創建與回退
1.使用
(1)在git_test目錄下創建一個文件code.txt,編輯內容如下:
(2)使用如下兩條命令可以創建一個版本:
(3)使用如下命令可以查看版本記錄:
(5)使用如下命令再創建一個版本并查看版本記錄:
(6)現在若想回到某一個版本,可以使用如下命令:
- 其中HEAD表示當前最新版本
- HEAD^表示當前版本的前一個版本,HEAD^^表示當前版本的前前個版本,也可以使用HEAD~1表示當前版本的前一個版本
- HEAD~100表示當前版本的前100版本。
現在若覺得想回到版本1,可以使用如下命令:
執行命令后使用git log查看版本記錄,發現現在只能看到版本1的記錄,cat code.txt查看文件內容,現在只有一行,也就是第一個版本中code.txt的內容。
(7)假如我們現在又想回到版本2,這個時候怎么辦?
可以使用如下命令:
從上面可以看到版本2的版本號為:
(8)在終端執行如下命令:
現在發現版本2有回來了。可以cat code.txt查看其里面的內容如下:
(9)假如說上面的終端已經關了改怎么回退版本。
我們在執行如下命令將版本回退到版本1。
下面把終端關了,然后再打開終端,發現之前版本2的版本號看不到了。
那么怎么再回到版本2呢?git reflog命令可以查看我們的操作記錄。
可以看到版本2的版本號,我們再使用如下命令進行版本回退,版本重新回到了版本2。
2. 工作區和暫存區
- 2.1 工作區(Working Directory)
電腦中的目錄,比如我們的git_test,就是一個工作區。
- 2.2 版本庫(Repository)
- 工作區有一個隱藏目錄.git,這個不是工作區,而是git的版本庫。
- git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
- 因為我們創建git版本庫時,git自動為我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。
- 你可以簡單理解為,需要提交的文件修改通通放到暫存區,然后,一次性提交暫存區的所有修改。
前面講了我們把文件往git版本庫里添加的時候,是分兩步執行的: - 第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
- 第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
(1)下面在git_test目錄下再創建一個文件code2.txt,然后編輯內容如下:
(2)然后再次編輯code.txt內容,在其中加入一行,編輯后內容如下:
(3)使用如下命令查看當前工作樹的狀態:
上面提示我們code.txt被修改,而code2.txt沒有被跟蹤。
(4)我們使用如下命令把code.txt和code2.txt加入到暫存區,然后再執行git status命令,結果如下:
所有git add命令是把所有提交的修改存放到暫存區。
(5)然后,執行git commit就可以一次性把暫存區的所有修改提交到分支創建一個版本。
(6)一旦提交后,如果你又沒有對工作區做任何修改,那么工作區就是“干凈”的。執行如下命令可以發現:
現在我們的版本庫變成了這樣:
3. 管理修改
git管理的文件的修改,它只會提交暫存區的修改來創建版本。
編輯code.txt,并使用git add 命令將其添加到暫存區中。
(2)繼續編輯code.txt,并在其中添加一行。
(3)git commit創建一個版本,并使用git status查看,發現第二次修改code.txt內容之后,并沒有將其添加的工作區,所以創建版本的時候并沒有被提交。
4 撤銷修改
(1) 繼續上面的操作,提示我們可以使用 git checkout – <文件> 來丟棄工作區的改動。執行如下命令,發現工作區干凈了,第二次的改動內容也沒了。
(2)我們繼續編輯code.txt,并在其中添加如下內容,并將其添加的暫存區。
(3)git同樣告訴我們,用命令git reset HEAD file可以把暫存區的修改撤銷掉,重新放回工作區。
(4)現在若想丟棄code.txt的修改,執行如下命令即可。
小結:
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout – file。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節。
5 對比文件的不同
對比工作區和某個版本中文件的不同:
(1)繼續編輯文件code.txt,在其中添加一行內容。
(2)現在要對比工作區中code.txt和HEAD版本中code.txt的不同。使用如下命令:
(3)使用如下命令丟棄工作區的改動。
對比兩個版本間文件的不同:
- 現在要對比HEAD和HEAD^版本中code.txt的不同,使用如下命令:
6 刪除文件
(1) 我們把目錄中的code2.txt刪除。
這個時候,git知道刪除了文件,因此,工作區和版本庫就不一致了,git status命令會立刻提示哪些文件被刪除了。
(2)現在你有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令git rm刪掉,并且git commit:
另一種情況是刪錯了,可以直接使用git checkout – code2.txt,這樣文件code2.txt又回來了。
小結:
命令git rm用于刪除一個文件。如果一個文件已經被提交到版本庫,那么你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交后你修改的內容。
三、分支管理
1 概念
- 分支就是科幻電影里面的平行宇宙,當你正在電腦前努力學習Git的時候,另一個你正在另一個平行宇宙里努力學習SVN。
- 如果兩個平行宇宙互不干擾,那對現在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合并了,結果,你既學會了git又學會了SVN!
- 分支在實際中有什么用呢?假設你準備開發一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由于代碼還沒寫完,不完整的代碼庫會導致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險。
- 現在有了分支,就不用怕了。你創建了一個屬于你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人工作。
2 創建與合并分支
git把我們之前每次提交的版本串成一條時間線,這條時間線就是一個分支。截止到目前只有一條時間線,在git里,這個分支叫主分支,即master分支。HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。
(1) 一開始的時候,master分支是一條線,git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點:
每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長。
(2)當我們創建新的分支,例如dev時,git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:
git創建一個分支很快,因為除了增加一個dev指針,改變HEAD的指向,工作區的文件都沒有任何變化。
(3)不過,從現在開始,對工作區的修改和提交就是針對dev分支了,比如新提交一次后,dev指針往前移動一步,而master指針不變:
(4)假如我們在dev上的工作完成了,就可以把dev合并到master上。git怎么合并呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合并:
git合并分支也很快,就改改指針,工作區內容也不變。
(5)合并完分支后,甚至可以刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉后,我們就剩下了一條master分支:
3案例:
(1)執行如下命令可以查看當前有幾個分支并且看到在哪個分支下工作。
(2)下面創建一個分支dev并切換到其上進行工作。
(3)下面我們修改code.txt內容,在里面添加一行,并進行提交。
(4)dev分支的工作完成,我們就可以切換回master分支:
查看code.txt,發現添加的內容沒有了。因為那個提交是在dev分支上,而master分支此刻的提交點并沒有變:
(5)現在,我們把dev分支的工作成果合并到master分支上:
git merge命令用于合并指定分支到當前分支。合并后,再查看code.txt的內容,就可以看到,和dev分支的最新提交是完全一樣的。
注意到上面的Fast-forward信息,Git告訴我們,這次合并是“快進模式”,也就是直接把master指向dev的當前提交,所以合并速度非常快。
(6)合并完成后,就可以放心地刪除dev分支了,刪除后,查看branch,就只剩下master分支了。
小結:
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合并某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
4 解決沖突
合并分支往往也不是一帆風順的。
(1)再創建一個新分支dev。
(2)修改code.txt內容,并進行提交。
(3)切換回master分支。
(4)在master的code.txt添加一行內容并進行提交。
現在,master分支和dev分支各自都分別有新的提交,變成了這樣:
這種情況下,git無法執行“快速合并”,只能試圖把各自的修改合并起來,但這種合并就可能會有沖突。
(5)執行如下命令嘗試將dev分支合并到master分支上來。
git告訴我們,code.txt文件存在沖突,必須手動解決沖突后再提交。
(6)git status也可以告訴我們沖突的文件:
(7)查看code.txt的內容。
(8)git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,我們修改如下后保存:
(9)再提交。
(10)現在,master分支和dev分支變成了下圖所示:
(11)用帶參數的git log也可以看到分支的合并情況:
(12)最后工作完成,可以刪除dev分支。
5 分支管理策略
通常,合并分支時,如果可能,git會用fast forward模式,但是有些快速合并不能成而且合并時沒有沖突,這個時候會合并之后并做一次新的提交。但這種模式下,刪除分支后,會丟掉分支信息。
(1)創建切換到dev分支下。
(2)新建一個文件code3.txt編輯內容如下,并提交一個commit。
(3)切換回master分支,編輯code.txt并進行一個提交。
(4)合并dev分支的內容到master分支。
(5)出現如下提時,這是因為這次不能進行快速合并,所以git提示輸入合并說明信息,輸入之后合并內容之后git會自動創建一次新的提交。
(6)使用分支命令查看分支信息。
(7)刪除dev分支。
如果要強制禁用fast forward模式,git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。
(1)創建并切換到dev分支。
(2)修改code.txt內容,并提交一個commit。
(3)切換回master分支。
(4)準備合并dev分支,請注意–no-ff參數,表示禁用Fast forward:
因為本次合并要創建一個新的commit,所以加上-m參數,把commit描述寫進去。
(5)合并后,我們用git log看看分支歷史:
可以看到,不使用Fast forward模式,merge后就像這樣:
6 Bug分支
軟件開發中,bug就像家常便飯一樣。有了bug就需要修復,在git中,由于分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復后,合并分支,然后將臨時分支刪除。
(1)當你接到一個修復一個代號001的bug的任務時,很自然地,你想創建一個分支bug-001來修復它,但是,等等,當前正在dev上進行的工作還沒有提交:
并不是你不想提交,而是工作只進行到一半,還沒法提交,預計完成還需1天時間。但是,必須在兩個小時內修復該bug,怎么辦?
(2)git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以后恢復現場后繼續工作:
(3)首先確定要在哪個分支上修復bug,假定需要在master分支上修復,就從master創建臨時分支:
(4)現在修復bug,把 the new line刪掉,然后提交。
(5)修復完成后,切換到master分支,并完成合并,最后刪除bug-001分支
(6)現在bug-001修復完成,是時候接著回到dev分支干活了!
(7)工作區是干凈的,剛才的工作現場存到哪去了?用git stash list命令看看:
作現場還在,git把stash內容存在某個地方了,但是需要恢復一下.
小結:
修復bug時,我們會通過創建新的bug分支進行修復,然后合并,最后刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然后去修復bug,修復后,再git stash pop,恢復工作現場。
四、使用github
1 創建倉庫
2 添加ssh賬戶
(1)點擊賬戶頭像后的下拉三角,選擇’settings’
如果某臺機器需要與github上的倉庫交互,那么就要把這臺機器的ssh公鑰添加到這個github賬戶上
點擊’SSH and GPG keys’,添加ssh公鑰。
(2)在ubuntu的命令行中,回到用戶的主目錄下,編輯文件.gitconfig,修改某臺機器的git配置。
(3)修改為注冊github時的郵箱,填寫用戶名。
(4)使用如下命令生成ssh密鑰。
(5)進入主目錄下的.ssh文件件,下面有兩個文件。
- 公鑰為id_rsa.pub
- 私鑰為id_rsa
查看公鑰內容,復制此內容
(6)回到瀏覽器中,填寫標題,粘貼公鑰
3 克隆項目
(1)在瀏覽器中點擊進入github首頁,再進入項目倉庫的頁面
(2)復制git地址
(3) 克隆出錯
(4)在命令行中復制倉庫中的內容
4 上傳分支
(1)項目克隆到本地之后,執行如下命令創建分支smart.
(2)創建一個code.txt并提交一個版本。
(3)推送前github上文件列表如下圖
(4)推送前github上分支列表如下圖
(5)推送分支,就是把該分支上的所有本地提交推送到遠程庫,推送時要指定本地分支,這樣,git就會把該分支推送到遠程庫對應的遠程分支上
(6)再去github網站上去看分支頁面,內容如下。
5 將本地分支跟蹤服務器分支
git branch --set-upstream-to=origin/遠程分支名稱 本地分支名稱 例: git branch --set-upstream-to=origin/smart smart6 從遠程分支上拉取代碼
git pull orgin 分支名稱 例: git pull orgin smart使用上述命令會把遠程分支smart上的代碼下載并合并到本地所在分支。
總結
- 上一篇: Git/SQL/正则表达式练习平台
- 下一篇: 剑指offer--剪绳子