【Linux】【Services】【VersionControl】Git基礎概念及使用

1. 簡介git

1.1. 版本控制工具:bash

本地版本控制系統:服務器

集中化版本控制系統:CVS,SVNapp

分佈式版本控制系統: BitKeeper,Gitssh

1.2. 官方網站:socket

https://git-scm.comtcp

1.3. Git基本結構分佈式

工做區:Workding Directory工具

暫存庫:Staging Areapost

版本庫: Repository

1.4. Git倉庫包含索引(暫存)和對象庫(版本庫)

1.5. 相關文檔

免費的ebook: https://git-scm.com/book/zh/v2

1.6.Git的對象類型

塊(blob)對象:文件的每一個版本表現爲一個塊(blob)

樹(tree)對象:一個目錄表明一層目錄信息

提交(commit)對象:用於保存版本庫一次變化的元數據,包括做者、郵箱、提交日期、日誌;每一個提交對象都指定一個目錄樹對象

標籤(tag)對象:用於給一個特定對象一個易讀的名稱; 

1.7. Git的文件分類

已追蹤的(tracked):已經在版本庫中,或者已經使用git add命令添加至索引中的文件;

被忽略的(Ignored):在版本庫中經過「忽略文件列表」明確聲明爲被忽略的文件;

未追蹤的(untracked):上述兩類以外的其餘文件;

 

2. Git簡單使用

2.1. git init

~]cd /root
~]mkdir myproject
~]cd myproject
~]git init
~]# 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

 

2.2. git config

##添加全局配置參數
git config --global user.sex male
git config --global user.name eric

##添加本地配置參數
git config --add user.mail eric@123

##這個是全局參數,在用戶家目錄下
~]# pwd
/root
~]# ls -al .gitconfig
-rw-r--r-- 1 root root 20 Aug  7 04:13 .gitconfig
~]# cat .gitconfig
[user]
        name = eric
        sex = male
~]# git config -l --global
user.name=eric
user.sex=male

##這個是本地參數,在項目目錄下
~]# pwd
/root/myproject/.git
~]# ls -al config
-rw-r--r-- 1 root root 116 Aug  7 04:57 config
~]# git config -l --local
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.mail=eric@123
~]# cat config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[user]
        mail = eric@123

#還有一個系統級的在/etc/gitconfig
~]# git config -l --system

 

2.3. git add

git add . #暫存當前目錄全部
git add DIR #暫存指定DIR

 

2.4. git commit

提交的標識:

  引用:ID,reference,SHA1,絕對提交名

  符號引用:symbolic reference,symref;

    本地特性分支名稱、遠程跟蹤分支名稱、標籤名;

    名稱:

      refs/heads/REF:本地特性分支名稱

      refs/remotes/REF:遠程跟蹤分支名稱

      refs/tags/REF:標籤名

 

git會自動維護幾個特定目的的特殊符號引用:

  HEAD:始終指向當前分支的最近提交;或檢出到其餘分支時,目標分支的最近提交;

  ORIG_HEAD:合併操做時,新生成的提交以前的提交保存於此引用中;

  FETCHED_HEAD:

  MERGE_HEAD:合併操做時,其餘分支的上一次提交;

#add不add均可以commit,可是commit以前要指定email和user
~]# git commit -m "v0.1"

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

#再次提交
~]# git commit -m "v0.1"
[master (root-commit) 3c56c9b] v0.1
 1 file changed, 1 insertion(+)
 create mode 100644 readme.md

 

2.5. git clone

#能夠clone本地或者遠程的項目
~]# git clone myproject/ Newmyproject
Cloning into 'Newmyproject'...
done.

 

2.6. git status

# 已經提交或者剛建立
~]# git status
# On branch master
nothing to commit, working directory clean

# 修改一下
~]# echo "installation" >> install.sh
~]# git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       install.sh
nothing added to commit but untracked files present (use "git add" to track)

# 保存一下
~]# git add install.sh
~]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   install.sh
#

#提交一下
~]# git commit -m "v0.2"
[master 19cb183] v0.2
 1 file changed, 1 insertion(+)
 create mode 100644 install.sh
~]# git status
# On branch master
nothing to commit, working directory clean

  

2.7. 文件相關

git ls-files:默認顯示索引中的文件列表的原始文件名;

      -s:顯示暫存的文件信息,;權限、對象名、暫存號及原始文件名;

      -o:顯示未被追蹤的文件

      --unmerged:只查看未合併的文件

git cat-file

git rm:刪除工做目錄中的文件,及索引中的映射;

  --cached:只刪除索引中的映射

