1. 程式人生 > >學習git筆記

學習git筆記

一,git歷史:

Linus在1991年建立了開源的Linux,因為Linux是開源的,所以Linux的壯大是靠全世界熱心的志願者參與的,這麼多人在世界各地為Linux編寫程式碼,那麼就要考慮如何管理這些程式碼,Linux最開始是手工的方式合併程式碼。但是隨著Linux發展不斷壯大,程式碼也越來越多,人工合併的方式不再現實,同時社群的弟兄們也對這種方式表達了強烈不滿。於是Linus選擇了一個商業的版本控制系統BitKeeper(出於人道主義精神,免費供其使用),在後來,安定團結的大好局面在2005年就被打破了,原因是Linux社群牛人聚集。於是就有人試圖破解BitKeeper的協議,但是被BitMover公司發現了(監控工作做得不錯!)於是BitMover公司怒了,要收回Linux社群的免費使用權。於是Linux花了兩週時間自己用C寫了一個分散式版本控制系統,這就是Git!

一個月之內,Linux系統的原始碼已經由Git管理了!牛是怎麼定義的呢?可以體會一下。

二,集中式和分散式版本控制系統區別:

·集中式版本控制系統代表有svn、cvs:

>> 集中式版本控制系統,版本庫是集中存放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以要先從中央伺服器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央伺服器。中央伺服器就好比是一個圖書館,你要改一本書,必須先從圖書館借出來,然後回到家自己改,改完了,再放回圖書館。

>> 缺點:集中式版本控制系統最大的毛病就是必須聯網才能工作,如果在區域網內還好,頻寬夠大,速度夠快,可如果在網際網路上,遇到網速慢的話,可能提交一個10M的檔案就需要5分鐘。

·分散式版本控制系統:git

>> 分散式管理系統沒有“中央伺服器”,每個人電腦都是一個完整的版本庫,所以工作的時候就不用連網了,但在實際開發中,分散式管理系統也有一臺充當“中央伺服器”的電腦。僅用來交換修改,沒有它照樣幹活只是交換不方便而已。

>> 優點不只是不用連網,而且Git有強大的分支管理。

三,使用(多次新增(git add) 一次提交(git commit)):

1,安裝:window下只需去官網下載即可。(https://git-for-windows.github.io),速度慢可以移至國內映象(https://github.com/waylau/git-for-win

)。ios,linux不考慮。

2,初始化倉庫

  只需在下載好的Git命令符中輸入:

  >> $ git init

3,自報家門:

  繼續在命令符中輸入(全域性配置):

  >> $ git config --global user.name "使用者名稱";

     $ git config --global user.email "郵箱";

3,跟蹤檔案:

  先建立一個檔案(readme.txt)

  >> $ git add readme.txt    //將檔案新增到暫存區

  取消跟蹤:

  >> $ git rm --cached 檔名

4,檢視跟蹤檔案:

  >> $ git status

5,提交檔案:

  >> $ git commit -m "本次提交的說明"   //把暫存區的所有內容提交到當前分支

6,檢視修改

  >> $ git diff

7,檢視日誌(從最近到最遠)

  >> $ git log

  縮寫:

  >> $ git log --pretty=oneline --abbrev-commit

8,退回某一個版本(HEAD表示當前版本)

 >> $ git reset --hard HEAD^

 想還原,後悔了怎麼辦?

 >> $ git reflog  //(記錄命令找到commit id)

 然後:

 >> $ git reset --hard [commit id]

 還原成功,我胡漢三又回來了。

9,刪除一個檔案

 >> $ git rm 檔名

 >> $ rm 檔名

——–本地的一次用Git建立檔案到提交檔案和時光穿梭已經完成。

四,遠端倉庫:

gitHub(相當於一臺自己的伺服器),可以用Git遠端連線(本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的),建立修改併發布自己的程式碼。

·第1步:建立SSH Key(開啟shell即Git Bash):

