????????????GIT教程
? ??????????????????????????????????原創(chuàng)者:文思
一、Git基礎(chǔ)
1、認識GIT
有了SVN為何還用GIT蹬竖?
SVN增量式管理型凳,GIT采取了文件系統(tǒng)快照的方式
SVN集中式管理丈冬,GIT分布式管理
其他優(yōu)勢:
大部分操作在本地不需要聯(lián)網(wǎng),只有pull和push時需要
盡可能添加數(shù)據(jù)還不是修改或刪除數(shù)據(jù)
分支操作快捷(指針)
與Linux命令全面兼容
2甘畅、安裝GIT
非windows環(huán)境安裝:
https://git-scm.com/download/win
依次輸入:./config埂蕊,make,sudo make install
windows環(huán)境安裝: Windows下要使用很多Linux/Unix的工具時疏唾,需要Cygwin這樣的模擬環(huán)境蓄氧,Git也一樣。Cygwin的安裝和配置都比較復雜槐脏。
msysgit匀们,模擬環(huán)境和Git都打包好了,只需要下載一個單獨的exe安裝程序准给。msysgit是Windows版的Git泄朴。
https://git-for-windows.github.io原始下載,因中國國情:
http://www.oschina.net/p/git/或http://www.oschina.net/p/msysgit下載露氮。
安裝完成后祖灰,在開始菜單里找到“Git”->“Git Bash”,蹦出一個類似命令行窗口的東西畔规,就說明Git安裝成功局扶! 安裝完成后,還需要最后一步設(shè)置叁扫,在命令行輸入:
$ git config--global user.name "Your Name" $ git config --global user.email"email@example.com"
因為Git是分布式版本控制系統(tǒng)三妈,所以,每個機器都必須自報家門:你的名字和Email地址莫绣。
注意:git config命令的--global參數(shù)畴蒲,用了這個參數(shù),表示你這臺機器上所有的Git倉庫都會使用這個配置对室,當然也可以對某個倉庫指定不同的用戶名和Email地址
3模燥、GIT結(jié)構(gòu)
工作區(qū)(寫代碼的地方)—git addà暫存區(qū)(臨時存儲)—git commità本地庫(歷史版本)
實際使用中很多人喜歡直接commit到本地庫,這或許是從svn沿襲來的習慣掩宜。
工作區(qū):版本庫(.git) = .svn
Git的版本庫里存了很多東西蔫骂,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支master牺汤,以及指向master的一個指針叫HEAD辽旋。SVN是沒有暫存區(qū)的。
文件往Git版本庫里添加的時候,是分兩步執(zhí)行的:
第一步用git add把文件添加進去补胚,實際上就是把文件修改添加到暫存區(qū)固该。
第二步是用git commit提交更改,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支糖儡。
創(chuàng)建Git版本庫時伐坏,Git自動為我們創(chuàng)建了唯一一個master分支,git commit就是往master分支上提交更改握联。add需要提交的文件修改通通放到暫存區(qū)桦沉,然后commit可一次性提交暫存區(qū)的所有修改
4、Git和代碼托管中心:
局域網(wǎng)-GitLab服務(wù)器
外網(wǎng)-GitHub金闽、碼云
本地庫與遠程庫協(xié)作方式:團隊內(nèi)部協(xié)作纯露、跨團隊協(xié)作
5、Git命令行操作
1)本地庫初始化
git add
2)設(shè)置簽名
用戶名代芜,email地址
作用:區(qū)分開發(fā)人員身份
這里設(shè)置的簽名和登錄遠程庫的賬號埠褪、密碼沒有關(guān)系
命令:
項目級別/倉庫級別:僅在當前本地庫范圍內(nèi)有效
git config user.name tom_pro
git config user.email good_pro@126.com
信息保存位置:
系統(tǒng)用戶界別:登錄當前操作系統(tǒng)的用戶范圍
git config –globaluser.name tom_glb
git config –globalgood_pro@126.com
項目級別優(yōu)先于用戶級別
3)常用git命令
git stauts,顯示工作目錄和暫存區(qū)的狀態(tài):
上面綠色的文件代表在暫存區(qū)挤庇,未提交到本地庫钞速。
新建文件后git status查看:
上面紅色文件代表在工作區(qū)未提交到暫存區(qū)。
git add 文件名嫡秕,提交文件到暫存區(qū):
以上文件已到暫存區(qū)渴语,git rm - -cache 文件名, 代表從暫存區(qū)撤銷文件Changes to be committed:(use “git reset
HEAD<file>…” to unstage):
git add再次提交testGit.txt到暫存區(qū),后進行g(shù)it commit提交:
git commit 文件名昆咽,提交文件到暫存區(qū):
git commit testGit.txt
輸入提交的日志信息后:
至此文件已到本地庫驾凶。修改文件再次提交看看信息是什么
git status看一下:
git add然后git commit即可。大家想下兩步操作麻煩嗎掷酗,回想一下maven命令的聲明周期原理调违,如果我們直接commit呢?看看
直接提交完成泻轰,commit包含了add操作技肩。即commit命令對應(yīng)著eclipse中的commit選項。
查看歷史記錄操作:git log
想讓日志優(yōu)美一點:git log –pretty=oneline或git log –oneline
reflog 可看到移動到當前版本需要的步數(shù)
Head代表指針糕殉,指向的是每一個歷史記錄亩鬼。
git reset --hard版本切換3種方式:
使用索引值草最(推薦)、使用^符號(只能往后退)阿蝶、使用~符號(后退)
使用索引值草最(推薦):
可以看到3bc406c已經(jīng)回退到當前最近版本。再恢復:
可以看到又恢復了黄绩。
使用^符號:
使用~符號:
reset命令的三個參數(shù)對比:soft羡洁、hard、mixed
soft僅僅在本地庫移動指針
mixed本地庫移動指針并重置暫存區(qū)
hard在本地庫移動指針爽丹,重置暫存區(qū)并重置工作區(qū)
git中對文件的刪除操作也相當于修改筑煮,示例:文件刪除并找回辛蚊,創(chuàng)建文件并提交到本地庫:
刪除后并且再進行提交:
git reflog可以看到:
本地庫里都有記錄,包括刪除的記錄都存在真仲,即可找回已刪除文件袋马。找回:
git diff,比較文件差異:
Git diff [文件名]將工作區(qū)中的文件和暫存區(qū)進行比較
Git diff [本地庫歷史版本] [文件名]將工作區(qū)中的文件和本地庫歷史記錄比較秸应。
例如:Git diff [文件名]將工作區(qū)中的文件和暫存區(qū)進行比較
提交后暫存區(qū)沒有了虑凛,則無法比較了。
Git diff [本地庫歷史版本] [文件名]將工作區(qū)中的文件和本地庫歷史記錄比較软啼,使用本地庫歷史版本號比較:
分支
Branch命令桑谍,查看、創(chuàng)建分支
git branch –v查看分支
git branch [分支名]創(chuàng)建分支
git checkout[分支名]切換分支:
合并分支示例:先修改dev分支文件:
將修改后的dev分支的文件合并到master:
1祸挪、當前分支必須是master(站在接受修改的分支上锣披,即切換為master分支)
2、執(zhí)行merge命令
可以看到已經(jīng)進行完成分支合并:
沖突解決:多個分支對同一個文件的同一個位置且內(nèi)容不一致就會產(chǎn)生沖突贿条。比如在master分支中修改testGit文件的最后一行雹仿,改為this is modify from;修改dev分支此文件最后一行為this is modify from dev!!!!!!
git chekout master 后 git merge master
看到合并成功且有沖突:
怎么解決就不用再說了整以。修改后沖突后看看暫存區(qū)是什么狀態(tài):
git add后再提交:
提交失敗盅粪,回想一下eclipse中的操作,是不是先標記為“已解決”悄蕾,這里應(yīng)該有對應(yīng)命令還是怎樣票顾?直接commit不寫文件名:
貌似成功了,所以這時候commit提交一定不能帶文件名帆调。
6奠骄、Git的基本原理:
哈希,哈希是一個一系列的加密算法番刊。不同的哈希算法有以下共同點:
1)不管輸入的數(shù)據(jù)量有多大含鳞,輸入同一個哈希算法,得到的加密結(jié)果長度固定芹务。
2)哈希算法確定蝉绷,輸入數(shù)據(jù)確定,輸出數(shù)據(jù)能夠保證不變枣抱。
3)哈希算法不可逆
所以哈希算法可以用來驗證文件熔吗。
Git底層采用的是SHA-1算法。
保存版本的機制
傳統(tǒng)集中式版本控制工具的文件管理機制
以文件變更列表的方式存儲信息佳晶。這類系統(tǒng)將它們保存的信息看作是一組基本桅狠,文件和每個文件隨時間逐步累積的差:
Git 把數(shù)據(jù)看作是小型文件系統(tǒng)的一組快照。每次提交更新時Git 都會對當前的全部文件制作一個快照并保存這個快照的索引。為了高效中跌,如果文件沒有修改咨堤,Git 不再重新存儲該文件,而是只保留一個鏈接指向之前存儲的文件漩符。所以Git 的工作方式可以稱之為快照流:
提交對象及其父對象形成的鏈條:
分支創(chuàng)建指針原理:
分支切換原理:
看出指針(HEAD)在git中的應(yīng)用一喘。
7、倉庫
創(chuàng)建遠程庫嗜暴,以使用github為例
推送本地庫到遠程庫:git push 地址(別名) 分支
遠程庫clone到本地:git clone 地址
拉韧箍恕:git pull 地址(別名) 分支,或者git
fetch 地址(別名) 分支
Pull = fetch +merge
8灼伤、SSH免密登陸
每個倉庫有兩種地址触徐,一種https一種是SSH。
1)進入當前用戶的根目錄狐赡,刪除以前創(chuàng)建的.ssh目錄并生成一個新目錄
2)運行命令生成.ssh 密鑰目錄
$ ssh-keygen -t rsa -C good_pro@126.com
[注意:這里-C 這個參數(shù)是大寫的C]
進入.ssh 目錄查看文件列表($ cd .ssh撞鹉,$ ls –lF)
查看id_rsa.pub 文件內(nèi)容($ cat id_rsa.pub)
3)復制id_rsa.pub 文件內(nèi)容,登錄GitHub颖侄,點擊用戶頭像→Settings→SSH andGPG keys
4)New SSH Key
5)輸入復制的密鑰信息
6)回到Git bash 創(chuàng)建遠程地址別名
(git remote add origin_ssh git@github.com:testGit2018y/test.git)
9鸟雏、Eclipse操作笨枯,略节榜,使用eclipse插件時多想想選項操作對應(yīng)的命令及原理。
10垮衷、eclipse中的文件忽略(比較實用)
概念:Eclipse 特定文件展蒂。這些都是Eclipse 為了管理我們創(chuàng)建的工程而維護的文件又活,和開發(fā)的代碼沒有直接關(guān)系。最好不要在Git 中進行追蹤锰悼,也就是把它們忽略柳骄。
.classpath 文件?? .project 文件?? .settings 目錄下所有文件
什么要忽略Eclipse 特定文件呢?
同一個團隊中很難保證大家使用相同的IDE 工具箕般,而IDE 工具不同時耐薯,相關(guān)工程特定文件就有可能不同。如果這些文件加入版本控制丝里,那么開發(fā)時很可能需要為了這些文件解決沖突曲初。
GitHub 官網(wǎng)樣例文件
https://github.com/github/gitignore
https://github.com/github/gitignore/blob/master/Java.gitignore
編輯本地忽略配置文件,文件名任意:
Java.gitignore
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, seehttp://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
Target
在~/.gitconfig文件中引入上述文件
[core]
excludesfile =C:/Users/Lenovo/Java.gitignore
[注意:這里路徑中一定要使用“/”杯聚,不能使用“\”]
11臼婆、git工作流
Gitflow工作流
通過為功能開發(fā)、發(fā)布準備和維護設(shè)立了獨立的分支械媒,讓發(fā)布迭代過程更流暢目锭。嚴格的分支模型也為大型項目提供了一些非常必要的結(jié)構(gòu)评汰。
常見結(jié)構(gòu):
1)主干分支master
主要負責管理正在運行的生產(chǎn)環(huán)境代碼纷捞。永遠保持與正在運行的生產(chǎn)環(huán)境完全一致痢虹。
2)開發(fā)分支develop
主要負責管理正在開發(fā)過程中的代碼。一般情況下應(yīng)該是最新的代碼主儡。
3)bug 修理分支hotfix奖唯。修復完隨時刪除
主要負責管理生產(chǎn)環(huán)境下出現(xiàn)的緊急修復的代碼。從主干分支分出糜值,修理完畢并測試上線后丰捷,并回主干分支。并回后寂汇,視情況可以刪除該分支病往。
4)準生產(chǎn)分支(預發(fā)布分支)release
較大的版本上線前,會從開發(fā)分支中分出準生產(chǎn)分支骄瓣,進行最后階段的集成測試停巷。該版本上線后,會合并到主干分支榕栏。生產(chǎn)環(huán)境運行一段階段較穩(wěn)定后可以視情況刪除畔勤。
5)功能分支feature。開發(fā)完后隨時刪除
為了不影響較短周期的開發(fā)工作扒磁,一般把中長期開發(fā)模塊庆揪,會從開發(fā)分支中獨立出來。開發(fā)完成后會合并到開發(fā)分支妨托。
Forking 工作流
Forking 工作流是在GitFlow 基礎(chǔ)上缸榛,充分利用了Git 的Fork 和pull request 的功能以達到代碼審核的目的。更適合安全可靠地管理大團隊的開發(fā)者兰伤,而且能接受不信任貢獻者的提交内颗。
二、git服務(wù)器搭建
官網(wǎng)地址
首頁:https://about.gitlab.com/
安裝說明:https://about.gitlab.com/installation/
安裝命令摘錄
sudo yum install -y curlpolicycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
sudo yum install postfix
sudo service postfix start
sudo chkconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh| sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ee
實際問題:yum 安裝gitlab-ee(或ce)時医清,需要聯(lián)網(wǎng)下載幾百M 的安裝文件起暮,非常耗時,所以應(yīng)提前把所需RPM 包下載并安裝好会烙。
下載地址為:
https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
調(diào)整后的安裝過程
sudo rpm -ivh /opt/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
sudo yum install -y curlpolicycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
sudo yum install postfix
sudo service postfix start
sudo chkconfig postfix on
curl?https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ce
當前步驟完成后重啟负懦。
gitlab服務(wù)操作:
初始化配置gitlab:gitlab-ctl reconfigure
啟動gitlab 服務(wù):gitlab-ctl start
停止gitlab 服務(wù):gitlab-ctl stop
訪問Linux 服務(wù)器IP 地址即可,如果想訪問EXTERNAL_URL 指定的域名還需要配置域名服務(wù)器或本地hosts文件柏腻。初次登錄時需要為gitlab 的root 用戶設(shè)置密碼纸厉。應(yīng)該會需要停止防火墻服務(wù):service firewalld stop