七 Git版本控制

 

把環境準備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版本控制。

他能夠自動生成備份、知道改動的地方、隨時回滾

 常見的版本控制系統

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組裏的成員都能管理這個項目

根據成員的角色不一樣而權限也不一樣

 

====================================================================

項目操做命令等內容

Command line instructions

Git global setup
git config --global user.name "Administrator"
git config --global user.email "admin@example.com"
Create a new repository  遠程倉庫克隆到本地倉庫中
git clone git@10.0.0.11:oldboy/web.git 克隆倉庫到本地
cd web 進入本地倉庫
touch README.md  建立文件
git add README.md 提交到緩存
git commit -m "add README" 提交到倉庫
git push -u origin master  推送到遠程倉庫
Existing folder
cd existing_folder
git init
git remote add origin git@10.0.0.11:oldboy/web.git
git add .
git commit -m "Initial commit"
git push -u origin master
Existing Git repository    把已經存在的本地倉庫 git_data 推到 遠程倉庫中
cd existing_repo
git remote rename origin old-origin
git remote add origin git@10.0.0.11:oldboy/web.git 本地建立一個 遠程倉庫
# git push -u gitlab master 推送master 分支
git push -u origin --all git push -u origin --tags

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 生成的備份文件 

把備份命令加入 定時任務

 

恢復備份

 

相關文章
相關標籤/搜索