學習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
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
九,多人協作
檢視遠端庫的資訊: >> 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。