1/8
GIT
linux 下安装git服务器
第一步:安装git 依赖的库
#yum install curl-devel expat-devel gettext-devel openssl-devel zilb
zlib-devel perl-devel gcc gcc-cc++
第二步:安装git
下载git-1.8.2.2.tar.gz安装包到/usr/local/src/下
# tar -zvxf /usr/local/src/git-1.8.2.2.tar.gz
# cd /usr/local/src/git-1.8.2.2.tar
# ./configure --prefix=/usr/local/git/
# make && make install
安装完后
# /usr/local/git/bin/git --version
出现 git version 1.8.3 表示安装成功
# ln -s /usr/local/git/bin/* /usr/bin
在任何地方执行 git 命令都可以
第三步:安装git用户管理 gitosis
#yum install -y python python-setuptools
#cd /usr/local/src
#git clone git://github.com/res0nat0r/gitosis.git
#cd gitosis
#python setup.py install
显示 Finished processing dependencies for gitosis==0.2即表示成功
第四步:在Linux上添加 运行git服务的用户
# useradd -c 'git version manage' -m -d /home/git -s /bin/bash git
# passwd git //为git用户添加密码
# su git 切换到git用户下
走到这一步跳到 第五步操作 完成之后调回到下一步
# gitosis-init < /tmp/id_rsa.pub
显示以下信息即表示成功
Initialized empty Git repository in /home/git/repositories/gitosisadmin.
git/
Reinitialized existing Git repository in /home/git/repositories/
gitosis-admin.git/
到目前为止Linux git服务器安装成功
第五步:回到我们的电脑 生成git密钥用户名
#ssh-keygen -t rsa //执行此命令时一路回车 看到看面的信息
/*
Generating public/private rsa key pair.
Enter file in which to save the key (路径/.ssh/id_rsa):
2/8
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in 路径/.ssh/id_rsa.
Your public key has been saved in 路径/.ssh/id_rsa.pub.
The key fingerprint is:
71:5e:81:48:41:91:af:4c:74:bf:da:d8:9c:a6:d4:e9 root@wlkj-tianxinlinux-
server
*/
将生成的id_rsa.pub文件上传Linux git服务器的 /tmp/ 下 就是 第四步中的
gitosis-init < /tmp/id_rsa.pub 的文件
第五步完成
主机上建立一个 git 账户,让每个需要写权限的人发送一个 SSH 公钥,然后将其加入
git 账户的~/.ssh/_keys 文件。这样一来,所有人都将通过 git 账户访问主机。这丝
毫不会影响提交的数据 — 访问主机用的身份不会影响提交对象的提交者信息
$ssh-keygen
然后将生成的公钥id_rsa.pub发生给GIT管理员,只需将公钥复制到keys文件就行。
$cat/root/git/id_rsa.pub >> ~/.ssh/_keys
1.建立一个空白仓库(master)
[git@git ~]$git config --global user.name "fanwenpeng"
[git@git ~]$git config --global user.email "fanwenpeng@163.com"
[git@git ~]$ mkdir project.git
[git@git ~]$ cd project.git/
[git@git project.git]$ git init
[git@git project.git]$git add .
[git@git project.git]$git commit -m "初始化项目project"
$ git push origin master(添加远程仓库)
error: src refspec master does not match any.
error: failed to push some refs to 'root@192.168.100.129:/home/git/
git.git'
本地仓库缺少文件,添加文件即可
之后在PUSH过程中又出现了下面的错误。
提示使用 git pull 之后在 push
$ git push -u origin master
Warning: Permanently added the RSA host key for IP address
'xx.xx.xxx.xxx' to the list of known hosts.
To git@github.com:hahaha/ftpmanage.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:hahahah/ftpmanage.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository
pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for
details.
使用如下命令来解决
3/8
$ git pull --rebase origin master
root@192.168.100.129's password:
warning: no common commits
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 10 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (10/10), done.
From 192.168.100.129:/home/git/git
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
First, rewinding head to replay your work on top of it...
Applying: init commit
然后在PUSH
$ git push origin master
root@192.168.100.129's password:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 289 bytes | 289.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 192.168.100.129:/home/git/git.git
7058a1c..0c874bd master -> master
我们也可以从一个现有的仓库导出,生成一个裸仓库-即一个不包含任何目录的仓库
gir clone --bare 旧仓库 新仓库
clone的操作相当于init和git fetch
我们可以拔裸仓库放到服务器上。直接SCP到指定的文件夹就行
我们只要对服务和和这个目录有相应的权限即可克隆该项目,写权限相当于可以推送数据,如果在该目录运行了init并加上-
shared选项后,GIT自动会添加写权限(-shared也可以指定其他的行为,默认为项目添加写权限)
$git clone root@192.168.100.129:/home/git/git.git
$(git clone http://gitbot2@pha.huatongsilver-inc.com/source/htwhr.git99i)
$git clone init -bare -shared
2.建立一个分支
当可以看到“# On branch master”这么一行,这表示我们现在正在主分支(master)上工
作。当我们新建了一个本地仓库,一般就是默认处在主分支(master)上。下面我们一起看
一下Git是如何存储一个分支的:
[root@git git.git]#/$cd .git
[root@git .git]#$cat HEAD
ref: refs/heads/master
[root@git .git]# ls refs/heads/
“.git/HEAD”这个文件里保存的是我们当前在哪个分支上工作的信息。
在Git中,分支的命名信息保存在“.git/refs/heads”目录下:
[root@git .git]# ls refs/heads/
master
当我们需要调试某个Bug或者尝试添加或修改程序中的某个模块,而又不能影响主分支的开
发时。就可以通过创建分支来满足需求。创建分支相当于是创建一个新的分支指针指向当
前所在的提交
4/8
git checkout命令加上-b参数表示创建并切换分支上。
我们可以用git checkout dev切换分支。切换完成后修改文件内容在切换回master查看修改的是否存在
3.合并分支(快速合并)
现在,我们把Dev分支的工作合并到master上,用git merge命令来合并指定的分支到当前分
支
查看分支 git branch -a
创建分支 git branch name
切换分支 git checkout name
创建并切换 git checkout -b name
合并某分支到当前分支 git merge name
删除分支 git branch -d name
分支合并冲突
4.分支推送
查看远程仓库分支
git remote -v
当在PUSH时遇到这样的错误
5/8
这是因为远程仓库正处在master分支上,我们可以切换分支。也可以在.git/config里面添加如下配置项即可:
当遇到这样的错误时
这说明我们需要先PULL下远程仓库,然后在PUSH
$ git push origin master
6/8
远程仓库查看用git reset --hard(强制复原)才能看到PUSH之后的内容
5.版本回退
查看历史修改记录
git diff
1.本地分支回退
如果在本地做了错误的提交,那么我们可以找到commit id
git reflog
3015e89 HEAD@{1}: commit: rr
0af5969 HEAD@{2}: commit: aaa
d9eec8e HEAD@{3}: commit: qq
dbd67cc HEAD@{4}: commit: new
接着回退版本
git reset --hard ***(需要回退的commit id的前几位号)
2.自己的远程分支回退的方法
如果你的错误已经提交自己的远程分支,那就需要回退远程分支了
首先,需要先回滚本地分支
git reflog
git reset --hard ***
接着强制推送的远程分支
git push -f
注意:本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无
法推送到远程分支
3.公共远程分支版本回退
公共分支版本回退最大的问题是会覆盖其他人提交的代码,比如现在master的情况是A1-A2-
B1,AB为两个人,现在要A2有问题需要回退,那么reset回退远程分支后master到A1,那么当
B去master看时是这样的,
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish
your local commits) nothing to commit, working directory clean
也就是说,队友的分支并没有回退,而是比远程分支超前了两次提交,因为远程分支回退
了。当看到这样的提示我们习惯性的git push一下,那么之前回退的版本就又复原了,这就
是分布式,每个人都有副本。
使用git reset回退公共远程分支需要每个人都手动远程master分支覆盖本地Master分支,显
然这是不方便的,我们可以用另一个命令来回退版本
git revert HEAD //撤销最近一次提交
git revert HEAD~1 //撤销上上次的提交,注意数字是从0开始的
git revert *** //撤销***这次提交
git revert 命令的意思是撤销某次的提交,他会产生一个新的提交,虽然代码回退了,但
版本依然是向前的,所以,当你用revert回退后,所以人pull之后,他们的代码也就自动回
退了。
但是需要注意一下几点
1. revert 是撤销一次提交,所以后面的commit id是你需要回滚到的版本的前一次提交
2. 使用revert HEAD是撤销最近的一次提交,如果你最近一次提交是用revert命令产生的,
那么你再执行一次,就相当于撤销了上次的撤销操作,换句话说,你连续执行两次revert
HEAD命令,就跟没执行是一样的
7/8
3. 使用revert HEAD~1 表示撤销最近2次提交,这个数字是从0开始的,如果你之前撤销过产
生了commi id,那么也会计算在内的。
4. 如果使用 revert 撤销的不是最近一次提交,那么一定会有代码冲突,需要你合并代
码,合并代码只需要把当前的代码全部去掉,保留之前版本的代码就可以了.
6.revert合并代码,解决冲突
使用revert。如果部署撤销最近一次的提交,那么一定会有冲突,
<<<<<<< HEAD
全部清空
第一次提交
=======
全部清空
>>>>>>> parent of c24cde7... 全部清空
解决冲突我们只需要删除不需要的代码就好,也就是保留HEAD的代码
<<<<<< HEAD 全部清空
第一次提交
=======
然后在提交一次就好了。
远程分支回滚总结
1. 自己的分支回滚直接用reset
2. 公共分支回滚用revert
3. 错的太远了直接将代码全部删掉,用正确代码替代
作为一个额外的防范措施,你可以用 Git 自带的 git-shell 工具限制 git 用户的活动范
围。只要把它设为git 用户登入的 shell,那么该用户就无法使用普通的 bash 或者 csh 什
么的 shell 程序。编辑 /etc/passwd 文件:
vim /etc/passwd
在文件结尾找到
git:x:500:500:root:/home/git:/bin/bash
把 bin/sh 改为 /usr/bin/git-shell (或者用 which git-shell 查看它的实际安装路径)。
该行修改后的样子如下:
git:x:500:500:root:/home/git:/usr/bin/git-shell
现在 git 用户只能用 SSH 连接来推送和获取 Git 仓库,而不能直接使用主机 shell。尝试
普通 SSH 登录的话,会看到下面这样的拒绝信息:
$ssh git@gitserver
fatal: What doyou think I am?
A shell? Connection to gitserver closed.
8/8
GIT
linux 下安装git服务器
第一步:安装git 依赖的库
#yum install curl-devel expat-devel gettext-devel openssl-devel zilb
zlib-devel perl-devel gcc gcc-cc++
第二步:安装git
下载git-1.8.2.2.tar.gz安装包到/usr/local/src/下
# tar -zvxf /usr/local/src/git-1.8.2.2.tar.gz
# cd /usr/local/src/git-1.8.2.2.tar
# ./configure --prefix=/usr/local/git/
# make && make install
安装完后
# /usr/local/git/bin/git --version
出现 git version 1.8.3 表示安装成功
# ln -s /usr/local/git/bin/* /usr/bin
在任何地方执行 git 命令都可以
第三步:安装git用户管理 gitosis
#yum install -y python python-setuptools
#cd /usr/local/src
#git clone git://github.com/res0nat0r/gitosis.git
#cd gitosis
#python setup.py install
显示 Finished processing dependencies for gitosis==0.2即表示成功
第四步:在Linux上添加 运行git服务的用户
# useradd -c 'git version manage' -m -d /home/git -s /bin/bash git
# passwd git //为git用户添加密码
# su git 切换到git用户下
走到这一步跳到 第五步操作 完成之后调回到下一步
# gitosis-init < /tmp/id_rsa.pub
显示以下信息即表示成功
Initialized empty Git repository in /home/git/repositories/gitosisadmin.
git/
Reinitialized existing Git repository in /home/git/repositories/
gitosis-admin.git/
到目前为止Linux git服务器安装成功
第五步:回到我们的电脑 生成git密钥用户名
#ssh-keygen -t rsa //执行此命令时一路回车 看到看面的信息
/*
Generating public/private rsa key pair.
Enter file in which to save the key (路径/.ssh/id_rsa):
2/8
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in 路径/.ssh/id_rsa.
Your public key has been saved in 路径/.ssh/id_rsa.pub.
The key fingerprint is:
71:5e:81:48:41:91:af:4c:74:bf:da:d8:9c:a6:d4:e9 root@wlkj-tianxinlinux-
server
*/
将生成的id_rsa.pub文件上传Linux git服务器的 /tmp/ 下 就是 第四步中的
gitosis-init < /tmp/id_rsa.pub 的文件
第五步完成
主机上建立一个 git 账户,让每个需要写权限的人发送一个 SSH 公钥,然后将其加入
git 账户的~/.ssh/_keys 文件。这样一来,所有人都将通过 git 账户访问主机。这丝
毫不会影响提交的数据 — 访问主机用的身份不会影响提交对象的提交者信息
$ssh-keygen
然后将生成的公钥id_rsa.pub发生给GIT管理员,只需将公钥复制到keys文件就行。
$cat/root/git/id_rsa.pub >> ~/.ssh/_keys
1.建立一个空白仓库(master)
[git@git ~]$git config --global user.name "fanwenpeng"
[git@git ~]$git config --global user.email "fanwenpeng@163.com"
[git@git ~]$ mkdir project.git
[git@git ~]$ cd project.git/
[git@git project.git]$ git init
[git@git project.git]$git add .
[git@git project.git]$git commit -m "初始化项目project"
$ git push origin master(添加远程仓库)
error: src refspec master does not match any.
error: failed to push some refs to 'root@192.168.100.129:/home/git/
git.git'
本地仓库缺少文件,添加文件即可
之后在PUSH过程中又出现了下面的错误。
提示使用 git pull 之后在 push
$ git push -u origin master
Warning: Permanently added the RSA host key for IP address
'xx.xx.xxx.xxx' to the list of known hosts.
To git@github.com:hahaha/ftpmanage.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:hahahah/ftpmanage.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository
pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for
details.
使用如下命令来解决
3/8
$ git pull --rebase origin master
root@192.168.100.129's password:
warning: no common commits
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 10 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (10/10), done.
From 192.168.100.129:/home/git/git
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
First, rewinding head to replay your work on top of it...
Applying: init commit
然后在PUSH
$ git push origin master
root@192.168.100.129's password:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 289 bytes | 289.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 192.168.100.129:/home/git/git.git
7058a1c..0c874bd master -> master
我们也可以从一个现有的仓库导出,生成一个裸仓库-即一个不包含任何目录的仓库
gir clone --bare 旧仓库 新仓库
clone的操作相当于init和git fetch
我们可以拔裸仓库放到服务器上。直接SCP到指定的文件夹就行
我们只要对服务和和这个目录有相应的权限即可克隆该项目,写权限相当于可以推送数据,如果在该目录运行了init并加上-
shared选项后,GIT自动会添加写权限(-shared也可以指定其他的行为,默认为项目添加写权限)
$git clone root@192.168.100.129:/home/git/git.git
$(git clone http://gitbot2@pha.huatongsilver-inc.com/source/htwhr.git99i)
$git clone init -bare -shared
2.建立一个分支
当可以看到“# On branch master”这么一行,这表示我们现在正在主分支(master)上工
作。当我们新建了一个本地仓库,一般就是默认处在主分支(master)上。下面我们一起看
一下Git是如何存储一个分支的:
[root@git git.git]#/$cd .git
[root@git .git]#$cat HEAD
ref: refs/heads/master
[root@git .git]# ls refs/heads/
“.git/HEAD”这个文件里保存的是我们当前在哪个分支上工作的信息。
在Git中,分支的命名信息保存在“.git/refs/heads”目录下:
[root@git .git]# ls refs/heads/
master
当我们需要调试某个Bug或者尝试添加或修改程序中的某个模块,而又不能影响主分支的开
发时。就可以通过创建分支来满足需求。创建分支相当于是创建一个新的分支指针指向当
前所在的提交
4/8
git checkout命令加上-b参数表示创建并切换分支上。
我们可以用git checkout dev切换分支。切换完成后修改文件内容在切换回master查看修改的是否存在
3.合并分支(快速合并)
现在,我们把Dev分支的工作合并到master上,用git merge命令来合并指定的分支到当前分
支
查看分支 git branch -a
创建分支 git branch name
切换分支 git checkout name
创建并切换 git checkout -b name
合并某分支到当前分支 git merge name
删除分支 git branch -d name
分支合并冲突
4.分支推送
查看远程仓库分支
git remote -v
当在PUSH时遇到这样的错误
5/8
这是因为远程仓库正处在master分支上,我们可以切换分支。也可以在.git/config里面添加如下配置项即可:
当遇到这样的错误时
这说明我们需要先PULL下远程仓库,然后在PUSH
$ git push origin master
6/8
远程仓库查看用git reset --hard(强制复原)才能看到PUSH之后的内容
5.版本回退
查看历史修改记录
git diff
1.本地分支回退
如果在本地做了错误的提交,那么我们可以找到commit id
git reflog
3015e89 HEAD@{1}: commit: rr
0af5969 HEAD@{2}: commit: aaa
d9eec8e HEAD@{3}: commit: qq
dbd67cc HEAD@{4}: commit: new
接着回退版本
git reset --hard ***(需要回退的commit id的前几位号)
2.自己的远程分支回退的方法
如果你的错误已经提交自己的远程分支,那就需要回退远程分支了
首先,需要先回滚本地分支
git reflog
git reset --hard ***
接着强制推送的远程分支
git push -f
注意:本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无
法推送到远程分支
3.公共远程分支版本回退
公共分支版本回退最大的问题是会覆盖其他人提交的代码,比如现在master的情况是A1-A2-
B1,AB为两个人,现在要A2有问题需要回退,那么reset回退远程分支后master到A1,那么当
B去master看时是这样的,
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish
your local commits) nothing to commit, working directory clean
也就是说,队友的分支并没有回退,而是比远程分支超前了两次提交,因为远程分支回退
了。当看到这样的提示我们习惯性的git push一下,那么之前回退的版本就又复原了,这就
是分布式,每个人都有副本。
使用git reset回退公共远程分支需要每个人都手动远程master分支覆盖本地Master分支,显
然这是不方便的,我们可以用另一个命令来回退版本
git revert HEAD //撤销最近一次提交
git revert HEAD~1 //撤销上上次的提交,注意数字是从0开始的
git revert *** //撤销***这次提交
git revert 命令的意思是撤销某次的提交,他会产生一个新的提交,虽然代码回退了,但
版本依然是向前的,所以,当你用revert回退后,所以人pull之后,他们的代码也就自动回
退了。
但是需要注意一下几点
1. revert 是撤销一次提交,所以后面的commit id是你需要回滚到的版本的前一次提交
2. 使用revert HEAD是撤销最近的一次提交,如果你最近一次提交是用revert命令产生的,
那么你再执行一次,就相当于撤销了上次的撤销操作,换句话说,你连续执行两次revert
HEAD命令,就跟没执行是一样的
7/8
3. 使用revert HEAD~1 表示撤销最近2次提交,这个数字是从0开始的,如果你之前撤销过产
生了commi id,那么也会计算在内的。
4. 如果使用 revert 撤销的不是最近一次提交,那么一定会有代码冲突,需要你合并代
码,合并代码只需要把当前的代码全部去掉,保留之前版本的代码就可以了.
6.revert合并代码,解决冲突
使用revert。如果部署撤销最近一次的提交,那么一定会有冲突,
<<<<<<< HEAD
全部清空
第一次提交
=======
全部清空
>>>>>>> parent of c24cde7... 全部清空
解决冲突我们只需要删除不需要的代码就好,也就是保留HEAD的代码
<<<<<< HEAD 全部清空
第一次提交
=======
然后在提交一次就好了。
远程分支回滚总结
1. 自己的分支回滚直接用reset
2. 公共分支回滚用revert
3. 错的太远了直接将代码全部删掉,用正确代码替代
作为一个额外的防范措施,你可以用 Git 自带的 git-shell 工具限制 git 用户的活动范
围。只要把它设为git 用户登入的 shell,那么该用户就无法使用普通的 bash 或者 csh 什
么的 shell 程序。编辑 /etc/passwd 文件:
vim /etc/passwd
在文件结尾找到
git:x:500:500:root:/home/git:/bin/bash
把 bin/sh 改为 /usr/bin/git-shell (或者用 which git-shell 查看它的实际安装路径)。
该行修改后的样子如下:
git:x:500:500:root:/home/git:/usr/bin/git-shell
现在 git 用户只能用 SSH 连接来推送和获取 Git 仓库,而不能直接使用主机 shell。尝试
普通 SSH 登录的话,会看到下面这样的拒绝信息:
$ssh git@gitserver
fatal: What doyou think I am?
A shell? Connection to gitserver closed.
8/8