把環境準備node
主機名 node1 ip地址10.0.0.11 python
node2 10.0.0.12linux
node3 10.0.0.13nginx
操做系統centos7 git
在node1中設置主機解析web
10.0.0.11 node1redis
10.0.0.12 node2sql
10.0.0.13 node3vim
文件下載 https://pan.baidu.com/share/init?surl=6m5BVuhBSgtw1-_XTaJdmw 密碼 pct9windows
=================================================================
爲何須要作git版本控制
咱們在作某件事的時候,須要不少次才能完成,爲了不沒必要要的風險在下一次繼續作的時候都會
手動作個一備份,方便有問題時能回滾、對比 找出問題。
但這樣比較麻煩,因此有了git版本控制。
他能夠自動生成備份、知道改動的地方、隨時回滾
常見的版本控制系統
1
SVN
集中式的版本控制系統,只有一箇中央數據倉庫,若是中央數據倉庫掛了或者不可訪問,
全部的使用者沒法使用SVN,沒法進行提交或備份文件。
2
Git
分佈式的版本控制系統,在每一個使用者電腦上就有一個完整的數據倉庫,沒有網絡依然可使用Git。
固然爲了習慣及團隊協做,會將本地數據同步到Git服務器或者GitHub等代碼倉庫。
==========================================================
git安裝與配置
Git分佈式版本控制系統最佳實踐 - 老男孩教育博客 http://blog.oldboyedu.com/git/
系統環境
CentOS7.4 防火牆和selinux關閉
安裝Git
yum -y install git
[root@node1 ~]# git --version
git version 1.8.3.1
Git全局配置
git config --global user.name "zyc" #配置git使用用戶
git config --global user.email "zhangyao@oldboyedu.com" #配置git使用郵箱
git config --global color.ui true #語法高亮
git config --list # 查看全局配置
初始化Git工做目錄
須要管理一個目錄須要先初始化
mkdir git_data
cd git_data/
# 初始化 會在目錄中生成一個.git的隱藏目錄
git init
# 查看工做區狀態
git status
git_data工做目錄 工做目錄裏的.git/ 目錄是本地倉庫 本地倉庫裏的index是暫存區
touch a.txt
git status
文件未被跟蹤
git add a.txt 把文件傳到了暫存區 由未跟蹤狀態到已跟蹤狀態
git status
# git rm --cached a.txt 從緩存區刪除 變爲未跟蹤狀態
# git status
git commit -m 'first commit' #→git commit提交暫存文件至版本庫 從以跟蹤狀態變爲未被修改狀態
以源文件的形式存儲 被git管理
刪除暫存區數據
沒有添加到暫存區的數據直接rm刪除便可。
已經添加到暫存區數據:
git rm --cached database
#→將文件從git暫存區域的追蹤列表移除(並不會刪除當前工做目錄內的數據文件)
git rm -f database
#→將文件數據從git暫存區和工做目錄一塊兒刪除
==========================================
# rm -f b.txt 先刪除工做目錄的文件
# git rm --cached b.txt 從追蹤列表中移除
# git commit -m 'delete b.txt' 提交生效 從本地倉庫刪除
重命名暫存區數據
沒有添加到暫存區的數據直接mv/rename更名便可。
已經添加到暫存區數據:
git mv a.txt ab.txt
git commit -m "rename a.txt ab.txt" 提交生效
查看歷史記錄
git log #→查看提交歷史記錄
git log -2 #→查看最近幾條記錄
git log -p -1 #→-p顯示每次提交的內容差別,例如僅查看最近一次差別
git log --stat -2 #→--stat簡要顯示數據增改行數,這樣可以看到提交中修改過的內容,
對文件添加或移動的行數,並在最後列出全部增減行的概要信息
git log --pretty=oneline #→--pretty根據不一樣的格式展現提交的歷史信息
git log --pretty=fuller -2 #→以更詳細的模式輸出提交的歷史記錄
git log --pretty=fomat:"%h %cn" #→查看當前全部提交記錄的簡短SHA-1哈希字串與提交者的姓名,其餘格式見備註。
還原歷史數據
1 # echo "333">>ab.txt 修改工做目錄的文件
看狀態 能夠提交到緩存目錄生效,也能夠用緩存區的覆蓋工做目錄進行恢復
# git checkout -- ab.txt 根據提示覆蓋
# cat ab.txt 恢復到了以前的狀態
123
222
2 # echo "333" >>ab.txt
# git add . 提交到緩存目錄
如今就只有本地倉庫的數據是原來的,那就經過倉庫進行還原
# git log --oneline 查看提交倉庫的記錄
# git reset --hard 8af7b39 利用版本指針恢復到了最後一次的提交
Git服務程序中有一個叫作HEAD的版本指針,當用戶申請還原數據時,
其實就是將HEAD指針指向到某個特定的提交版本,可是由於Git是分佈式版本控制系統,
爲了不歷史記錄衝突,故使用了SHA-1計算出十六進制的哈希字串來區分每一個提交版本,
另外默認的HEAD版本指針會指向到最近的一次提交版本記錄,而上一個提交版本會叫HEAD^,
上上一個版本則會叫作HEAD^^,固然通常會用HEAD~5來表示往上數第五個提交版本。
git reset --hard HEAD^ #→還原歷史提交版本上一次
git reset --hard 3de15d4 #→找到歷史還原點的SHA-1值後,就能夠還原(值不寫全,系統會自動匹配)
還原將來數據
什麼是將來數據?就是你還原到歷史數據了,可是你後悔了,
想撤銷更改,可是git log已經找不到這個版本了。
git reflog #→查看將來歷史更新點
而後利用 hard
標籤使用
前面回滾使用的是一串字符串,又長又難記。
git tag v1.0 #→當前提交內容打一個標籤(方便快速回滾),每次提交均可以打個tag。最近的一次提交打上標籤
# git tag v2.0 9947d1bb245821 給指定的提交記錄打上標籤
git tag #→查看當前全部的標籤
git show v1.0 #→查看當前1.0版本的詳細信息
git tag v1.2 -m "version 1.2 release is test" #→建立帶有說明的標籤,-a指定標籤名字,-m指定說明文字
git tag -d v1.0 #→咱們爲同一個提交版本設置了兩次標籤,刪除以前的v1.0
[root@centos7 git_data]# git reset --hard 0bdf2e7
HEAD is now at 0bdf2e7 modified README file
[root@centos7 git_data]# git reset --hard V1.0
HEAD is now at a66370a add oldboy dir
對比數據
git diff能夠對比當前文件與緩存區文件的區別,知道了對README做了什麼修改
# echo '444' >>a.txt
# git diff
# gir diff --cached 查看緩存區文件於倉庫文件的區別
確認沒問題 就提交到倉庫
# git commit -m "modify a.txt second"
分支結構
在實際的項目開發中,儘可能保證master分支穩定,僅用於發佈新版本,
平時不要隨便直接修改裏面的數據文件。
那在哪幹活呢?幹活都在dev分支上。每一個人從dev分支建立本身我的分支,
開發完合併到dev分支,最後dev分支合併到master分支。
因此團隊的合做分支看起來會像下圖那樣。
建立分支
# git status 默認安裝好git時 都是在master分支上操做的
git branch linux #→建立分支 星號在那個分支上就是 當前分支
git branch dev
git checkout dev#→切換分支
git branch #→查看當前分支狀況,當前分支前有*號
測試在dev分支修改文件並提交到git倉庫,最後切換回master分支,你會發現什麼呢?
最終都會指向同一個分支
合併分支
想把dev的工做成果合併到master分支上
先切換到master分支
git merge dev #→合併dev分支至master
查看合併的文件
git branch -d dev#→確認合併完成後,能夠放心地刪除dev分支。
分支衝突
合併分支後 兩個分支對同一個文件進行修改再次合併就會報錯
修改a.txt
vim a.txt 刪掉多餘的內容 而後提交到緩存和倉庫
# git add .
# git commit -m "merge dev to master"
# git status
windows 客戶端的使用
前面講的都是linux客戶端,在講講windows客戶端使用,安裝Git-2.10.0-64-bit。
windows的git,本質是windows上的linux系統
安裝完成 桌面右鍵 Git Bash Here 進入命令行界面 操做與linux裏的Git 操做同樣
mkdir git_data
cd git_data
git config --global user.name "zhou"
git config --global user.email "44758635@qq.com"
git init
touch a.txt
git add .
git commit -m "commit a.txt"
或者右鍵Git GUI Here
TortoiseGit-2.2.0.0-64bit 給git加外殼,svn客戶端的git版本
Git服務器 使用
前面咱們已經知道Git人人都是中心,那他們怎麼交互數據呢?
使用GitHub或者碼雲等公共代碼倉庫
使用GitLab私有倉庫
GitHuB使用
Github顧名思義是一個Git版本庫的託管服務,是目前全球最大的軟件倉庫,
擁有上百萬的開發者用戶,也是軟件開發和尋找資源的最佳途徑,
Github不只能夠託管各類Git版本倉庫,還擁有了更美觀的Web界面,
您的代碼文件能夠被任何人克隆,使得開發者爲開源項貢獻代碼變得更加容易,
固然也能夠付費購買私有庫,這樣高性價比的私有庫真的是幫助到了不少團隊和企業。
具體使用方法見博客http://blog.oldboyedu.com/git/
Git 經常使用命令
add #添加文件內容至索引
bisect #經過二分查找定位引入 bug 的變動
branch #列出、建立或刪除分支
checkout #檢出一個分支或路徑到工做區
clone #克隆一個版本庫到一個新目錄
commit #記錄變動到版本庫
diff #顯示提交之間、提交和工做區之間等的差別
fetch #從另一個版本庫下載對象和引用
grep #輸出和模式匹配的行
init #建立一個空的 Git 版本庫或從新初始化一個已存在的版本庫
log #顯示提交日誌
merge #合併兩個或更多開發歷史
mv #移動或重命名一個文件、目錄或符號連接
pull #獲取併合並另外的版本庫或一個本地分支
push #更新遠程引用和相關的對象
rebase #本地提交轉移至更新後的上游分支中
reset #重置當前HEAD到指定狀態
rm #從工做區和索引中刪除文件
show #顯示各類類型的對象
status #顯示工做區狀態
tag #建立、列出、刪除或校驗一個GPG簽名的 tag 對象
私有倉庫GitLAB
安裝文檔 https://about.gitlab.com/downloads/#centos7
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
機器內存給大點
yum localinstall gitlab-ce-9.1.4-ce.0.el7.x86_64.rpm
gitlab-ctl reconfigure #→初始化,就執行一次
gitlab-ctl status/stop/start
經過瀏覽器訪問頁面,設置初始密碼,其餘操做相似GitHUB。
帳戶:root 密碼本身設置爲12345678
===============================
安裝依賴
# yum install -y curl policycoreutils-python openssh-server
安裝上傳的rpm包
# rpm -ivh gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm
安裝完成 工做中儘可能在全新的服務器上安裝 避免端口衝突
配置
# vim /etc/gitlab/gitlab.rb
從新配置 生效
# gitlab-ctl reconfigure
查看狀態
# gitlab-ctl status
13個服務
run: gitaly: (pid 24137) 299s; run: log: (pid 23849) 373s
run: gitlab-monitor: (pid 24163) 297s; run: log: (pid 23914) 361s
run: gitlab-workhorse: (pid 24126) 299s; run: log: (pid 23805) 387s
run: logrotate: (pid 23834) 379s; run: log: (pid 23833) 379s
run: nginx: (pid 23817) 385s; run: log: (pid 23816) 385s
run: node-exporter: (pid 23900) 367s; run: log: (pid 23899) 367s
run: postgres-exporter: (pid 24184) 295s; run: log: (pid 23999) 342s
run: postgresql: (pid 23585) 440s; run: log: (pid 23584) 440s
run: prometheus: (pid 24172) 296s; run: log: (pid 23978) 348s
run: redis: (pid 23525) 446s; run: log: (pid 23524) 446s
run: redis-exporter: (pid 23929) 355s; run: log: (pid 23928) 355s
run: sidekiq: (pid 23789) 393s; run: log: (pid 23788) 393s
run: unicorn: (pid 23751) 399s; run: log: (pid 23750) 399s
# netstat -lnupt 佔用的端口挺多 因此建議部署在新的服務器上
Gitlab 經常使用命令
gitlab-ctl start 啓動所有服務
gitlab-ctl restart 重啓所有服務
gitlab-ctl stop 中止所有服務
gitlab-ctl reconfigure 生效配置文件
gitlab-ctl show-config 驗證配置文件
gitlab-ctl uninstall 刪除gitlab (保留數據)
gitlab-ctl cleanse 刪除全部數據 從新開始
gitlab-ctl tail <查看服務的日誌>
=========================================
gitlab使用
瀏覽器輸入服務地址 10.0.0.11 訪問Gitlab
進入登陸界面設置密碼 而後登陸
linux客戶端 生成祕鑰 配置到gitlab上 基於ssh方式訪問
# ssh-keygen -t dsa 生成 祕鑰
設置 settings
把公鑰 複製粘貼到 key 裏 點擊添加
建立項目
進入設置--dashboard儀表盤---new group新組---組名設置爲oldboy 其餘默認--點擊建立
進入設置--dashboard儀表盤---new user新用戶 其餘默認
添加用戶到以前創的oldboy組
組oldboy 用戶dev 角色developer開發
進入設置--dashboard儀表盤---new project新項目
組lodboy 項目名web 描述不填 私有項目 添加
建立的項目加入到了oldboy組裏 意味着oldboy組裏的成員都能管理這個項目
根據成員的角色不一樣而權限也不一樣
====================================================================
項目操做命令等內容
windows 客戶端
一樣 win的客戶端也能使用linux簡單的命令
建立ssh祕鑰對不能用dsa 要用rsa
ssh-keygen -t rsa
登錄以前建立的dev用戶 設置好密碼,dev設置的開發權限因此沒有管理員設置
給dev用戶配置ssh的公鑰
而後把web 倉庫克隆到e盤
git clone git@10.0.0.11:oldboy/web.git
E盤 也就有了web的 本地倉庫
進入web倉庫 右鍵 Git Gui
建一個dev分支
在倉庫建立一個文本文檔
gui 刷新 追蹤 commit 而後推到遠程dev
如今進入web頁面 web倉庫就能看到 dev分支和裏面的文件
gitlab 代碼提交的流程
保護master 分支 用root用戶 設置禁止dev用戶推送數據到master分支
進入 web倉庫 設置倉庫保護 只容許master 有權限
如今master既是默認分支 又是 保護分支
測試 再次用dev用戶往master分支上推送時失敗 推送到dev分支 則正常
當開發完成 代碼書寫 就申請提交合併到master分支 而後有root用戶受理
,實現項目的管理
gitlab 目錄
gitlab_rails['backup_path'] = '/data/backup/gitlab'
gitlab_rails['backup_keep_time'] = 604800
mkdir /data/backup/gitlab -p
chown -R git.root gitlab/
/usr/bin/gitlab-rake gitlab:backup:create 備份命令
查看 backup 生成的備份文件
把備份命令加入 定時任務
恢復備份