搭建Git服务器及本机克隆提交
前文
Git是什么?
Git是目前世界上最先进的分布式版本控制系统。
SVN与Git的最主要的区别?
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
在linux上搭建git服务器
linux系统环境:
1、安装Git
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
$ yum install git
接下来我们 创建一个git用户组和用户,用来运行git服务:
$ groupadd git
$ useradd git -g git
2、创建证书登录
收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里(.ssh/authorized_keys系统默认隐藏不显示),一行一个。如果没有该文件创建它:
$ cd /home/git/
$ mkdir .ssh
$ chmod 755 .ssh
$ touch .ssh/authorized_keys
$ chmod 644 .ssh/authorized_keys
之后的步骤请结合 步骤5放置客户端公钥
3、初始化Git仓库
3.1、首先我们选定一个目录作为Git仓库,假定是在根目录下的/repository/gitTest.git,在根目录下/输入命令:
$ mkdir repository
$ chown git:git repository/
$ cd repository
$ git init --bare gitTest.git
Initialized empty Git repository in /repository/gitTest.git/
*注:如果初始化远程仓库的话,要使用这个命令:git init --bare gitTest.git
这样初始化的仓库并没有.git目录,只有.git目录下的文件。
不使用--bare选项时,就会生成.git目录以及其下的版本历史记录文件,这些版本历史记录文件就存放在.git目录下;而使用--bare选项时,不再生成.git目录,而是只生成.git目录下面的版本历史记录文件,这些版本历史记录文件也不再存放在.git目录下面,而是直接存放在版本库的根目录下面
用"git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作。但别的用户在将更新push上来的时候容易出现冲突。
解决办法就是使用”git init --bare”方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(”This operation must be run in a work tree”),这个就是最好把远端仓库初始化成bare仓库的原因。
说白了,就是会创建一个裸仓库,裸仓库没有工作区,服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾
3.2、 然后,把仓库所属用户改为git:
$ chown -R git:git gitTest.git
5、放置客户端公钥
通过步骤2,我们已经在服务点创建了证书登录的目录,如果客户端要访问服务端,需要提供公钥到证书登录的目录中,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,以下为客户端操作
打开客户端(“假设window系统”,前提是客户端也安装了git服务,鼠标右击选择“git bash”)随机目录下的git bash,输入ssh-keygen -t rsa -C “邮箱”,生成ssh私钥和公钥
此时 C:\Users\用户名.ssh 下会多出两个文件 id_rsa 和 id_rsa.pub
id_rsa 是私钥
id_rsa.pub 是公钥
然后把id_rsa.pub文件放置在服务器/home/git/.ssh/authorized_keys文件中,由于.ssh/authorized_keys系统默认不显示,请使用“mv”命令移动文件
6、在客户端clone远程仓库
将服务器上的/opt/repository/gittest.git库克隆到本地 git clone [URL]git是用户名@服务器地址:仓库路径
git clone 用户名@服务器IP:目标仓库
7、客户端提交到远程仓库
本地仓库在Respository.git目录下,先进入gitTest目录中,commit提交到本地git,之后才提交到服务器远程库
$ cd gitTest
$ git add *
$ git commit -m '20190708_1156_git_testing'
$ git push -u origin master
*注远程库的名字就是origin,这是Git默认的叫法,也可以改成别的。
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,git push origin master就行
要查看远程库的信息 使用 git remote
它会列出你指定的每一个远程服务器的简写。 如果你已经克隆了自己的仓库,那么至少应该能看到 origin - 这是 Git 给你克隆的仓库服务器的默认名字
要查看远程库的详细信息 使用 git remote –v
会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL,如果你的远程仓库不止一个,该命令会将它们全部列出
8、tortoiseGit的安装使用
使用Git命令有时候确实不怎么方便,特别是每次都要输入密码,如果配置SSH的方式,又实在是很麻烦,
tortoiseGit就是一个客户端图形界面。
安装
下载安装包,选择版本,地址:https://download.tortoisegit.org/tgit/
进入具体版本页面后,根据Windows操作系统版本选择相应的程序安装包和中文语言包.
https://download.tortoisegit.org/tgit/2.5.0.0/ 这是2.5.0.0版本的,直接安装即可
设置
在桌面右键选择tortoiseGit,选择设置,设置用户名和邮箱,跟在git bash是一样的,此时设置的是全局的
进到本地仓库目录中可以针对项目设置局部配置
克隆仓库
ssh key的步骤前面已经说完了,然后就可以克隆仓库进行使用了
选择你想要克隆仓库的文件夹,右键选择Git克隆,等同于 git clone [url]
URL是你要克隆的服务器版本库路径,目录是你要克隆到你本地的路径
填写服务器的url,确定,在克隆过程中会要求输入git用户的密码,然后在本地生成了仓库gittest,在gittest下面有.git目录,就是本地的版本库目录了,如果上一步选择了克隆成纯版本库,就不会有.git目录了,在本地一般不这样做
增加文件到暂存区
编辑一个文件保存,在空白处右键选择TortoiseGit,选择添加,加到暂存区,也就是git add,也可以在下一步里面直接提交
本地提交文件
右键选择Git提交,填写日志信息,不然不能提交然后点提交,这一步是将文件提交到你本地的仓库,git中不能提交一个空文件夹,里面一定要有文件才行
第一行默认提交到master分支,也可以选择新建分支,提交到新分支上
没有添加的文件也可以直接提交到版本库,也可以选择不提交未添加的文件
推送到远程仓库
将文件推送到远程仓库,右键选择tortoiseGit,选择推送,将文件推送到服务器仓库上
可以选择推送哪个分支上的信息,也可以选择推送到哪个远程分支上
目标:选择推送到哪个远程端上,选择管理,可以增加新的远程端,也可以直接写别的URL
确定推送
在服务器仓库下执行git log可以看到你推送的文件,因为服务器上是裸仓库,所以没有工作目录,看不到推送的文件
拉取文件和获取文件
拉取和获取的区别
拉取:git pull 在将远程仓库最新版本拉到本地的同时,将其合并到本地的当前 HEAD 中。
一般选择非fast forward,会多生成一个commit 记录,并强制保留分支的开发记录,不会丢失分支信息,这对于以后代码进行分析特别有用。
获取:git fetch 将远程仓库最新版本拉到本地,不会自动合并 ,绝不会更改任何本地分支
实际使用中 使用git fetch 更安全 在merge之前可以看清楚 更新情况 再决定是否合并
创建分支,切换分支
右键TortoiseGit,选择创建分支,填入分支名称,选择在哪个分支上新建分支,如果勾选切换新分支,分支创建后就直接在新分支上工作了,否则在TortoiseGit中选择切换分支
在分支上修改后提交到分支
合并
切换回master分支,TortoiseGit选择合并,选择非快进式合并,合并后master分支上有了其他分支上提交的信息
解决冲突
当主干与分支修改了同一个文件,合并时会产生冲突
打开文件与在命令行中一样,用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
右键TortoiseGit中选择解决冲突
双击该文件进行修改,左边窗口是分支上的内容,右边窗口是master上的内容,你要在下面的窗口上解决冲突,修改正确的文件内容,然后保存,然后将解决后的文件进行提交
显示日志
红色代表当前分支,绿色代表本地分支,浅×××代表远端分支,×××代表标签
可以看到各版本提交的信息,及分支合并的信息,还有文件的操作状态
颜色可以在设置中更改
可以在每一条信息上右键选择与上一版本比较差异
以上就是TortoiseGit的基本操作了
下面是一些命令行操作
svn迁移到git服务器
根据需要,后期将会将svn上的数据迁移到git上
将svn库克隆到本地
使用TortoiseGit克隆svn库
URL是svn的地址,是你要克隆的文件夹
因为我的svn库不是标准的trunk、branch、tags结构,所以下面的不勾选,如果是标准的svn结构,请勾选
克隆需要一段时间,根据svn库的大小而定
在git服务器上创建新的裸仓库
使用git init --bare svnrepo.git命令
将本地仓库推送到git服务器
先建立远端仓库,在本地仓库内右键选择TortoiseGit,设置,然后选择远端,在右侧URL中填写git服务器仓库地址,就是刚刚在git服务器上新建的裸仓库,origin是默认的远端名字,然后点击确定
远端建立好后,就可以将本地克隆到的仓库推送到服务器上了
在本地仓库做一些修改,记住要先在本地进行提交,然后再推送到服务器上
TortoiseGit—>推送 就可以了,由于服务器上是裸仓库,所以没有工作区,看不到文件,git log一下就可以看到你刚才修改文件的提交记录了
基础命令
我是在linux上操作的,算是本地仓库吧,不涉及远程库;在linux上操作与在windows上相同
把文件添加到版本库中
编辑一个readme.txt文件,将文件加入版本库中[root@localhost repository]# git add readme.txt #将工作区中的文件添加到暂存区了
将文件提交到版本库
[root@localhost repository]# git commit -m “提交readme”
-m 是提交信息,便于查看提交了什么东西,这一步是将暂存区中的文件提交到仓库了
查看是否还有文件未提交
- [root@localhost repository]# git status
- #On branch master
- nothing to commit (working directory clean)
这样说明没有任何文件未提交,工作区是干净的
修改readme文件后保存,不进行任何操作,再查看状态
- [root@localhost repository]# git status
- #On branch master
- #Changed but not updated:
- #(use "git add <file>..." to update what will be committed)
- # (use "git checkout -- <file>..." to discard changes in working directory)
- #
- # modified: readme.txt
- #
- no changes added to commit (use "git add" and/or "git commit -a")
上面的命令告诉我们 readme.txt文件已被修改,但是并没有提交
查看readme.txt文件修改了什么内容
- [root@localhost repository]# git diff
- diff --git a/readme.txt b/readme.txt
- index 92e045e..d94ee74 100644
- --- a/readme.txt
- +++ b/readme.txt
- @@ -5,4 +5,3 @@
- 666666
- 777777
- 999999
- -000
可以看到,少了一行000
知道了对readme.txt文件做了什么修改后,我们可以放心的提交到仓库了,提交修改和提交文件是一样的2步(第一步是git add 第二步是:git commit)。
- [root@localhost repository]# git add readme.txt
- [root@localhost repository]# git commit -m "readme删除000"
查看历史记录
- [root@localhost repository]# git log
- commit ffc46d25feacd0ae1926ace37efecd116402503e #版本号
- Author: bai <xxx@qq.com>
- Date: Tue Jan 9 16:49:18 2018 +0800
- readme删除000 #最近一次提交内容,也就是commit -m 写的内容
- commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f
- Author: bai <xxx@qq.com>
- Date: Mon Jan 8 11:26:26 2018 +0800
- readme增加222222
- commit 876477f1b209ba61de4248ff26c2c1a098520295
- Author: bai <xxx@qq.com>
- Date: Mon Jan 8 11:20:45 2018 +0800
- 提交readme.txt
如果嫌上面显示的信息太多的话,我们可以使用命令 git log –pretty=oneline
- [root@localhost repository]# git log --pretty=oneline
- ffc46d25feacd0ae1926ace37efecd116402503e readme删除000
- 1fac1a93037444bfbd59e51b57c511aaa0a9578f readme增加222222
- 876477f1b209ba61de4248ff26c2c1a098520295 提交readme.txt
版本回退
[root@localhost repository]# git reset --hard HEAD^ #回退到上一版本
- [root@localhost repository]# git log
- commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f
- Author: bai <xxx@qq.com>
- Date: Mon Jan 8 11:26:26 2018 +0800
- readme增加222222
- commit 876477f1b209ba61de4248ff26c2c1a098520295
- Author: bai <xxx@qq.com>
- Date: Mon Jan 8 11:20:45 2018 +0800
- 提交readme.txt
可以看到删除000的操作没有了
如果想要回退到上上个版本就把HEAD^ 改成 HEAD^^,以此类推
如果想回到100个版本之前的话,就git reset --hard HEAD~100
回退到指定版本
[root@localhost repository]# git reset HEAD 版本号
获得版本号
- [root@localhost repository]# git reflog
- 19ecf86 HEAD@{0}: HEAD^: updating HEAD
- ffc46d2 HEAD@{1}: commit: readme删除000
ffc46d2就是版本号
撤销修改
1.如果已经提交了的话,就直接回退到上一版本
2.如果没有添加到暂存区的话,使用git checkout -- 文件名 撤销工作区的所有修改[root@localhost repository]# git checkout -- readme.txt
3.如果已经添加到暂存区的话,想丢弃修改[root@localhost repository]# git reset HEAD readme.txt
然后再重复第二步
删除文件
- [root@localhost repository]# git rm readme.txt
- [root@localhost repository]# git commit -m “删除readme”
创建分支
- [root@localhost repository]# git checkout –b fenzhi
- 这个命令相当于两条命令
- git branch fenzhi 创建分支
- git checkout fenzhi 切换到该分支
我们在分支上修改了文件内容提交后,在主分支上是看不到刚才修改的内容的
查看当前分支
- [root@localhost repository]# git branch
- * fenzhi
- master
带星号的则代表当前在该分支上
合并分支
- [root@localhost repository]# git checkout master #在master分支上进行合并
- [root@localhost repository]# git merge --no-ff fenzhi
在分支上修改内容后,与主分支合并,合并后就统一了文件内容
删除分支
[root@localhost repository]# git branch -d fenzhi
解决冲突
当你在主分支上和其他分支上修改了同一个文件并且都提交了,当在主分支上合并的时候就会产生冲突
查看文件内容是这样的
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<< HEAD是指主分支修改的内容,>>>>fenzhi 是指fenzhi上修改的内容
我们可以手动修改文件,解决冲突,然后在提交到版本库
用git log查看分支历史
git log --graph --pretty=oneline --abbrev-commit
隐藏工作区
在开发中,会经常碰到bug问题,那么有了bug就需要修复,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉。比如我在开发中接到一个404 bug时候,我们可以创建一个404分支来修复它,但是,当前的dev分支上的工作还没有提交。
工作进行到一半时候,我们还无法提交,比如我这个分支bug要2天完成,但是404 bug需要5个小时内完成。怎么办呢?还好,Git还提供了一个stash功能,可以把当前工作现场 ”隐藏起来”,等以后恢复现场后继续工作。
在你需要隐藏的dev分支下执行git stash,这时候虽然dev分支上的内容还没有提交,但是git status看一下工作区是干净的,也就是dev的工作现场被隐藏了
现在创建404分支来修复bug了。首先我们要确定在哪个分支上修复bug,比如我现在是在主分支master上来修复的,现在我要在master分支上创建一个临时分支修复完成后,切换到master分支上,并完成合并,最后删除404分支。
然后我们回到dev分支上干活,工作区是干净的,那么我们工作现场去哪里呢?我们可以使用命令 git stash list来查看下
工作区是干净的,那么我们工作现场去哪里呢?我们可以使用命令 git stash list来查看下。Git把stash内容存在某个地方了,但是需要恢复一下,可以使用如下2个方法:
git stash apply恢复,恢复后,stash内容并不删除,你需要使用命令git stash drop来删除。
另一种方式是使用git stash pop,恢复的同时把stash内容也删除了。
总结
1、如果在服务器搭建Git远程库
2、本地如果访问和提交文件到Git远程库
3、TortoiseGit使用于操作
本文借鉴于:https://blog.csdn.net/u010597189/article/details/81284642,在此感谢原作者的分享
搭建Git服务器及本机克隆提交的更多相关文章
- 轻松搭建Git服务器(Ubuntu)
搭建Git服务器 在远程仓库节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改. GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业 ...
- Windows/Linux 环境搭建Git服务器 + vs2012集成git
1. 下载.安装Git 我的系统是Windows 7,需要安装Git for Windows. 下载地址: http://code.google.com/p/msysgit/downloads/lis ...
- Git学习笔记(10)——搭建Git服务器
本文主要记录了Git服务器的搭建,以及一些其他的配置,和最后的小总结. Git远程仓库服务器 其实远程仓库和本地仓库没啥不同,远程仓库只是每天24小时开机为大家服务,所以叫做服务器.我们完全可以把自己 ...
- centos 搭建git服务器
centos 6搭建git服务器 安装 rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm yum ins ...
- 如何在服务器上搭建git服务器
参考文章: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770 ...
- CentOS 6.4 搭建git 服务器
CentOS 6.4 搭建git 服务器 (2013-11-22 19:04:09)转载▼ 标签: it 分类: Linux 此文件是依据markdown所编写,更好效果参见本人github的文档ht ...
- 在CentOS搭建Git服务器 转
在CentOS搭建Git服务器 来自 :http://www.jianshu.com/p/69ea5ded3ede 前言 我们可以GitHub发布一些开源代码的公共仓库,但对于私密仓库就需要收费了.公 ...
- 搭建git服务器及利用git hook自动布署代码
注意:服务器:Ubuntu Server 14.04,我的项目比较小,所有操作都使用root,建议最好新建一个用户(需要有管理员权限,否则在后面使用hooks自动部署代码时会出现各种权限问题,很蛋疼的 ...
- 自定义Git之搭建Git服务器
在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改. GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想 ...
随机推荐
- 一篇文章让你彻底明白__getattr__、__getattribute__、__getitem__的用法与执行原理
__getattr__ 在Python中,当我们试图访问一个不存在的属性的时候,会报出一个AttributeError.但是如何才能避免这一点呢?于是__getattr__便闪亮登场了 当访问一个不存 ...
- 使用js打印时去除页眉页脚
写在前面 今天的开发遇到了使用window.print()功能进行当前页面打印的功能,因为页脚左边部分显示了url,这是不能存在的,已解决,写在这里. 正文 很多网上的方法都是不能用的,最后我找到一个 ...
- B+(B)树和B-树
转载自 http://www.cnblogs.com/nullzx/ 1.B树 定义:B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点 ...
- sql 脚本过大
先把sql脚本文件中的创建部分 剪切 出来执行,创建一个数据库 然后执行cmd命令 sqlcmd -S CAOHONGWEI -U sa -P p@ss!123 -d ...
- python zip用法
import requests url = "https://magi.com/search" querystring = {"q":"堕却乡&quo ...
- P2634 树上路径长度为3的倍数的点对数 点分治
在计算答案的时候维护一个数组num num[i]为当前所有点距离根距离%3的数量 则当前块的答案为num[0]*num[0]+2*num[1]*num[2] #include<bits/stdc ...
- python+request+HTMLTestRunner+unittest接口自动化测试框架
转自https://my.oschina.net/u/3041656/blog/820023 正在调研使用python进行自动化测试,在网上发现一篇比较好的博文,作者使用的是python3,但目前自己 ...
- 用memcache来同步session
用memcache来同步session是还是不错的,当然也可以通过redis来保存session,可以php开启并将Session存储到Redis缓存,下面是设置利用memcache在web集群中同步 ...
- Python3之threading模块
import threading # Tips:一个ThreadLocal变量虽然是全局变量, # 但每个线程都只能读写自己线程的独立副本,互不干扰. # ThreadLocal解决了参数在一个线程中 ...
- vue基本知识点概括
目录 Vue 渐进式 JavaScript 框架 一.走进Vue 1.what -- 什么是Vue 2.why -- 为什么要学习Vue 3.special -- 特点 4.how -- 如何使用Vu ...