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