git mv:改變工做目錄中的文件名,及索引中的映射


~]# git ls-files -s 100644 3100e23cd38ef12583bfc792b5c62aea7e9dbaca 0 install.sh 100644 3b18e512dba79e4c8300dd08aeb37f8e728b8dad 0 readme.md ~]# git cat-file -p 3100e23cd38ef12583bfc792b5c62aea7e9dbaca installation

  

2.8. git log

git log --graph --pretty=oneline --abbrev-commit

~]# git log
commit 19cb183c7270e8fe4015f11e7d712372ba40c3b4
Author: eric <eric@1234.com>
Date:   Tue Aug 7 07:38:17 2018 +0200

    v0.2

commit 3c56c9bd0bf1600982e0af01540e96207276f136
Author: eric <eric@1234.com>
Date:   Tue Aug 7 05:11:50 2018 +0200

    v0.1

  

2.9. git diff

~]# git diff --color 3c56c9bd0bf1600982e0af01540e96207276f136 19cb183c7270e8fe4015f11e7d712372ba40c3b4
diff --git a/install.sh b/install.sh
new file mode 100644
index 0000000..3100e23
--- /dev/null #老文件
+++ b/install.sh #新文件
@@ -0,0 +1 @@
+installation

  

 2.10. git reset:撤銷此前的操做;

  --soft:將HEAD引用指向給定的提交,但不影響索引和工做目錄;

  --mixed:將HEAD引用指向指定的提交,並將索引內容改變爲指定提交的快照;但不改變工做目錄;

  --hard:將HEAD引用指向給定的提交、將索引內容改變爲指定提交的快照,並改變工做目錄中的內容反映指定提交的內容

 

2.11. git branch:列出、建立及刪除分支

  git branch BRANCH_NAME [START_COMMIT]

  git branch -d BRANCH_NAME

 

2.12. git show-branch:查看分支及其相關的提交

 

2.13. git checkout:在分支間切換

    git checkout <branch>:檢出分支

 

2.14. git merge BRANCK_NAME #須要checkout到master

 

3. git服務器

3.1. 支持的協議:本地協議(local)、HTTP/HTTPS協議、SSH協議、Git協議

3.2. 本地協議:

git clone file:///path/to/repo.git /path/to/local/server

git clone /path/to/repo.git /path/to/local/server

  

3.3. Git協議:由git-deamon程序提供,監聽在tcp的9418端口;僅支持「讀」操做,無任何認證功能;

git://host/path/to/repo.git

git://host/~user/path/to/repo.git

  

3.4. SSH協議:

ssh://[USER@]host[:port]/path/to/repo.git

ssh://[USER@]host[:port]/~USERNAME/path/to/repo.git

[USER@]host/path/to/repo.git

  

3.5. HTTP/HTTPS協議:在1.6.5以前的版本爲啞http協議,只能讀不能寫,不能認證,在1.6.6以後的版本爲智能http協議,可讀可寫可認證

http://host/path/to/repo.git #這是一個映射的地址,並非服務器真實的路徑

  

3.6.引用遠程版本庫:

遠程版本庫是定義在配置文件中的一個實體,在配置文件中體現爲[remote "NAME"],它由兩部分組成,URL+refspec(定義一個版本庫與其餘版本庫的名稱空間的映射關係)

+source:destination
    refs/heads/NAME:本地分支
    refs/remotes/NMAE:遠程跟蹤分支

[remote "publis"]
url = http://HOST/pub/repo_name.git
push = + refs/heads/*:refs/remote/origin/*

remote.publish.url
remote.publish.push

  

3.7. git remote命令:管理遠程倉庫

 

 

4. git服務器

4.1. 安裝必要的包

yum install -y git-daemon httpd

  

4.2. 檢查httpd安裝

# 修改http配置文件
~]# sed  "s/\<ServerName/ServerName YOURSERVERIP:80/g" /etc/httpd/conf/httpd.conf

# alias,cgi,env這三個模塊必需要有
~]# httpd -M |grep -Ei "\<(alias|cgi|env)"
 alias_module (shared)
 env_module (shared)
 cgi_module (shared)

~]# systemctl start httpd

  

4.3. 檢查git-deamon安裝

~]# cat /usr/lib/systemd/system/git@.service
[Unit]
Description=Git Repositories Server Daemon
Documentation=man:git-daemon(1)

[Service]
User=nobody
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/lib/git --export-all --user-path=public_git --syslog --inetd --verbose
StandardInput=socket~]# systemctl start git.socket
相關文章
相關標籤/搜索