1. 程式人生 > >Git分布式版本控制

Git分布式版本控制

git github linux版本控制 linux私有倉庫 svn

一、常見的版本管理工具有

SVN 集中式的版本控制系統,只有一個中央數據倉庫,如果中央數據倉庫掛了或者不可訪問,所有的使用者無法使用SVN,無法進行提交或者備份文件

Git 分布式的版本控制系統,在每個使用者電腦就有一個完整的數據倉庫,沒有網絡依然可以使git,當然為了習慣團隊協作,會將本地數據同步到git服務器或者GitHub等代碼倉庫


二、Git介紹

Git是一款免費、開源的分布式版本控制系統,用於敏捷高效地處理任何或小或大的項目。

Git的三種重要模式,分別是已提交、已修改、已暫存

已提交(committed):表示數據文件已經順利提交到Git數據庫中。

已修改(modified):表示數據文件已經被修改,但未被保存到Git數據庫中。

已暫存(staged):表示數據文件已經被修改,並會在下次提交時提交到Git數據庫中。

提交前的數據文件可能會被隨意修改或丟失,但只要把文件快照順利提交到Git數據庫中,那就可以完全放心了,流程為:

1.在工作目錄中修改數據文件。

2.將文件的快照放入暫存區域。

3.將暫存區域的文件快照提交到Git倉庫中。


三、Git安裝

[root@git-node1 ~]# getenforce #確認Selinux關閉狀態

Disabled

[root@git-node1 ~]# systemctl stop firewalld #關閉防火墻

yum install git -y


四、Git全局配置

git config --global user.name "zcf" # 配置git使用用戶

git config --global user.email "[email protected]" # 配置git使用郵箱

git config --global color.ui true # 語法高亮

git config --list # 查看全局配置


五、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 對象


六、Git初始化目錄

工作目錄(git_data ):當前存放數據的地方

暫存區域(.git):暫時存放數據的地方

本地倉庫(.git):永久存放數據的地方

mkdir git_data

cd git_data/

# 初始化

git init

# 查看工作區狀態

git status


七、Git添加文件

[root@git git_data]# touch readme

[root@git git_data]# git status

# 未跟蹤的文件:

# (使用 "git add <file>..." 以包含要提交的內容)

#

# readme ###發現新建的readme文件 工作目錄


[root@git git_data]# git status

# 位於分支 master

# 要提交的變更:

# (使用 "git reset HEAD <file>..." 撤出暫存區)

#

# 新文件: readme ####暫存區域


[root@git git_data]# git commit -m "the first commit"

[master 8ad0e05] the first commit

1 files changed, 0 insertions(+), 0 deletions(-)

create mode 100644 readme #####存放到本地倉庫


八、Git 刪除暫存區數據

#####有些時候會向把已經添加到暫存區的文件移除,但仍然希望文件在工作目錄中不丟失,換句話說,就是把文件從追蹤清單中刪除。

###沒有添加到暫存區的數據直接rm刪除即可

##已經添加到暫存區的數據

Git rm --cached database ##將文件從Git暫存區域的追蹤列表移除(並不會刪除當前目錄內的數據文件)

git rm -f database ##講文件數據從Git暫存區和工作目錄一起刪除

####沒有添加到暫存區的數據直接mv/rename 改名即可

####已經添加到暫存區的數據

git mv readme notice


九、Git歷史記錄

#查看提交歷史記錄

git log

#查看最近幾條記錄

git log -2

#-p顯示每次提交的內容差異,例如僅查看最近一次差異

git log -p -1

#--stat簡要顯示數據增改行數,這樣能夠看到提交中修改過的內容,對文件添加或移動的行數,並在最後列出所有增減行的概要信息

git log --stat -2

#--pretty根據不同的格式展示提交的歷史信息

git log --pretty=oneline

#以更詳細的模式輸出提交的歷史記錄

git log --pretty=fuller -2

#查看當前所有提交記錄的簡短SHA-1哈希字串與提交者的姓名,其他格式見備註。

git log --pretty=fomat:"%h %cn"

還可以使用format參數來指定具體的輸出格式,這樣非常便於後期編程的提取分析哦,常用的格式有:

%s 提交說明。

%cd 提交日期。

%an 作者的名字。

%cn 提交者的姓名。

%ce 提交者的電子郵件。

%H 提交對象的完整SHA-1哈希字串。

%h 提交對象的簡短SHA-1哈希字串。

%T 樹對象的完整SHA-1哈希字串。

%t 樹對象的簡短SHA-1哈希字串。

%P 父對象的完整SHA-1哈希字串。

%p 父對象的簡短SHA-1哈希字串。

%ad 作者的修訂時間。


十、Git還原數據

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 #→查看未來歷史更新點

十一、Git標簽

Git標簽使用前面回滾使用的是一串字符串,又長又難記。

git tag v1.0 #→當前提交內容打一個標簽(方便快速回滾),每次提交都可以打個tag。

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

