@(前端開發)[Git|工具]
之前也看過一些關於git的視頻,但是以爲本身一直都沒有真的理解和掌握git,花了一天半的時間,看完了廖雪峯老師的Git教程,並動手實踐了一下,才以爲本身是真的對git入門了,看的過程當中也作了一些筆記,也就是下文啦。前端
功能:
Git是目前世界上最早進的分佈式版本控制系統(沒有之一)。
歷史:git
1991 Linux建立Linux,須要管理github
2002年之前,Linux手動合併開發者提供的代碼shell
2002~2005:BitMover公司的BitKeeper免費給Linux使用bootstrap
2005開發Samba的Andrew試圖破解BitKeeper的協議,被BitMover公司發現了,要收回Linux社區的無償使用權。緩存
Linus花了兩週時間本身用C寫了一個分佈式版本控制系統-Git,一個月以後Linux源碼由此代理安全
2008年Github上線,爲開源項目提供免費Git存儲bash
集中式的版本控制系統:CVS,SVN
服務器
運行方式:版本庫是集中存放在中央服務器的,而幹活的時候,用的都是本身的電腦,因此要先從中央服務器取得最新的版本,而後開始幹活,幹完活了,再把本身的活推送給中央服務器。
缺點:集中式版本控制系統最大的毛病就是必須聯網才能工做網絡
分佈式:Git
運行方式:每一個人的電腦上都是一個完整的版本庫,你在本身電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時,大家倆之間只需把各自的修改推送給對方,就能夠互相看到對方的修改了。
分佈式版本控制系統一般也有一臺充當「中央服務器」的電腦,但這個服務器的做用僅僅是用來方便「交換」你們的修改,沒有它你們也同樣幹活,只是交換修改不方便而已。
輸入git
,看看系統有沒有安裝Git:
sudo apt-get install git
就能夠直接完成Git的安裝
兩種方法:
第一種安裝homebrew
,而後經過homebrew安裝Git,具體方法請參考homebrew的文檔:http://brew.sh/。
第二種方法更簡單,也是推薦的方法,就是直接從AppStore安裝Xcode,Xcode集成了Git,不過默認沒有安裝,你須要運行Xcode,選擇菜單「Xcode」->「Preferences」,在彈出窗口中找到「Downloads」,選擇「Command Line Tools」,點「Install」就能夠完成安裝了。
msysgit是Windows版的Git,從http://msysgit.github.io/下載,而後按默認選項安裝便可。
安裝完成後,在開始菜單裏找到「Git」->「Git Bash」,蹦出一個相似命令行窗口的東西,就說明Git安裝成功!
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
版本庫:
版本庫又名倉庫,英文名repository,你能夠簡單理解成一個目錄,這個目錄裏面的全部文件均可以被Git管理起來,每一個文件的修改、刪除,Git都能跟蹤,以便任什麼時候刻均可以追蹤歷史,或者在未來某個時刻能夠「還原」。
$ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit
pwd
命令用於顯示當前目錄;
mkdir learngit
用於建立一個空目錄;
經過git init
命令把這個目錄變成Git能夠管理的倉庫:
將文件添加到版本庫:
全部的版本控制系統,其實只能跟蹤文本文件的改動,好比TXT文件,網頁,全部的程序代碼等等,Git也不例外。版本控制系統能夠告訴你每次的改動,好比在第5行加了一個單詞「Linux」,在第8行刪了一個單詞「Windows」。而圖片、視頻這些二進制文件,雖然也能由版本控制系統管理,但無法跟蹤文件的變化,只能把二進制文件每次改動串起來,也就是隻知道圖片從100KB改爲了120KB,但到底改了啥,版本控制系統不知道,也無法知道。
新建一個文件:必定要放到learngit目錄下(子目錄也行),由於這是一個Git倉庫,放到其餘地方Git再厲害也找不到這個文件。
git add
:用命令git add告訴Git,把文件添加到倉庫:
git commit
:用命令git commit告訴Git,把文件提交到倉庫:$ git commit -m "wrote a readme file"
要隨時掌握工做區的狀態,使用git status
命令。
若是git status
告訴你有文件被修改過,用git diff
能夠查看修改內容。
git log
:顯示從最近到最遠的提交日誌;
git log --pretty=oneline
:顯示簡要版的提交日誌;
commit id(版本號)已3628164...882e1e0
方式顯示,是一個SHA1計算出來的一個很是大的數字,用十六進制表示,防止多人協做時產生衝突;
git reset --hard HEAD^
:返回上一個版本,HEAD
表示當前版本,HEAD^^表示上上個版本
,也能夠用相似於HEAD~3
來表示要回退到哪個版本。
$ git reset --hard 3628164
:後面的數字是版本號,此方法能夠隨意跳轉
Git的版本回退速度很是快,由於Git在內部有個指向當前版本的HEAD指針,當你回退版本的時候,Git僅僅是把HEAD從指向另外一個版本
git reflog
:記錄全部的操做,能夠經過此查詢版本號;
工做區(Working Directory):
就是你在電腦裏能看到的目錄,好比個人learngit文件夾就是一個工做區:
版本庫(Repository)
工做區有一個隱藏目錄.git,這個不算工做區,而是Git的版本庫。
Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage
(或者叫index
)的暫存區,還有Git爲咱們自動建立的第一個分支master
,以及指向master
的一個指針叫HEAD
。
提交變動的兩個步驟:
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的全部內容提交到當前分支。
你能夠簡單理解爲,須要提交的文件修改統統放到暫存區,而後,一次性提交暫存區的全部修改。
git add
命令實際上就是把要提交的全部修改放到暫存區(Stage),而後,執行git commit
就能夠一次性把暫存區的全部修改提交到分支。
若是同一個文件有屢次修改,須要每次都add到緩存庫,否則提交無效
每次修改,若是不add到暫存區,那就不會加入到commit中。
場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file。
場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操做。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。
刪除文件的兩種方法:
直接從本地刪除
使用rm test.txt
刪除以後會出現兩種狀況:
從版本庫恢復:git checkout -- test.txt
從版本庫也刪除:git rm test.txt
而後git commit
總結「checkout」:git checkout
實際上是用版本庫裏的版本替換工做區的版本,不管工做區是修改仍是刪除,均可以「一鍵還原」。
命令git rm
用於刪除一個文件。若是一個文件已經被提交到版本庫,那麼你永遠不用擔憂誤刪,可是要當心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容。
Git的殺手功能之一
實際狀況每每是這樣,找一臺電腦充當服務器的角色,天天24小時開機,其餘每一個人都從這個「服務器」倉庫克隆一份到本身的電腦上,而且各自把各自的提交推送到服務器倉庫裏,也從服務器倉庫中拉取別人的提交。
在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,若是已經有了,可直接跳到下一步。若是沒有,打開Shell(Windows下打開Git Bash),建立SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
Your identification has been saved in /Users/zhangwang/.ssh/id_rsa. Your public key has been saved in /Users/zhangwang/.ssh/id_rsa.pub.
若是一切順利的話,能夠在用戶主目錄裏找到.ssh目錄,裏面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,能夠放心地告訴任何人。
登錄GitHub,打開「Account settings」,「SSH Keys」頁面:
而後,點「Add SSH Key」,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容:
爲何GitHub須要SSH Key呢?
由於GitHub須要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,因此,GitHub只要知道了你的公鑰,就能夠確認只有你本身才能推送。
在GitHub上免費託管的Git倉庫,任何人均可以看到喔(但只有你本身才能改)。因此,不要把敏感信息放進去。
若是你不想讓別人看到Git庫,有兩個辦法,一個是交點保護費,讓GitHub把公開的倉庫變成私有的,這樣別人就看不見了(不可讀更不可寫)。另外一個辦法是本身動手,搭一個Git服務器,由於是你本身的Git服務器,因此別人也是看不見的。這個方法咱們後面會講到的,至關簡單,公司內部開發必備。
要關聯一個遠程庫,使用命令git remote add origin git@server-name:path/repo-name.git
;
關聯後,使用命令git push -u origin master
第一次推送master分支的全部內容;
此後,每次本地提交後,只要有必要,就可使用命令git push origin master
推送最新修改;
分佈式版本系統的最大好處之一是在本地工做徹底不須要考慮遠程庫的存在,也就是有沒有聯網均可以正常工做,而SVN在沒有聯網的時候是拒絕幹活的!當有網絡的時候,再把本地提交推送一下就完成了同步,真是太方便了!
1.克隆一個遠程庫:$ git clone git@github.com:servername/gitskills.git
若是有多我的協做開發,那麼每一個人各自從遠程克隆一份就能夠了。
GitHub給出的地址不止一個,還可用https://github.com/michaelliao/gitskills.git這樣的地址。實際上,Git支持多種協議,默認的git://使用ssh,但也可使用https等其餘協議。
使用https除了速度慢之外,還有個最大的麻煩是每次推送都必須輸入口令,可是在某些只開放http端口的公司內部就沒法使用ssh協議而只能用https。
小結:
要克隆一個倉庫,首先必須知道倉庫的地址,而後使用git clone命令克隆。
Git支持多種協議,包括https,但經過ssh支持的原生git協議速度最快。
什麼是分支咧?
分支就是科幻電影裏面的平行宇宙,當你正在電腦前努力學習Git的時候,另外一個你正在另外一個平行宇宙裏努力學習SVN。
若是兩個平行宇宙互不干擾,那對如今的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合併了,結果,你既學會了Git又學會了SVN!
分支有啥做用咧?
你建立了一個屬於你本身的分支,別人看不到,還繼續在原來的分支上正常工做,而你在本身的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工做。
Git的分支是不同凡響,不管建立、切換和刪除分支,Git在1秒鐘以內就能完成!不管你的版本庫是1個文件仍是1萬個文件。
查看分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
至關於如下兩步:
$ git branch dev
$ git checkout dev
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
Git鼓勵大量使用分支:這樣更安全Fast-forward
信息,Git告訴咱們,此次合併是「快進模式」
模式圖:
原來只有master分支
使用git checkout -b dev
建立並轉移至新分支dev
在新分支上更改內容
使用:git merge dev
合併dev分支到master分支
使用git branch -d dev
刪除已經完成了使命的dev分支
人生不如意之事十之八九,合併分支每每也不是一路順風的。
當在兩個分支上對同一個文件進行修改時,若是合併這兩個分支就會產生衝突,這時候須要手動修改。git log --graph --pretty=oneline --abbrev-commit
用git log --graph
命令能夠看到分支合併圖。
在實際開發中,咱們應該按照幾個基本原則進行分支管理:
master分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,好比1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;
你和你的小夥伴們每一個人都在dev分支上幹活,每一個人都有本身的分支,時不時地往dev分支上合併就能夠了。
因此,團隊合做的分支看起來就像這樣:
合併分支時,加上--no-ff參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward合併就看不出來曾經作過合併。
軟件開發中,bug就像屢見不鮮同樣。有了bug就須要修復,在Git中,因爲分支是如此的強大,因此,每一個bug均可以經過一個新的臨時分支來修復,修復後,合併分支,而後將臨時分支刪除。
git stash
功能:能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做:
而後從master上面建立新的分支,修復bug合併
git stash list
:用於查看被儲藏起來的那部分項目,
恢復被儲藏項目的兩種方法:
用·it stash apply
恢復,可是恢復後,stash內容並不刪除,你須要用git stash drop來刪除;
用git stash pop
,恢復的同時把stash內容也刪了:
軟件開發中,總有無窮無盡的新的功能要不斷添加進來。
添加一個新功能時,你確定不但願由於一些實驗性質的代碼,把主分支搞亂了,因此,每添加一個新功能,最好新建一個feature分支,在上面開發,完成後,合併,最後,刪除該feature分支。
開發一個新feature,最好新建一個分支;
若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D <name>
強行刪除。
當要刪除一個沒被合併的分支時,系統會提醒,若是要刪除須要強制刪除,須要執行命令:git branch -D <name>
查看遠程庫信息,使用git remote -v
;
本地新建的分支若是不推送到遠程,對其餘人就是不可見的;
從本地推送分支,使用git push origin branch-name
,若是推送失敗,先用git pull抓取遠程的新提交;
在本地建立和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name
,本地和遠程分支的名稱最好一致;
創建本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name
;
從遠程抓取分支,使用git pull
,若是有衝突,要先處理衝突。
那些分支須要及時推送?
master分支是主分支,所以要時刻與遠程同步;
dev分支是開發分支,團隊全部成員都須要在上面工做,因此也須要與遠程同步;
bug分支只用於在本地修復bug,就不必推到遠程了,除非老闆要看看你每週到底修復了幾個bug;
feature分支是否推到遠程,取決於你是否和你的小夥伴合做在上面開發。
啥是標籤呢?
Git的標籤就像是版本庫的快照,實質上它就是指向某個commit的指針(跟分支很像對不對?可是分支能夠移動,標籤不能移動),因此,建立和刪除標籤都是瞬間完成的。
做用在於未來不管何時,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。
git tag <name>
:建立一個新標籤
git tag
查看全部標籤
標籤不是按時間順序列出,而是按字母排序的。能夠用git show <tagname>
查看標籤信息
還能夠建立帶有說明的標籤,用-a
指定標籤名,-m
指定說明文字:
還能夠經過-s
用私鑰簽名一個標籤
命令git tag <name>
用於新建一個標籤,默認爲HEAD,也能夠指定一個commit id;
git tag -a <tagname> -m "blablabla..."
能夠指定標籤信息;
git tag -s <tagname> -m "blablabla..."
能夠用PGP簽名標籤;
命令git push origin <tagname>
能夠推送一個本地標籤;
命令git push origin --tags
能夠推送所有未推送過的本地標籤;
命令git tag -d <tagname>
能夠刪除一個本地標籤;
命令git push origin :refs/tags/<tagname>
能夠刪除一個遠程標籤。
在GitHub上,能夠任意Fork開源倉庫;
本身擁有Fork後的倉庫的讀寫權限;
能夠推送pull request給官方倉庫來貢獻代碼。
在GitHub出現之前,開源項目開源容易,但讓廣大人民羣衆參與進來比較困難,由於要參與,就要提交代碼,而給每一個想提交代碼的羣衆都開一個帳號那是不現實的,所以,羣衆也僅限於報個bug,即便能改掉bug,也只能把diff文件用郵件發過去,很不方便。
可是在GitHub上,利用Git極其強大的克隆和分支功能,廣大人民羣衆真正能夠第一次自由參與各類開源項目了。
如何參與一個開源項目呢?好比人氣極高的bootstrap項目,這是一個很是強大的CSS框架,你能夠訪問它的項目主頁https://github.com/twbs/bootstrap,點「Fork」就在本身的帳號下克隆了一個bootstrap倉庫,而後,從本身的帳號下clone:
git config --global color.ui true
:讓git顯示顏色;
在Git工做區的根目錄下建立一個特殊的.gitignore文件,而後把要忽略的文件名填進去,Git就會自動忽略這些文件。
不須要從頭寫.gitignore文件,GitHub已經爲咱們準備了各類配置文件,只須要組合一下就可使用了。全部配置文件能夠直接在線瀏覽:https://github.com/github/gitignore
忽略操做系統自動生成的文件,好比縮略圖等;
忽略編譯生成的中間文件、可執行文件等,也就是若是一個文件是經過另外一個文件自動生成的,那自動生成的文件就不必放進版本庫,好比Java編譯產生的.class文件;
忽略你本身的帶有敏感信息的配置文件,好比存放口令的配置文件。
使用Windows的童鞋注意了,若是你在資源管理器裏新建一個.gitignore
文件,它會很是弱智地提示你必須輸入文件名,可是在文本編輯器裏「保存」或者「另存爲」就能夠把文件保存爲.gitignore
了。
給Git配置好別名,就能夠輸入命令時偷個懶。
配置方法:
$git config --global alias.st status $ git config --global alias.co checkout $ git config --global alias.ci commit $ git config --global alias.br branch
--global參數是全局參數,也就是這些命令在這臺電腦的全部Git倉庫下都有用。
每一個倉庫的Git配置文件都放在.git/config文件中
而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中:
$ cat .gitconfig [alias] co = checkout ci = commit br = branch st = status [user] name = Your Name email = your@email.com
別名就在[alias]後面,要刪除別名,直接把對應的行刪掉便可。
配置別名也能夠直接修改這個文件,若是改錯了,能夠刪掉文件從新經過命令配置。
第一步,安裝git:$ sudo apt-get install git
第二步,建立一個git用戶,用來運行git服務:$ sudo adduser git
第三步,建立證書登陸:
收集全部須要登陸的用戶的公鑰,就是他們本身的id_rsa.pub文件,把全部公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個。
第四步,初始化Git倉庫:
先選定一個目錄做爲Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令:
$ sudo git init --bare sample.git
Git就會建立一個裸倉庫,裸倉庫沒有工做區,由於服務器上的Git倉庫純粹是爲了共享,因此不讓用戶直接登陸到服務器上去改工做區,而且服務器上的Git倉庫一般都以.git結尾。而後,把owner改成git:$ sudo chown -R git:git sample.git
第五步,禁用shell登陸:
出於安全考慮,第二步建立的git用戶不容許登陸shell,這能夠經過編輯/etc/passwd文件完成。找到相似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改成:git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣,git用戶能夠正常經過ssh使用git,但沒法登陸shell,由於咱們爲git用戶指定的git-shell每次一登陸就自動退出。
第六步,克隆遠程倉庫:
如今,能夠經過git clone命令克隆遠程倉庫了,在各自的電腦上運行:
`$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.`
剩下的推送就簡單了。