爲何須要版本控制?html
本地版本控制系統 許多人習慣用複製整個項目目錄的方式來保存不一樣的版本,或許還會更名加上備份時間以示區別。這麼作惟一的 好處就是簡單,可是特別容易犯錯。有時候會混淆所在的工做目錄,一不當心會寫錯文件或者覆蓋意想外的文件。linux
有了又怎麼樣?git
l 自動生成備份github
l 知道改動的地方web
l 隨時回滾編程
SVNvim
集中式的版本控制系統,只有一箇中央數據倉庫,若是中央數據倉庫掛了或者不可訪問,全部的使用者沒法使用SVN,沒法進行提交或備份文件。windows
Gitcentos
分佈式的版本控制系統,在每一個使用者電腦上就有一個完整的數據倉庫,沒有網絡依然可使用Git。固然爲了習慣及團隊協做,會將本地數據同步到Git服務器或者GitHub等代碼倉庫。瀏覽器
官網:https://git-scm.com
git是一個分佈式版本控制軟件,最初由林納斯·託瓦茲(Linus Torvalds)創做,於2005年以GPL發佈。最初目的是爲更好地管理Linux內核開發而設計。
Git 官方中文手冊 https://git-scm.com/book/zh/v2
自2002年開始,林納斯·託瓦茲決定使用BitKeeper做爲Linux內核主要的版本控制系統用以維護代碼。由於BitKeeper爲專有軟件,這個決定在社區中長期遭受質疑。在Linux社區中,特別是理查德·斯托曼與自由軟件基金會的成員,主張應該使用開放源代碼的軟件來做爲Linux核心的版本控制系統。林納斯·託瓦茲曾考慮過採用現成軟件做爲版本控制系統(例如Monotone),但這些軟件都存在一些問題,特別是性能不佳。現成的方案,如CVS的架構,受到林納斯·託瓦茲的批評。
2005年,安德魯·垂鳩寫了一個簡單程序,能夠鏈接BitKeeper的存儲庫,BitKeeper著做權擁有者拉里·麥沃伊認爲安德魯·垂鳩對BitKeeper內部使用的協議進行逆向工程,決定收回免費使用BitKeeper的受權。Linux內核開發團隊與BitMover公司進行蹉商,但沒法解決他們之間的歧見。林納斯·託瓦茲決定自行開發版本控制系統替代BitKeeper,以十天的時間,編寫出第一個git版本。
[root@gitlab ~]# rpm -qa centos-release centos-release-7-2.1511.el7.centos.2.10.x86_64 [root@gitlab ~]# uname -a Linux gitlab 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux [root@gitlab ~]# getenforce Disabled [root@gitlab ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) |
centos 自帶git [root@gitlab ~]# rpm -qa git git-1.8.3.1-11.el7.x86_64
安裝方法 yum install git -y |
編譯安裝能夠安裝較新版本的git
Git下載地址: https://github.com/git/git/releases
安裝依賴關係 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
編譯安裝 tar -zxf git-2.0.0.tar.gz cd git-2.0.0 make configure ./configure --prefix=/usr make make install |
命令集 git config --global user.name "wuhuang" #配置git使用用戶 git config --global user.email "xxxxxxxxxxx@163.com" #配置git使用郵箱 git config --global color.ui true #語法高亮 git config --list #查看全局配置
配置結果 [root@gitlab ~]# git config --list user.name=wuhuang user.email=xxxxxxxxxxx@163.com color.ui=true
生成的配置文件 [root@gitlab ~]# cat .gitconfig [user] name = wuhuang email = xxxxxxxxxxx@163.com [color] ui = true |
使用Git時須要獲取幫助,有三種方法能夠找到Git命令的使用手冊: git help <verb> git <verb> --help man git-<verb>
例如:要想得到配置命令的幫助手冊,執行 git help config |
mkdir git_data # 建立目錄 cd git_data/ # 進入目錄 git init # 初始化 git status # 查看工做區狀態
操做過程 [root@gitlab ~]# mkdir git_data [root@gitlab ~]# cd git_data/ [root@gitlab git_data]# git init 初始化空的 Git 版本庫於 /root/git_data/.git/ [root@gitlab git_data]# git status # 位於分支 master # # 初始提交 # 無文件要提交(建立/拷貝文件並使用 "git add" 創建跟蹤)
Git版本庫目錄結構 [root@gitlab git_data]# tree .git/ .git/ ├── branches ├── config ├── description ├── HEAD ├── hooks │ ├── applypatch-msg.sample │ ├── commit-msg.sample │ ├── post-update.sample │ ├── pre-applypatch.sample │ ├── pre-commit.sample │ ├── prepare-commit-msg.sample │ ├── pre-push.sample │ ├── pre-rebase.sample │ └── update.sample ├── info │ └── exclude ├── objects │ ├── info │ └── pack └── refs ├── heads └── tags
9 directories, 13 files |
命令 |
命令說明 |
命令 |
命令說明 |
add |
添加文件內容至索引 |
log |
顯示提交日誌 |
bisect |
經過二分查找定位引入 bug 的變動 |
merge |
合併兩個或更多開發歷史 |
branch |
列出、建立或刪除分支 |
mv |
移動或重命名一個文件、目錄或符號連接 |
checkout |
檢出一個分支或路徑到工做區 |
pull |
獲取併合並另外的版本庫或一個本地分支 |
clone |
克隆一個版本庫到一個新目錄 |
push |
更新遠程引用和相關的對象 |
commit |
記錄變動到版本庫 |
rebase |
本地提交轉移至更新後的上游分支中 |
diff |
顯示提交之間、提交和工做區之間等的差別 |
reset |
重置當前HEAD到指定狀態 |
fetch |
從另一個版本庫下載對象和引用 |
rm |
從工做區和索引中刪除文件 |
grep |
輸出和模式匹配的行 |
show |
顯示各類類型的對象 |
init |
建立一個空的 |
status |
顯示工做區狀態 |
Git |
版本庫或從新初始化一個已存在的版本庫 |
tag |
建立、列出、刪除或校驗一個GPG簽名的 tag 對象 |
文件的狀態變化週期
命令集 touch README git status git add README git status git commit -m 'first commit' #→git commit提交暫存文件至版本庫 命令說明: git add * 添加到暫存區域 git commit 提交git倉庫 -m 後面接上註釋信息,內容關於本次提交的說明,方便本身或他人查看 修改或刪除原有文件
建立文件 [root@gitlab git_data]# touch README [root@gitlab git_data]# git status # 位於分支 master # # 初始提交 # # 未跟蹤的文件: # (使用 "git add <file>..." 以包含要提交的內容) # # README 提交爲空,可是存在還沒有跟蹤的文件(使用 "git add" 創建跟蹤)
添加文件跟蹤——由工做目錄提交到暫存區域 [root@gitlab git_data]# git add README [root@gitlab git_data]# git status # 位於分支 master # # 初始提交 # # 要提交的變動: # (使用 "git rm --cached <file>..." 撤出暫存區) # # 新文件: README #
由暫存區提交到本地倉庫 [root@gitlab git_data]# git commit -m 'first commit' [master(根提交) 4ce5110] first commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README |
常規方法 git add * git commit
簡便方法 git commit -a -m "註釋信息" -a 表示直接提交 Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected. |
命令說明: 沒有添加到暫存區的數據直接rm刪除便可。 已經添加到暫存區數據: git rm --cached database #→將文件從git暫存區域的追蹤列表移除(並不會刪除當前工做目錄內的數據文件) git rm -f database #→將文件數據從git暫存區和工做目錄一塊兒刪除
命令實踐: 建立新文件 [root@gitlab git_data]# touch test [root@gitlab git_data]# ls README test [root@gitlab git_data]# git status # 位於分支 master # 未跟蹤的文件: # (使用 "git add <file>..." 以包含要提交的內容) # # test 提交爲空,可是存在還沒有跟蹤的文件(使用 "git add" 創建跟蹤) 將文件添加到暫存區域 [root@gitlab git_data]# git add test [root@gitlab git_data]# git status # 位於分支 master # 要提交的變動: # (使用 "git reset HEAD <file>..." 撤出暫存區) # # 新文件: test # 將文件從git暫存區域的追蹤列表移除(方法1) [root@gitlab git_data]# git rm --cached test rm 'test' [root@gitlab git_data]# git status # 位於分支 master # 未跟蹤的文件: # (使用 "git add <file>..." 以包含要提交的內容) # # test 提交爲空,可是存在還沒有跟蹤的文件(使用 "git add" 創建跟蹤) 將文件從git暫存區域的追蹤列表移除(方法2) [root@gitlab git_data]# git add test [root@gitlab git_data]# git reset HEAD test [root@gitlab git_data]# git status # 位於分支 master # 未跟蹤的文件: # (使用 "git add <file>..." 以包含要提交的內容) # # test 提交爲空,可是存在還沒有跟蹤的文件(使用 "git add" 創建跟蹤) 將文件數據從git暫存區和工做目錄一塊兒刪除 [root@gitlab git_data]# git add test [root@gitlab git_data]# git status # 位於分支 master # 要提交的變動: # (使用 "git reset HEAD <file>..." 撤出暫存區) # # 新文件: test # [root@gitlab git_data]# git rm -f test rm 'test' [root@gitlab git_data]# ls README |
l 沒有添加到暫存區的數據直接mv/rename更名便可。 l 已經添加到暫存區數據: git mv README NOTICE |
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哈希字串與提交者的姓名,其餘格式見備註。 |
還可使用format參數來指定具體的輸出格式,這樣很是便於後期編程的提取分析哦,經常使用的格式有:
格式 |
說明 |
格式 |
說明 |
%s |
提交說明。 |
%h |
提交對象的簡短SHA-1哈希字串。 |
%cd |
提交日期。 |
%T |
樹對象的完整SHA-1哈希字串。 |
%an |
做者的名字。 |
%t |
樹對象的簡短SHA-1哈希字串。 |
%cn |
提交者的姓名。 |
%P |
父對象的完整SHA-1哈希字串。 |
%ce |
提交者的電子郵件。 |
%p |
父對象的簡短SHA-1哈希字串。 |
%H |
提交對象的完整SHA-1哈希字串。 |
%ad |
做者的修訂時間。 |
命令實踐 [root@gitlab git_data]# git log -2 commit 7e142db5e0100c7cd71a2663ed0926c552f3f59c Author: wuhuang <xxxxxxxxxxx@163.com> Date: Wed Mar 21 09:24:57 2018 +0800
wuhuang
commit f70785716ddd65e83dca6a2f4d8cea722ae61de2 Author: wuhuang <xxxxxxxxxxx@163.com> Date: Wed Mar 21 09:24:18 2018 +0800
first commit
[root@gitlab git_data]# git log --pretty=oneline 7e142db5e0100c7cd71a2663ed0926c552f3f59c wuhuang f70785716ddd65e83dca6a2f4d8cea722ae61de2 first commit [root@gitlab git_data]# git log --pretty=fomat:"%h %cn" fomat:7e142db wuhuang fomat:f707857 wuhuang |
Git服務程序中有一個叫作HEAD的版本指針,當用戶申請還原數據時,其實就是將HEAD指針指向到某個特定的提交版本,可是由於Git是分佈式版本控制系統,爲了不歷史記錄衝突,故使用了SHA-1計算出十六進制的哈希字串來區分每一個提交版本,另外默認的HEAD版本指針會指向到最近的一次提交版本記錄,而上一個提交版本會叫HEAD^,上上一個版本則會叫作HEAD^^,固然通常會用HEAD~5來表示往上數第五個提交版本。
git reset --hard HEAD^ #→還原歷史提交版本上一次 git reset --hard 3de15d4 #→找到歷史還原點的SHA-1值後,就能夠還原(值不寫全,系統會自動匹配) 還原數據 [root@gitlab git_data]# git reset --hard f70785716 HEAD 如今位於 f707857 first commit [root@gitlab git_data]# git log commit f70785716ddd65e83dca6a2f4d8cea722ae61de2 Author: wuhuang <xxxxxxxxxxx@163.com> Date: Wed Mar 21 09:24:18 2018 +0800
first commit
|
什麼是將來數據?就是你還原到歷史數據了,可是你後悔了,想撤銷更改,可是git log已經找不到這個版本了。
git reflog #→查看將來歷史更新點
[root@gitlab git_data]# git reflog f707857 HEAD@{0}: reset: moving to f70785716 4ce5110 HEAD@{1}: reset: moving to 4ce5110bf3 7e142db HEAD@{2}: commit: wuhuang f707857 HEAD@{3}: commit: first commit 4ce5110 HEAD@{4}: commit (initial): first commit |
前面回滾使用的是一串字符串,又長又難記。使用標籤就會方便不少。
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@gitlab git_data]# git tag v2 [root@gitlab git_data]# git show v2 commit f70785716ddd65e83dca6a2f4d8cea722ae61de2 Author: wuhuang <xxxxxxxxxxx@163.com> Date: Wed Mar 21 09:24:18 2018 +0800
first commit
diff --git a/README b/README index e69de29..190a180 100644 --- a/README +++ b/README @@ -0,0 +1 @@ +123 [root@gitlab git_data]# git reset --hard v2 HEAD 如今位於 f707857 first commit |
git diff能夠對比當前文件與倉庫已保存文件的區別,知道了對README做了什麼修改
後,再把它提交到倉庫就放⼼多了。
git diff README |
在實際的項目開發中,儘可能保證master分支穩定,僅用於發佈新版本,平時不要隨便直接修改裏面的數據文件。
那在哪幹活呢?幹活都在dev分支上。每一個人從dev分支建立本身我的分支,開發完合併到dev分支,最後dev分支合併到master分支。因此團隊的合做分支看起來會像下圖那樣。
l git branch linux #→建立分支 l git checkout linux #→切換分支 l git branch #→查看當前分支狀況,當前分支前有*號
[root@gitlab git_data]# git branch * master [root@gitlab git_data]# git branch linux [root@gitlab git_data]# git branch linux * master [root@gitlab git_data]# git checkout linux 切換到分支 'linux' [root@gitlab git_data]# git branch * linux master |
想把Linux的工做成果合併到master分支上 先切換到master分支 git merge linux #→合併Linux分支至master 查看合併的文件 git branch -d linux #→確認合併完成後,能夠放心地刪除Linux分支 |
同時修改master和Linux分支同一個文件並提交,最後merge。
查看合併結果
模擬分支衝突 # 在master修改,提交 [root@gitlab git_data]# echo "master content" >>README [root@gitlab git_data]#git commit -a -m "master content" [master b52cc77] master content 1 file changed, 1 insertion(+)
# 切換到linux分支修改提交 [root@gitlab git_data]# git checkout linux 切換到分支 'linux' [root@gitlab git_data]# cat README 1 linux branch [root@gitlab git_data]# echo "linux content" >>README [root@gitlab git_data]# git commit -a -m "linux content" [linux cb72c04] linux content 1 file changed, 1 insertion(+)
# 回到master分支嘗試自動合併 [root@gitlab git_data]# git checkout master 切換到分支 'master' [root@gitlab git_data]# git merge linux 自動合併 README 衝突(內容):合併衝突於 README 自動合併失敗,修正衝忽然後提交修正的結果。
解決衝突 [root@gitlab git_data]# vim README 1 linux branch linux content [root@gitlab git_data]# git commit -a -m "hebingshibai content" [master 068b921] hebingshibai content [root@gitlab git_data]# git log |
由於以前已經合併了linux分支,因此如今看到它在列表中。 在這個列表中分支名字前沒有 * 號的分支一般可使用 git branch -d 刪除掉;你已經將它們的工做整合到了另外一個分支,因此並不會失去任何東西。
查看全部包含未合併工做的分支,能夠運行 git branch --no-merged: git branch --no-merged testing 這裏顯示了其餘分支。 由於它包含了還未合併的工做,嘗試使用 git branch -d 命令刪除它時會失敗: git branch -d testing error: The branch 'testing' is not fully merged. If you are sure you want to delete it, run 'git branch -D testing'. 若是真的想要刪除分支並丟掉那些工做,如同幫助信息裏所指出的,可使用 -D 選項強制刪除它。 |
windows 上git軟件網站 https://git-for-windows.github.io
軟件下載地址:https://github.com/git-for-windows/git/releases/download/v2.15.1.windows.2/Git-2.15.1.2-64-bit.exe
軟件安裝默認便可。
建立新的倉庫
定義倉庫的路徑
添加用戶信息(在 git bash中)
default@Hzs-Desktop MINGW64 /i/git_data (master) $ git config --global user.email "wuhuang@xxxxxxxxxxx@163.com"
default@Hzs-Desktop MINGW64 /i/git_data (master) $ git config --global user.name "wuhuang" |
在git Gui 中添加用戶信息,添加一次就可
在頁面中將數據配置好便可使用
查看歷史數據
前面咱們已經知道Git人人都是中心,那他們怎麼交互數據呢?
l 使用GitHub或者碼雲等公共代碼倉庫
l 使用GitLab私有倉庫
官方安裝文檔 https://about.gitlab.com/installation/
國內軟件鏡像站 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
機器內存給大點 yum -y localinstall gitlab-ce-9.1.4-ce.0.el7.x86_64.rpm gitlab-ctl reconfigure #→初始化,就執行一次 gitlab-ctl status
gitlab-ctl status/stop/start 經過瀏覽器訪問頁面10.0.0.63,設置初始密碼,其餘操做相似GitHUB。 帳戶:root 密碼本身設置爲12345678(八位數便可) |
第一次訪問,建立密碼
進行登錄,用戶名爲root,密碼爲12345678
建立一個新的項目
定義項目的名稱
建立完成後會提示沒有添加ssh密鑰
在服務器上建立ssh密鑰 使用ssh-ketgen 命令 [root@gitlab ~]# ssh-keygen [root@gitlab ~]# cat /root/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCr+4fZv83jQQDCngjmuiJFw0H0nGHfACVuxgZLszqla4VFZIKOCyXzexhhHW+vH7Us03AXssL7gFxSZg68bz+shBXz2OhFulwisdIQqbWFqBuWAthSrKQlnWIFzM9lzXX/ffI6xYlHP7i8c+Nz3C0Irm7lnP3M5IJpYIuCDuKc0NSGjQpxpqMYkzNqGCkYCk+rB8I/aZv9u49iOCD6I0WkEpbL2hzoR7gUMi/Wyy6gKag1Cy3Omi7FS19dGofITmG6XlFDcRzRH9pz8eBzbzlKmX1GjsndEELCImHLKjmRmvopdF5J7b1wfWYcHfS+Z+SSx2rCeIF4zxzIfO+osnkD root@gitlab |
將密鑰添加到web界面的用戶中
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@gitlab.example.com:root/clsn.git cd clsn 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@gitlab.example.com:root/clsn.git git add . git commit -m "Initial commit" git push -u origin master Existing Git repository cd existing_repo git remote rename origin old-origin git remote add origin git@gitlab.example.com:root/clsn.git git push -u origin --all git push -u origin --tags |
[root@gitlab ~]# git clone git@10.0.0.63:root/wuhuang.git 正克隆到 'wuhuang'... warning: 您彷佛克隆了一個空版本庫。
建立文件並推到遠端git倉庫 [root@gitlab ~]# cd wuhuang/ [root@gitlab wuhuang]# touch README.md [root@gitlab wuhuang]# git add README.md [root@gitlab wuhuang]# git commit -m "add README" [master(根提交) 128444a] add README 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md
[root@gitlab wuhuang]# git push -u origin master Counting objects: 3, done. Writing objects: 100% (3/3), 211 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To git@10.0.0.63:root/wuhuang.git * [new branch] master -> master 分支 master 設置爲跟蹤來自 origin 的遠程分支 master。
|
推送完成後可以在web界面中查看並添加內容
拉取文件 [root@gitlab wuhuang]# git pull remote: Counting objects: 3, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. 來自 10.0.0.63:root/wuhuang 128444a..22c72d6 master -> origin/master 更新 128444a..22c72d6 Fast-forward README.md | 9 +++++++++ 1 file changed, 9 insertions(+)
查看文件 [root@gitlab wuhuang]# cat README.md # 1. 第一章 git
```html git config --global user.name "wuhuang" #配置git使用用戶 git config --global user.email "xxxxxxxxxxx@163.com" #配置git使用郵箱 git config --global color.ui true #語法高亮 git config --list #查看全局配置 ``` |
開機自啓動gitlab gitlab-ctl start #→再次開機以後需從新啓動(在初始化以後gitlab自動啓動) chmod +x /etc/rc.d/rc.local echo 'gitlab-ctl start' >>/etc/rc.local |