一、git安装
1、下载
https://github.com/git/git/archive/v2.14.0-rc0.tar.gz
2、源码编译安装
Git 的工作需要调用 curl,zlib,openssl,expat,libiconv 等库的代码,所以需要先
安装这些依赖工具。在有 yum 的系统上(比如 Fedora)或者有 apt-get 的系统上(比
如 Debian 体系),可以用下面的命令安装:
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc xmlto
[root@mq129 git]# tar -zxf git-2.14.0-rc0.tar.gz
[root@mq129 git]# cd git-2.14.0-rc0
方式一:
[root@mq129 git-2.14.0-rc0]# make prefix=/usr/local/git all doc
#这里同时指定all和doc这两个目标,指定doc是为了安装git的帮助文档到man手册里面,只指定all的话,默认并不包含git的帮助文档,这样在man手册中就查不到git的帮助。
[root@mq129 git-2.14.0-rc0]# make prefix=/usr/local/git install install-doc install-html
常见错误:
1、缺少asciidoc
/bin/sh: line 1: asciidoc: command not found
make[1]: *** [git-add.html] 错误 127
make[1]: Leaving directory `/root/git/git-2.14.0-rc0/Documentation'
make: *** [doc] 错误 2
解决方法:
[root@mq129 git-2.14.0-rc0]# yum list all|grep asciidoc
asciidoc.noarch 8.4.5-4.1.el6 base
[root@mq129 git-2.14.0-rc0]# yum install -y asciidoc.noarch
2、缺少xmlto
XMLTO git-add.1
/bin/sh: line 1: xmlto: command not found
make[1]: *** [git-add.1] 错误 127
make[1]: Leaving directory `/root/git/git-2.14.0-rc0/Documentation'
make: *** [doc] 错误 2
解决方法:
[root@mq129 git-2.14.0-rc0]# yum list all|grep xmlto
python-xmltodict.noarch 0.4.2-2.el6 epel
xmlto.x86_64 0.0.23-3.el6 base
xmlto-tex.noarch 0.0.23-3.el6 base
xmlto-xhtml.noarch 0.0.23-3.el6 base
xmltoman.noarch 0.4-4.el6 base
[root@mq129 git-2.14.0-rc0]# yum -y install xmlto.x86_64
方式二:
~]# yum -y install autoconf
~]# make configure 或者 autoconf
# 备注:生成 configure 文件
~]# ./configure --prefix=/usr/local/git
~]# make all doc
~]# make install install-doc install-html
方式三:
~]# yum -y install git # 安装 git
~]# yum -y install git-all.noarch # 安装 git 所有的包,非必须
3、环境配置
echo 'export PATH=/usr/local/git/bin:$PATH' > /etc/profile.d/git.sh
[root@mq129 ~]# echo 'export PATH=/usr/local/git/bin:$PATH' > /etc/profile.d/git.sh
[root@mq129 ~]# source /etc/profile
[root@mq129 ~]# git --version
git version 2.14.0-rc0
4、man 文档配置
[root@mq129 ~]# vim /etc/man.config
添加内容:MANPATH /usr/local/git/share/man
查看帮助
格式一:
~]# git help init
格式二:
~]# man git-init
5、服务器身份认证(authorized_keys)
把本地的公钥 id_rsa.pub 里面的内容加入到 /home/git/.ssh/authorized_keys,一行一个,可以加入多个公钥,git 操作时不再需要密码。
[root@mq129 ~]# cat .ssh/id_rsa.pub >/home/git/.ssh/authorized_keys
[root@mq129 ~]# ssh get@mq129
get@mq129's password:
[root@mq129 ~]# ssh git@mq129
[git@mq129 ~]$ exit
4:初始化仓库:(结尾为 .git)
创建空项目
~]# cd /home/git # 进入git家目录
~]# git init --bare useryx.git
# 例如 git init --bare 仓库名.git
[root@mq129 ~]# cd /home/git/
[root@mq129 git]# ls -a
. .. .bash_logout .bash_profile .bashrc .gnome2
[root@mq129 git]# git init --bare useryx.git
已初始化空的 Git 仓库于 /home/git/useryx.git/
项目已有内容
~]# git init
# cd 进入项目进行初始化
~]# git clone --bare 目录名 仓库.git
# 例如:git clone --bare useryx useryx.git
# 仓库外面执行
5:修改仓库用户组为 git
~]# chown git:git useryx.git
6:拉取仓库
~]# git clone [ssh://]用户名@地址:仓库名.git
# 例如:git clone git@192.168.31.73:useryx.git 或者 家目录下的一个文件内如 git clone git@192.168.31.73:/home/git/dir/a.git
5、创建一个git用户,用来运行git服务
1:添加用户:
~]# useradd git
2:权限(用户组合用户均为git):
/home/git/.ssh 权限为:700
/home/git/.ssh/authorized_keys 权限为:600
~]# mkdir /home/git/.ssh
~]# chmod 700 /home/git/.ssh
~]# touch /home/git/.ssh/authorized_keys
~]# chmod 600 /home/git/.ssh/authorized_keys
~]# chown -R git:git /home/git/.ssh
# 注意: id_rsa 权限为 600 id_rsa.pub 权限为 644
6、创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
创建公钥是在客户端创建,然后添加到服务端的证书文件中。
7、初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
[root@mq129 ~]# cd /srv/
[root@mq129 srv]# git init --bare sample.git
已初始化空的 Git 仓库于 /srv/sample.git/
[root@mq129 srv]# ls
sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了
共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常
都以.git结尾。然后,把owner改为git:
[root@mq129 srv]# chown -R git:git sample.git
8、禁止ssh用户登录,可以不用设置。
~]# vim /etc/passwd
# 修改git 用户登录shell
以下两种方式任选一种:
1:使用linux系统的 /sbin/nologin 不允许登录
git:x:1001:1001::/home/git:/sbin/nologin
2:使用git服务 git-shell 的 /usr/local/git/bin/git-shell,which git-shell 查看命令位置。
git:x:1001:1001::/home/git:/usr/local/git/bin/git-shell
gitshell常见错误:
[root@mq129 bin]# ssh git@mq129
Last login: Fri Jul 21 15:22:38 2017 from mq129
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to mq129 closed.
错误原因:1、需要在git用户的家目录下创建一个git-shell-commands目录
2、可能是因为git-shell的权限没有赋给git用户
[root@mq129 bin]# cd /home/git/
[root@mq129 git]# ls
useryx.git
[root@mq129 git]# mkdir git-shell-commands
二、客户端初始化配置
1、客户端git安装和认证
[root@mq128 ~]# yum -y install git
客户端生成公钥与私钥 ssh-keygen(切换至需要生成公钥与私钥的用户)
[root@mq128 ~]# useradd git
[root@mq128 ~]# su - git
[git@mq128 ~]$ ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' #创建公钥
Generating public/private rsa key pair.
Created directory '/home/git/.ssh'.
Your identification has been saved in /home/git/.ssh/id_rsa.
Your public key has been saved in /home/git/.ssh/id_rsa.pub.
The key fingerprint is:
a0:5e:82:c5:d5:8a:31:09:35:9c:5c:1d:1e:fe:0a:b8 git@mq128
The key's randomart image is:
+--[ RSA 2048]----+
| .=o+ooo. |
| .Bo oo. |
| o+..o |
| o.o.. . |
| . + o S . |
| . + . . |
| E . |
| |
| |
+-----------------+
[git@mq128 ~]$ cat .ssh/id_rsa.pub #将公钥信息添加到mq129服务器的/home/git/.ssh/authorized_keys文件中
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzRTMh2q9v/KFE2rtLZcp8rBc75OjqVVgzQiTA6Py2VQ6SWN2B0FoVs010o3xrzEUFLDleBtzF0oIf5102+Ms9jHXQOZbQ/pbOesXQCVak5+kQbk/jai3mNi0bhy9+7VrSjziGrkkrJLEN+ToZuzacd7V+IjAkxCT3/mpARr57vBl0B26dFl1Y2N3ZF9NUKUlSDIiMgTkbKmtKyECpU5eO7WVmGsDjBE3Pop0tKHRp288If771SM+Wr+XHNS1kIK5NTxrXiRV5VEcofH87vRyfr2R56dj9i48x9NoscfCR+losCBw4Wj0jHaAITWhkRFOxRtktR6Zhta0inn44q8Ibw== git@mq128
[git@mq128 ~]$ ssh git@mq129 #添加公钥成功后可以直接无密码登录mq129服务器
The authenticity of host 'mq129 (192.168.198.129)' can't be established.
RSA key fingerprint is 10:62:b7:95:e7:38:a8:82:27:58:f6:d2:30:40:c7:d6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'mq129,192.168.198.129' (RSA) to the list of known hosts.
Last login: Fri Jul 21 16:42:15 2017 from mq129
git>
安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中
[git@mq128 sample]$ git config --global user.name lzh
[git@mq128 sample]$ git config --global user.email lzh@gittest
2、克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行
[git@mq128 ~]$ mkdir srv
[git@mq128 ~]$ cd srv/
[git@mq128 srv]$ git clone git@mq129:/srv/sample.git
Initialized empty Git repository in /home/git/srv/sample/.git/
warning: You appear to have cloned an empty repository.
3、添加文件
[git@mq128 ~]$ cd srv/sample/
[git@mq128 sample]$ ls
test.txt
[git@mq128 sample]$ ls -a
. .. .git test.txt
[git@mq128 sample]$ git add test.txt
执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
[git@mq128 sample]$git commit -m "add test"
简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
嫌麻烦不想输入-m "xxx"行不行?确实有办法可以这么干,但是强烈不建议你这么干,因为输入说明对自己对别人阅读都很重要。实在不想输入说明的童鞋请自行Google,我不告诉你这个参数。
git commit命令执行成功后会告诉你,1个文件被改动
3、添加远程仓库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个
Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作
为备份,又可以让其他人通过该仓库来协作,真是一举多得。
[git@mq128 sample]$ git remote add origin git@mq129:/srv/sample.git
fatal: remote origin already exists. #这里的提示是因为前面已经克隆了远程仓库,而且默认名为origin,可以忽略改步骤,或者修改origin名称。
[git@mq128 sample]$ git push -u origin master #把当前分支master推送到远程
Counting objects: 6, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 467 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)
To git@mq129:/srv/sample.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
[git@mq128 sample]$ git push -u origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容
推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
[root@mq129 sample.git]# git log #查看远程服务器的日志
commit 5aacad902a3679e15b9b2d1c05cf585cd04baa8f (HEAD -> master)
Author: lzh <lzh@gittest>
Date: Fri Jul 21 17:35:00 2017 +0800
wrote a test file
commit 2aa5f64ada87fa4cc16d3509a80978354f8b3452
Author: git <git@mq128.(none)>
Date: Fri Jul 21 17:29:40 2017 +0800
注意:远程服务器的git仓库是空的,不能查看文件,但是可以在远程git服务器的版本信息克隆岛远程服务器本地。
[root@mq129 git]# git clone /srv/sample.git/ test #本地克隆
正克隆到 'test'...
完成。
[root@mq129 test]# ls #可以看到刚才客户端更新的文件
test.txt
[root@mq129 test]# git ls-files #已追踪的(tracked)文件
test.txt
[root@mq129 test]# git config --list #本地仓库配置信息
user.name=lzh
user.email=lzh@gittest129
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=/srv/sample.git/ #远程仓库
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
4、git 恢复丢失的文件
[git@mq128 sample]$ ls #没有文件
[git@mq128 sample]$ git checkout HEAD test.txt
[git@mq128 sample]$ ls
test.txt
5、客户端与服务器端获取与推送
Git中从远程的分支获取最新的版本到本地有这样2个命令:
1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge
首先从远程的origin的master主分支下载最新的版本到origin/master分支上
然后比较本地的master分支和origin/master分支的差别
最后进行合并
上述过程其实可以用以下更清晰的方式来进行:
git fetch origin master:tmp
git diff tmp
git merge tmp
从远程获取最新的版本到本地的test分支上
之后再进行比较合并
2. git pull:相当于是从远程获取最新版本并merge到本地
git pull origin master
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并
客户端修改、提交、推送:
[git@mq128 sample]$ mkdir data
[git@mq128 sample]$ cd data/
[git@mq128 data]$ vim data.txt
[git@mq128 data]$ cd ..
[git@mq128 sample]$ git add test.txt data #添加丢给的文件到本地仓库
[git@mq128 sample]$ git commit -m 'update 128' #提交修改到本地仓库
[master 6095280] update 128
2 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 data/data.txt
[git@mq128 sample]$ git push
Counting objects: 7, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 403 bytes, done.
Total 5 (delta 0), reused 0 (delta 0)
To git@mq129:/srv/sample.git
64efa5b..6095280 master -> master
[git@mq128 sample]$ git push #推送到远程git仓库
Counting objects: 7, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 403 bytes, done.
Total 5 (delta 0), reused 0 (delta 0)
To git@mq129:/srv/sample.git
64efa5b..6095280 master -> master
服务端获取、修改、提交:
[root@mq129 test]# git fetch
remote: 对象计数中: 5, 完成.
remote: 压缩对象中: 100% (3/3), 完成.
remote: Total 5 (delta 0), reused 0 (delta 0)
展开对象中: 100% (5/5), 完成.
来自 /srv/sample
64efa5b..6095280 master -> origin/master
[root@mq129 test]# ls
test.txt
[root@mq129 test]# git status
位于分支 master
您的分支落后 'origin/master' 共 1 个提交,并且可以快进。
(使用 "git pull" 来更新您的本地分支)
无文件要提交,干净的工作区
[root@mq129 test]# git pull #更新您的本地分支
更新 64efa5b..6095280
Fast-forward
data/data.txt | 1 + #更新本地当前文件成功
test.txt | 1 +
2 files changed, 2 insertions(+)
create mode 100644 data/data.txt
[root@mq129 test]# ls
data test.txt
注意:这里服务端获取文件,并不是远程仓库,而是远程仓库的一个本地克隆,本质上也是一个客户端,只是它服务器上而已,
同理服务器上的客户端的更改也可以同步到mq128上的客户端
[root@mq129 test]# vim data/data.txt #丢给文件
[root@mq129 test]# git add data/
[root@mq129 test]# git commit
终止提交因为提交说明为空。
[root@mq129 test]# git commit -m 'update data 129'
[master 4c36982] update data 129
1 file changed, 1 insertion(+)
[root@mq129 test]# git push #推送到远程仓库
对象计数中: 4, 完成.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (4/4), 334 bytes | 0 bytes/s, 完成.
Total 4 (delta 0), reused 0 (delta 0)
To /srv/sample.git/
6095280..4c36982 master -> master
[git@mq128 sample]$ git fetch #获取远程仓库的信息、但不会merge
remote: 对象计数中: 4, 完成.
remote: 压缩对象中: 100% (2/2), 完成.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From mq129:/srv/sample
6095280..4c36982 master -> origin/master
[git@mq128 sample]$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded. #还未更新
#
nothing to commit (working directory clean)
[git@mq128 sample]$ git pull #从远程获取最新版本并merge到本地
Updating 6095280..4c36982
Fast-forward
data/data.txt | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
[git@mq128 sample]$ git status
# On branch master
nothing to commit (working directory clean)
[git@mq128 sample]$ cat data/data.txt
how are you ?
update 128 #已经更新的内容
|