在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個檔案(id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。),如果已經有了,可直接跳到下一步。如果沒有則進行下面操作:

$ ssh-keygen -t rsa -C “git使用者名稱@example.com”

然後一路回車。

配置使用者名稱寫錯怎麼辦?

  $ git remote rm origin

  或者在本地git版本庫中修改config檔案。

·第2步:登陸GitHub,開啟“Account settings”,“SSH Keys”頁面:

然後,點“Add SSH Key”,填上任意Title,在Key文字框裡貼上id_rsa.pub檔案的內容.

點“Add Key”,你就應該看到已經新增的Key.

為什麼GitHub需要SSH Key?

  因為GitHub需要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支援SSH協議,所以,GitHub只要知道了你的公鑰,就可以確認只有你自己才能推送。

·第三步:在github上新建一個倉庫。title對應config檔案中的路徑。

·第四步:在本地倉庫中執行以下命令,建立連線

$ git remote add origin [email protected]:github使用者名稱/遠端倉庫名

·第五步:

$ git push -u origin master

由於遠端庫是空的,我們第一次推送master分支時,加上了-u引數,Git不但會把本地的master分支內容推送的遠端新的master分支,還會把本地的master分支和遠端的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。

下次修改後提交就可以這樣:

$ git push origin master

——–現在為止,本地庫與遠端庫就連線起來了。即可通過git push origin master上傳。

五,克隆遠端分支到本地/推送本地分支到遠端

克隆一個倉庫,首先必須知道遠端倉庫的地址(如github倉庫),然後使用git clone命令克隆。

Git支援多種協議,包括https,但通過ssh支援的原生git協議速度最快。

六,分支管理

$ git branch dev //建立分支(dev)

$ git checkout dev //切換到分支(dev)

$ git checkout -b dev //綜合寫法(建立並切換)

$ git branch //檢視當前分支

$ git merge dev //合併指定分支到當前分支,歷史無記錄。

$ git merge –no-ff -m “merge with no-ff” dev //–no-ff 表示合併分支時禁用Fast forward模式,歷史會有記錄。

$ git branch -d dev //刪除分支

$ git branch -D dev //刪除未合併的分支(強行刪除)

注意:Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。

七,解決衝突

當Git無法自動合併分支時,就必須首先解決衝突(手動解決)。解決衝突後,再提交,合併完成(注意:這裡無需在用命令合併一遍)。

Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容。

用>> $ git log –graph 命令可以看到分支合併圖。

八,修復bug

1,儲存當前工作區 >> $ git stash

2,新建分值issue-001 >> $ git checkout -b issue-001

3,修復中…

4,提交 >> $ git add * || git commit -m “”

5,切換到主分支 >> $ git checkout master

6,合併分支並刪除分支 >> $ git branch -d issue-001

7,檢視儲存的工作現場 >> $ git stash list

8,恢復當前工作區 >> $ git stash pop

九,多人協作

檢視遠端庫的資訊: >> g i t r e m o t e / git remote -v

推送分支: >> $ git push origin dev

·master分支是主分支,因此要時刻與遠端同步;

·dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠端同步;

·bug分支只用於在本地修復bug,就沒必要推到遠端了,除非老闆要看看你每週到底修復了幾個bug;

·feature分支是否推到遠端,取決於你是否和你的小夥伴合作在上面開發。

多人協作的工作模式通常是這樣:

1,在本地建立和遠端分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠端分支的名稱最好一致;

2,從本地推送分支 >> $ git push origin branch-name

3,如果推送失敗,則因為遠端分支比你的本地更新,需要先用git pull,試圖合併;

4,如果合併有衝突,則解決衝突,並在本地提交;

5,沒有衝突或者解決掉衝突後,再用git push origin branch-name推送就能成功!

注意:如果git pull提示“no tracking information”,則說明本地分支和遠端分支的連結關係沒有建立,用命令git branch --set-upstream branch-name origin/branch-name。