####對比數據

git diff可以對比當前文件與倉庫已保存文件的區別,知道了對README作了什麽修改後,再把它提交到倉庫就放?多了。

git diff README


十二、分支結構

在實際的項目開發中,盡量保證master分支穩定,僅用於發布新版本,平時不要隨便直接修改裏面的數據文件。

那在哪幹活呢?幹活都在dev分支上。每個人從dev分支創建自己個人分支,開發完合並到dev分支,最後dev分支合並到master分支。

[root@gitlab git_data]# git status

# On branch master #默認就在master分支

[root@gitlab git_data]# git branch dev #創建dev分支

[root@gitlab git_data]# git branch #查看當前所在分支/查看所有分支

dev

* master


[root@gitlab git_data]# git checkout dev #切換分支到dev

[root@gitlab git_data]# git branch #查看當前所在分支/查看所有分支

* dev

master


[root@gitlab git_data]# git branch dev #創建dev分支

[root@gitlab git_data]# git branch #查看當前所在分支/查看所有分支

dev

* master


[root@gitlab git_data]# git checkout dev #切換分支到dev

[root@gitlab git_data]# git branch #查看當前所在分支/查看所有分支

* dev

master

註:切換分支之前請務必commit,否則修改會丟失。

[root@gitlab git_data]# git checkout dev #切換分支到dev

[root@gitlab git_data]# echo "dev branch" >> kkk.txt

[root@gitlab git_data]# git status

[root@gitlab git_data]# git commit -a -m "dev-commit" #提交



十三、分支自動合並

1)自動合並:只有文件同一行內容沒有沖突,就可以自動合並

[root@gitlab git_data]# git checkout master #切換到master分支

Switched to branch 'master'

[root@gitlab git_data]# git merge dev #把dev分支自動合並到當前分支

Updating 242bac0..995e05e

Fast-forward

kkk.txt | 2 ++

1 file changed, 2 insertions(+)

2)合並沖突: 文件沖突 – 文件的同一行有不同的內容

模擬沖突(分別修改不同分支文件中的同一行的內容並提交):

echo "master-test" >>kkk.txt #在master分支向文件輸出測試內容

git commit -a -m "this is master-test" #提交

git checkout dev #切換分支到dev

echo "dev-test" >> kkk.txt #在dev分支向文件輸出測試內容

git commit -a -m "this is dev-test" #提交

git branch master #再次切換到master分支

git merge dev #進行合並


3)合並沖突:

[root@gitlab git_data]# git merge dev

Auto-merging kkk.txt

CONFLICT (content): Merge conflict in kkk.txt

Automatic merge failed; fix conflicts and then commit the result.


4)手動解決合並沖突

修改提交的文件,保留要留下的內容,其他沖突內容刪除

[root@gitlab git_data]# cat kkk.txt

test

dev branch

<<<<<<< HEAD

master-test

=======

dev-test

>>>>>>> dev

#比如要保留master-test,其他提示內容都刪除,刪除後文件內容如下:

[root@gitlab git_data]# cat kkk.txt

test

dev branch

master-test

#再次提交

[root@gitlab git_data]# git commit -a -m "解決合並沖突"

[master 071f8cd] 解決合並沖突

#重新進行合並

[root@gitlab git_data]# git merge dev

Already up-to-date.

可以看到,沖突已經解決。

5)刪除dev分支

git branch -d dev


十四、windows客戶端使用

windows的git,本質是windows上的linux系統

TortoiseGit-2.2.0.0-64bit 給git加外殼, svn客戶端的git版本

技術分享圖片


十五、Git服務器

1)使用GitHub或者碼雲等公共代碼倉庫

2)使用GitLab私有倉庫

私有倉庫GITLAB

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


註:gitlab搭配ssh默認端口引發的血戰


[ sed -i ‘s/#Port 22/Port 52113/g’ /etc/ssh/sshd_config

#如果是默認的22,就必須修改,否則不生效,我這裏改為了52113

systemctl restart sshd #重啟sshd服務

grep “ssh_port” /etc/gitlab/gitlab.rb #修改gitlab裏面的ssh_prot端口為自己服務器的sshd端口,聲明gitlab.yml中的配置會被這個給覆蓋

gitlab_rails[‘gitlab_shell_ssh_port’] = 52113

gitlab-ctl reconfigure #gitlab重新加載配置文件即可


十六、GITHUB使用

Github顧名思義是一個Git版本庫的托管服務,是目前全球最大的軟件倉庫,擁有上百

萬的開發者用戶,也是軟件開發和尋找資源的最佳途徑, Github不僅可以托管各種Git

版本倉庫,還擁有了更美觀的Web界面,您的代碼文件可以被任何人克隆,使得開發

者為開源項貢獻代碼變得更加容易,當然也可以付費購買私有庫,這樣高性價比的私

有庫真的是幫助到了很多團隊和企業


Git分布式版本控制