参考
http://www.cnblogs.com/clsn/p/7929958.html#auto_id_16
https://backlog.com/git-tutorial/cn/intro/intro1_1.html
https://git-scm.com/book/zh/v2
Git安装
yum安装
[root@12 ~]# yum install -y git
编译安装
下载地址
https://github.com/git/git/releases
安装依赖
[root@12 ~]# yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc*
上传tar包,编译安装
[root@12 ~]# tar -zxf git-2.17.0.tar.gz [root@12 ~]# cd git-2.17.0/ [root@12 git-2.17.0]# make configure
如果报如图错误,安装qutoconf
[root@12 git-2.17.0]# yum install -y autoconf
没问题继续
[root@12 git-2.17.0]# ./configure --prefix=/usr/local [root@12 git-2.17.0]# make [root@12 git-2.17.0]# make install
配置Git
[root@12 ~]# git config --global user.name "wanglan" #配置Git使用用户 [root@12 ~]# git config --global user.email "123456@qq.com" #配置Git使用邮箱 [root@12 ~]# git config --global color.ui true #语法高亮 [root@12 ~]# git config --list # 查看全局配置 user.name=wanglan user.email=123456@qq.com color.ui=true
配置后生成的配置文件
[root@12 ~]# cat .gitconfig [user] name = wanglan email = 123456@qq.com [color] ui = true
创建Git仓库
[root@12 ~]# mkdir git_data #创建Git目录 [root@12 ~]# cd git_data [root@12 git_data]# git init #初始化Git仓库 Initialized empty Git repository in /root/git_data/.git/ [root@12 git_data]# git status #查看工作状态 On branch master #位于master分支上 No commits yet #没有提交的内容 nothing to commit (create/copy files and use "git add" to track)
创建文件
[root@12 git_data]# touch README [root@12 git_data]# git status On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) README nothing added to commit but untracked files present (use "git add" to track)
添加文件跟踪
[root@12 git_data]# git add ./* [root@12 git_data]# git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: README
文件会添加到 .git 的隐藏目录
[root@12 git_data]# tree .git/ .git/ ├── branches ├── config ├── description ├── HEAD ├── hooks │ ├── applypatch-msg.sample │ ├── commit-msg.sample │ ├── fsmonitor-watchman.sample │ ├── post-update.sample │ ├── pre-applypatch.sample │ ├── pre-commit.sample │ ├── prepare-commit-msg.sample │ ├── pre-push.sample │ ├── pre-rebase.sample │ ├── pre-receive.sample │ └── update.sample ├── index ├── info │ └── exclude ├── objects │ ├── e6 │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 │ ├── info │ └── pack └── refs ├── heads └── tags
由工作区提交到本地仓库
[root@12 git_data]# git commit -m "test" # -m后面为注释信息 [master (root-commit) 52c2c95] test 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README
查看Git的状态
[root@12 git_data]# git status On branch master nothing to commit, working tree clean
查看提交后的Git目录状态
[root@12 git_data]# tree .git/ .git/ ├── branches ├── COMMIT_EDITMSG ├── config ├── description ├── HEAD ├── hooks │ ├── applypatch-msg.sample │ ├── commit-msg.sample │ ├── fsmonitor-watchman.sample │ ├── post-update.sample │ ├── pre-applypatch.sample │ ├── pre-commit.sample │ ├── prepare-commit-msg.sample │ ├── pre-push.sample │ ├── pre-rebase.sample │ ├── pre-receive.sample │ └── update.sample ├── index ├── info │ └── exclude ├── logs │ ├── HEAD │ └── refs │ └── heads │ └── master ├── objects │ ├── 52 │ │ └── c2c95476560f3b65a23884bbf6a44c2e5e51c7 │ ├── 54 │ │ └── 3b9bebdc6bd5c4b22136034a95dd097a57d3dd │ ├── e6 │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 │ ├── info │ └── pack └── refs ├── heads │ └── master └── tags
删除Git内的文件
没有添加到暂存区的数据直接rm删除即可
已经添加到缓存区的数据:
将文件从Git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)
git rm --cached database
将文件数据从git暂存区和工作目录一起删除
git rm -f database
将文件撤出暂存区
git reset HEAD database
实践
创建新文件
[root@12 git_data]# touch 123 [root@12 git_data]# git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) 123 nothing added to commit but untracked files present (use "git add" to track)
将文件添加到暂存区域
[root@12 git_data]# git add 123 [root@12 git_data]# git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: 123 [root@12 git_data]#
删除文件
[root@12 git_data]# rm 123 -f [root@12 git_data]# ls README [root@12 git_data]# git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: 123 Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: 123 [root@12 git_data]# git reset HEAD 123 [root@12 git_data]# git status On branch master nothing to commit, working tree clean
重命名暂存区数据
没有添加到暂存区的数据直接mv/rename改名即可。
已经添加到暂存区数据:
git mv README NOTICE
查看历史记录
查看提交历史记录
git log
查看最近几条记录
git log -2
显示每次提交的内容差异,例如仅查询最近一次差异
git log -p -1
简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息
git log --stat -2
以更详细的模式输出提交的历史记录
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服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。
查看现在的hash
git reset --hard
还原历史提交版本上一次
git reset --hard HEAD^
找到历史还原点的SHA-1值后,就可以还原(值不写全,系统会自动匹配)
[root@12 git_data]# git log commit a409fc46f792228a8119705e9cc97c2a013534ab Author: clsn <13835544305@163.com> Date: Wed Nov 29 11:44:14 2017 +0800 test commit bb963eb32ad93a72d9ce93e4bb55105087f1227d Author: clsn <13835544305@163.com> Date: Wed Nov 29 10:57:02 2017 +0800 first commit
还原数据
[root@12 git_data]# git reset --hard bb963 HEAD 现在位于 bb963eb first commit # 查看数据 [root@gitlab git_data]# ls README
还原未来数据
什么是未来数据?就是你还原到历史数据了,但是你后悔了,想撤销更改,但是git log已经找不到这个版本了
查看未来历史更新点:git reflog
[root@12 git_data]# git reflog bb963eb HEAD@{0}: reset: moving to bb963 a409fc4 HEAD@{1}: reset: moving to a409fc4 bb963eb HEAD@{2}: reset: moving to bb963 a409fc4 HEAD@{3}: commit: test bb963eb HEAD@{4}: commit (initial): first commit [root@gitlab git_data]#
标签使用
前面回滚使用的是一串字符串,又长又难记,
当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag
git tag v1.0
查看当前所有的标签
git show v1.0
创建带有说明的标签,-a指定标签名字,-m指定说明文字
git tag v1.2 -m "version 1.2 release is test"
为同一个提交版本设置了两次标签,删除之前的v1.0
git tag -d v1.0
测试
[root@12 git_data]# git reset --hard 0bdf2e7 HEAD is now at 0bdf2e7 modified README file [root@gitlab git_data]# git reset --hard V1.0 HEAD is now at a66370a add test dir [root@12 git_data]# git tag v20171129 [root@gitlab git_data]# git tag v20171129
对比数据
git diff可以对比当前文件与仓库已保存文件的区别,知道了对README作了什么修改
git diff README
分支结构
在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,平时不要随便直接修改里面的数据文件。干活都在dev分支上。每个人从dev分支创建自己个人分支,开发完合并到dev分支,最后dev分支合并到master分支。所以团队的合作分支看起来会像下图那样
分支切换
[root@12 git_data]# git branch linux [root@gitlab git_data]# git branch linux * master [root@12 git_data]# git checkout linux 切换到分支 'linux' [root@gitlab git_data]# git branch * linux master
在linux分支进行修改
[root@12 git_data]# cat README [root@12 git_data]# echo "2017年11月30日" >> README [root@12 git_data]# git add . [root@12 git_data]# git commit -m "2017年11月30日09点10分" [linux 5a6c037] 2017年11月30日09点10分 1 file changed, 1 insertion(+) [root@12 git_data]# git status # 位于分支 linux 无文件要提交,干净的工作区
回到master分支
[root@12 git_data]# git checkout master 切换到分支 'master' [root@12 git_data]# cat README [root@12 git_data]# git log -1 commit 7015bc7b316cc95e2dfe6c53e06e3900b2edf427 Author: clsn <admin@znix.top> Date: Wed Nov 29 19:30:57 2017 +0800 123
合并代码
[root@12 git_data]# git merge linux 更新 7015bc7..5a6c037 Fast-forward README | 1 + 1 file changed, 1 insertion(+) [root@gitlab git_data]# git status # 位于分支 master 无文件要提交,干净的工作区 [root@gitlab git_data]# cat README 2017年11月30日
删除分支
查看所有包含未合并工作的分支
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 选项强制删除它
Gitlab(机器内存配置应最少为4G,否则会卡顿)
参考文档:
https://about.gitlab.com/installation/#centos-7
安装并配置必要的依赖关系
在CentOS上,以下命令也将在系统防火墙中打开HTTP和SSH访问
[root@node1 ~]# yum install -y curl policycoreutils openssh-server openssh-clients [root@node1 ~]# systemctl enable sshd [root@node1 ~]# systemctl start sshd [root@node1 ~]# firewall-cmd --permanent --add-service=http 如果开放了防火墙重新加载防火墙 [root@node1 ~]#systemctl reload firewalld
添加GitLab包服务器并安装包
安装包下载地址
官网 :https://about.gitlab.com/downloads/
清华大学镜像: https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
[root@node1 ~]# wget https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.6.2-ce.0.el7.x86_64.rpm [root@node1 ~]# rpm -ivh gitlab-ce-9.5.2-ce.0.el7.x86_64.rpm
配置并启动GitLab
[root@node1 ~]# gitlab-ctl reconfigure # 编译配置
[root@node1 ~]# gitlab-ctl start [root@node1 ~]# gitlab-ctl status
通过浏览器访问 :IP地址
配置GitLab域名,否则项目git clone的地址时错
[root@11 ~]# vim /etc/gitlab/gitlab.rb 编辑 :external_url '你的网址' 例如 :external_url 'http://192.168.1.100' 编辑完成后,再 gitlab-ctl reconfigure 使配置生效
进行web界面操作
第一次访问时创建密码
登录用户为root,
创建一个新的项目
定义项目
创建完成后会提示没有添加ssh秘钥
在服务器上创建ssh秘钥
[root@11 ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:8v/xXIGry7oNGpAemTjuMTWyauX0DNYgDdtTivrWRZQ root@10.0.0.11 The key's randomart image is: +---[RSA 2048]----+ | . | | . .E | | * o. | | + *. = . | |. .++X. S . . | |. .=*.=o . .| | .=*+o ... .. .| | .=.+o o.+ .+ . | |.o . . o+*o o | +----[SHA256]-----+ [root@10 ~]# cat .ssh/id_rsa id_rsa id_rsa.pub
[root@11 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDQMQD/rUedK+DNzENuhcv8vF0zQ01iQ9nbjJIGdL/u/ymePXeydv1ZMQ1ZXZXGy4BT+Zg1Xj/KUxYbPyXQ0TIdnfF0d9FIraAfxk8K7m47l9c7iECcncvVnQfbHLpoCTudKnOiuci/4rKQzUxaSfZhdPsZ0NXyOCiYxC07ior4AMk/YeAwOVDWDU2CQDfur2QwUbLuV2+gFA2CR+9fYpXgYMv0Sr4cUJ02JOiz3rSAi6Anl4riyqI9qdX+1FU5bS1y5SJ/nbHwmu2MJ5vOeFczczpxocsXpQT/lz40HMnsjAXp38qTPdVIDS3Enig4mR9w64WZJ5M0lTCSamCtSep root@10.0.0.11
将秘钥添加到web页面的用户中
本地仓库创建 提交 推送
所有代码只能向 dev
分支推送,不允许直接推送 master
分支。你也提不上。。
方法一:适用于不存在demo
仓库
git clone http://git.xinchanedu.com/root/demo.git cd demo touch README.md git add README.md git commit -m "add README" git push -u origin master:dev
方法二:适用于已经存在demo
目录
cd demo git init git remote add origin http://git.xinchanedu.com/root/demo.git git add . git commit -m "Initial commit" git push -u origin master:dev
方法三:适用于已经存在demo
仓库
cd demo git remote rename origin old-origin git remote add origin http://git.xinchanedu.com/root/demo.git git push -u origin master:dev # 本地所有分支推到dev git push -u origin master:dev --tags # 本地所有tags推到dev
创建文件并推到远端git仓库
[root@11 Test1]# echo "clsn" >> clsn [root@11 Test1]# git push -u origin master