初学Git及简单搭建git服务器和客户端

初学Git及简单搭建git服务器和客户端

2018年07月30日 14:34:33 冰魄寒枪 阅读数 7251html

原创linux

初学Git及简单搭建git服务器和客户端

xinsir9991人评论5814人阅读2018-01-12 17:38:29git

初识Git

Git是什么?

  Git是目前世界上最早进的分布式版本控制系统。github

SVN与Git的最主要的区别?

  SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是本身的电脑,因此首先要从中央服务器哪里获得最新的版本,而后干活,干完后,须要把本身作完的活推送到中央服务器。集中式版本控制系统是必须联网才能工做,若是在局域网还能够,带宽够大,速度够快,若是在互联网下,若是网速慢的话,就纳闷了。
  Git是分布式版本控制系统,那么它就没有中央服务器的,每一个人的电脑就是一个完整的版本库,这样,工做的时候就不须要联网了,由于版本都是在本身的电脑上。既然每一个人的电脑都有一个完整的版本库,那多我的如何协做呢?好比说本身在电脑上改了文件A,其余人也在电脑上改了文件A,这时,大家两之间只需把各自的修改推送给对方,就能够互相看到对方的修改了。shell

基本概念

 
  1. 工做区:就是你在电脑里能看到的目录。windows

  2. 暂存区:英文叫stage, 或index。通常存放在 ".git目录下" 下的index文件(.git/index)中,因此咱们把暂存区有时也叫做索引(index)。工做区的文件先被增长到这个区域里,再从这个区域提交到版本库。安全

  3. 版本库:工做区有一个隐藏目录.git,这个不是工做区,而是Git的版本库。bash

在linux上搭建git服务器

linux系统环境:

 
  1. [root@localhost ~]# cat /etc/issue服务器

  2. CentOS release 6.9 (Final)app

  3. Kernel \r on an \m

linux上做为个人git服务器

安装git

我这里使用的yum安装
[root@localhost ~]# yum install git
也可使用源码安装,须要安装不少依赖包

 
  1. yum install curl-devel expat-devel gettext-devel \

  2. openssl-devel zlib-devel

下载地址 https://github.com/git/git/releases

 
  1. $ tar -zxf git-2.0.0.tar.gz

  2. $ cd git-2.0.0

  3. $ make configure

  4. $ ./configure --prefix=/usr

  5. $ make all doc info

  6. $ sudo make install install-doc install-html install-info

获取git版本,安装成功

 
  1. [root@localhost ~]# git version #git版本

  2. git version 1.7.1

git安装好后,建立 git 用户,用来管理 Git 服务,并为 git 用户设置密码

 
  1. [root@localhost ~]# useradd git

  2. [root@localhost ~]# passwd git

禁止 git 用户 ssh 登陆服务器,修改/etc/passwd文件
git:x:500:500::/home/git:/usr/bin/git-shell

建立版本库

在Disk文件夹下新建了一个文件夹名为repository
[root@localhost Disk]# mkdir repository
将repository初始化为git仓库
[root@localhost repository]# git init
该命令将建立一个名为 .git 的子目录,是隐藏的,这个子目录含有你初始化的 Git 仓库中全部的必须文件,这些文件是 Git 仓库的骨干。

 
  1. [root@localhost repository]# ll -a

  2. drwxr-xr-x. 8 root root 4096 1月 8 17:35 .git

我从网上查到,若是初始化远程仓库的话,要使用这个命令:git init --bare repository.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结尾。
而后,把仓库所属用户改成git:
[root@localhost Disk]# chown -R git:git repository.git

在windows上安装git做为客户端

安装git

下载地址:http://gitforwindows.org/
直接安装便可,安装后在开始菜单里会有git bash、git GUI和git CMD
初学Git及简单搭建git服务器和客户端

设置用户名、邮箱

由于Git是分布式版本控制系统,因此须要填写用户名和邮箱做为一个标识。
每个 Git 的提交都会使用这些信息,而且它会写入到你的每一次提交中,不可更改。若是使用了 --global 选项,那么该命令只须要运行一次,由于以后不管你在该系统上作任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不一样的用户名称与邮件地址时,能够在那个项目目录下运行没有 --global 选项的命令来配置。
打开git bash
初学Git及简单搭建git服务器和客户端
若是想要检查你的配置,可使用 git config --list 命令来列出全部 Git 当时能找到的配置。

 
  1. [root@localhost ~]# git config --list

  2. user.name=xxx

  3. user.email=xxx@qq.com

  4. core.repositoryformatversion=0

  5. core.filemode=true

  6. core.bare=false

  7. core.logallrefupdates=true

  8. ......

将linux服务端和windows客户端关联起来

客户端生成ssh私钥和公钥

想要他们链接的话要建立证书登陆
收集全部须要登陆的用户的公钥,公钥位于id_rsa.pub文件中,把咱们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。 
打开windows的git bash,输入ssh-keygen -t rsa -C “邮箱”,生成ssh私钥和公钥
初学Git及简单搭建git服务器和客户端
此时 C:\Users\用户名.ssh 下会多出两个文件 id_rsa 和 id_rsa.pub
id_rsa 是私钥
id_rsa.pub 是公钥

服务器端 Git 打开 RSA 认证

进入 /etc/ssh 目录,编辑 sshd_config,打开如下三个配置的注释:

 
  1. RSAAuthentication yes

  2. PubkeyAuthentication yes

  3. AuthorizedKeysFile .ssh/authorized_keys

保存并重启 sshd 服务:
[root@localhost ssh]# /etc/rc.d/init.d/sshd restart

将客户端公钥加到服务器

由 AuthorizedKeysFile 得知公钥的存放路径是 .ssh/authorized_keys,其实是 $Home/.ssh/authorized_keys,因为管理 Git 服务的用户是 git,因此实际存放公钥的路径是 /home/git/.ssh/authorized_keys
在 /home/git/ 下建立目录 .ssh

 
  1. [root@localhost git]# pwd

  2. /home/git

  3. [root@localhost git]# mkdir .ssh

  4. [root@localhost git]# ls -a

  5. . .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla .ssh

而后把 .ssh 文件夹的 owner 修改成 git,为.ssh和authorized_keys修改权限

 
  1. [root@localhost git]# chown -R git:git .ssh

  2. [root@localhost git]# chmod 700 .ssh

  3. [root@localhost git]# touch .ssh/authorized_keys

  4. [root@localhost git]#chmod 600 .ssh/authorized_keys

将客户端公钥id_rsa.pub文件的内容写到服务器端 /home/git/.ssh/authorized_keys 文件里

在客户端clone远程仓库

将服务器上的/opt/repository/gittest.git库克隆到本地 git clone [URL]git是用户名@服务器地址:仓库路径
初学Git及简单搭建git服务器和客户端
能够看到本地上的服务器仓库了
初学Git及简单搭建git服务器和客户端

在客户端远程仓库并提交代码

你已经在本地建立了一个Git仓库后,又想在服务器建立一个Git仓库,而且让这两个仓库进行远程同步
先在linux本地init一个仓库,在里面随意编辑一个文件,在本地提交,而后链接远程仓库,将文件push到服务器上,因为远程仓库是没有工做目录的,因此看不到你提交的文件,可是在服务器上git log一下,能够看到你提交的历史记录
初学Git及简单搭建git服务器和客户端
远程库的名字就是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,若是你的远程仓库不止一个,该命令会将它们所有列出

tortoiseGit的安装使用

安装

下载安装包,选择版本,地址:https://download.tortoisegit.org/tgit/
进入具体版本页面后,根据Windows操做系统版本选择相应的程序安装包和中文语言包.
https://download.tortoisegit.org/tgit/2.5.0.0/ 这是2.5.0.0版本的,直接安装便可

设置

在桌面右键选择tortoiseGit,选择设置,设置用户名和邮箱,跟在git bash是同样的,此时设置的是全局的
初学Git及简单搭建git服务器和客户端
进到本地仓库目录中能够针对项目设置局部配置
初学Git及简单搭建git服务器和客户端

克隆仓库

ssh key的步骤前面已经说完了,而后就能够克隆仓库进行使用了
选择你想要克隆仓库的文件夹,右键选择Git克隆,等同于 git clone [url]
URL是你要克隆的服务器版本库路径,目录是你要克隆到你本地的路径
初学Git及简单搭建git服务器和客户端
填写服务器的url,肯定,在克隆过程当中会要求输入git用户的密码,而后在本地生成了仓库gittest,在gittest下面有.git目录,就是本地的版本库目录了,若是上一步选择了克隆成纯版本库,就不会有.git目录了,在本地通常不这样作
初学Git及简单搭建git服务器和客户端
初学Git及简单搭建git服务器和客户端

增长文件到暂存区

编辑一个文件保存,在空白处右键选择TortoiseGit,选择添加,加到暂存区,也就是git add,也能够在下一步里面直接提交
初学Git及简单搭建git服务器和客户端

本地提交文件

右键选择Git提交,填写日志信息,否则不能提交而后点提交,这一步是将文件提交到你本地的仓库,git中不能提交一个空文件夹,里面必定要有文件才行
第一行默认提交到master分支,也能够选择新建分支,提交到新分支上
初学Git及简单搭建git服务器和客户端
没有添加的文件也能够直接提交到版本库,也能够选择不提交未添加的文件
初学Git及简单搭建git服务器和客户端

推送到远程仓库

将文件推送到远程仓库,右键选择tortoiseGit,选择推送,将文件推送到服务器仓库上
能够选择推送哪一个分支上的信息,也能够选择推送到哪一个远程分支上
目标:选择推送到哪一个远程端上,选择管理,能够增长新的远程端,也能够直接写别的URL
初学Git及简单搭建git服务器和客户端
肯定推送
初学Git及简单搭建git服务器和客户端
在服务器仓库下执行git log能够看到你推送的文件,由于服务器上是裸仓库,因此没有工做目录,看不到推送的文件

拉取文件和获取文件

拉取和获取的区别
拉取:git pull 在将远程仓库最新版本拉到本地的同时,将其合并到本地的当前 HEAD 中。
通常选择非fast forward,会多生成一个commit 记录,并强制保留分支的开发记录,不会丢失分支信息,这对于之后代码进行分析特别有用。
初学Git及简单搭建git服务器和客户端
获取:git fetch 将远程仓库最新版本拉到本地,不会自动合并 ,毫不会更改任何本地分支
实际使用中 使用git fetch 更安全 在merge以前能够看清楚 更新状况 再决定是否合并
初学Git及简单搭建git服务器和客户端

建立分支,切换分支

右键TortoiseGit,选择建立分支,填入分支名称,选择在哪一个分支上新建分支,若是勾选切换新分支,分支建立后就直接在新分支上工做了,不然在TortoiseGit中选择切换分支
在分支上修改后提交到分支
初学Git及简单搭建git服务器和客户端
初学Git及简单搭建git服务器和客户端

合并

切换回master分支,TortoiseGit选择合并,选择非快进式合并,合并后master分支上有了其余分支上提交的信息
初学Git及简单搭建git服务器和客户端

解决冲突

当主干与分支修改了同一个文件,合并时会产生冲突
初学Git及简单搭建git服务器和客户端
打开文件与在命令行中同样,用<<<<<<<,=======,>>>>>>>标记出不一样分支的内容
初学Git及简单搭建git服务器和客户端
右键TortoiseGit中选择解决冲突
初学Git及简单搭建git服务器和客户端
双击该文件进行修改,左边窗口是分支上的内容,右边窗口是master上的内容,你要在下面的窗口上解决冲突,修改正确的文件内容,而后保存,而后将解决后的文件进行提交
初学Git及简单搭建git服务器和客户端

显示日志

红色表明当前分支,绿色表明本地分支,浅×××表明远端分支,×××表明标签
能够看到各版本提交的信息,及分支合并的信息,还有文件的操做状态
初学Git及简单搭建git服务器和客户端
颜色能够在设置中更改
初学Git及简单搭建git服务器和客户端
能够在每一条信息上右键选择与上一版本比较差别

以上就是TortoiseGit的基本操做了
下面是一些命令行操做

svn迁移到git服务器

根据须要,后期将会将svn上的数据迁移到git上

将svn库克隆到本地

使用TortoiseGit克隆svn库
初学Git及简单搭建git服务器和客户端
URL是svn的地址,是你要克隆的文件夹
由于个人svn库不是标准的trunk、branch、tags结构,因此下面的不勾选,若是是标准的svn结构,请勾选
克隆须要一段时间,根据svn库的大小而定

在git服务器上建立新的裸仓库

使用git init --bare svnrepo.git命令

将本地仓库推送到git服务器

先创建远端仓库,在本地仓库内右键选择TortoiseGit,设置,而后选择远端,在右侧URL中填写git服务器仓库地址,就是刚刚在git服务器上新建的裸仓库,origin是默认的远端名字,而后点击肯定
初学Git及简单搭建git服务器和客户端
远端创建好后,就能够将本地克隆到的仓库推送到服务器上了
在本地仓库作一些修改,记住要先在本地进行提交,而后再推送到服务器上
TortoiseGit—>推送 就能够了,因为服务器上是裸仓库,因此没有工做区,看不到文件,git log一下就能够看到你刚才修改文件的提交记录了

基础命令

我是在linux上操做的,算是本地仓库吧,不涉及远程库;在linux上操做与在windows上相同

把文件添加到版本库中

编辑一个readme.txt文件,将文件加入版本库中
[root@localhost repository]# git add readme.txt #将工做区中的文件添加到暂存区了

将文件提交到版本库

[root@localhost repository]# git commit -m “提交readme”
-m 是提交信息,便于查看提交了什么东西,这一步是将暂存区中的文件提交到仓库了

查看是否还有文件未提交

 
  1. [root@localhost repository]# git status

  2. #On branch master

  3. nothing to commit (working directory clean)

这样说明没有任何文件未提交,工做区是干净的

修改readme文件后保存,不进行任何操做,再查看状态

 
  1. [root@localhost repository]# git status

  2. #On branch master

  3. #Changed but not updated:

  4. #(use "git add <file>..." to update what will be committed)

  5. # (use "git checkout -- <file>..." to discard changes in working directory)

  6. #

  7. # modified: readme.txt

  8. #

  9. no changes added to commit (use "git add" and/or "git commit -a")

上面的命令告诉咱们 readme.txt文件已被修改,可是并无提交

查看readme.txt文件修改了什么内容

 
  1. [root@localhost repository]# git diff

  2. diff --git a/readme.txt b/readme.txt

  3. index 92e045e..d94ee74 100644

  4. --- a/readme.txt

  5. +++ b/readme.txt

  6. @@ -5,4 +5,3 @@

  7. 666666

  8. 777777

  9. 999999

  10. -000

能够看到,少了一行000
知道了对readme.txt文件作了什么修改后,咱们能够放心的提交到仓库了,提交修改和提交文件是同样的2步(第一步是git add 第二步是:git commit)。

 
  1. [root@localhost repository]# git add readme.txt

  2. [root@localhost repository]# git commit -m "readme删除000"

查看历史记录

 
  1. [root@localhost repository]# git log

  2. commit ffc46d25feacd0ae1926ace37efecd116402503e #版本号

  3. Author: bai <xxx@qq.com>

  4. Date: Tue Jan 9 16:49:18 2018 +0800

  5.  
  6. readme删除000 #最近一次提交内容,也就是commit -m 写的内容

  7.  
  8. commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f

  9. Author: bai <xxx@qq.com>

  10. Date: Mon Jan 8 11:26:26 2018 +0800

  11.  
  12. readme增长222222

  13.  
  14. commit 876477f1b209ba61de4248ff26c2c1a098520295

  15. Author: bai <xxx@qq.com>

  16. Date: Mon Jan 8 11:20:45 2018 +0800

  17.  
  18. 提交readme.txt

若是嫌上面显示的信息太多的话,咱们可使用命令 git log –pretty=oneline

 
  1. [root@localhost repository]# git log --pretty=oneline

  2. ffc46d25feacd0ae1926ace37efecd116402503e readme删除000

  3. 1fac1a93037444bfbd59e51b57c511aaa0a9578f readme增长222222

  4. 876477f1b209ba61de4248ff26c2c1a098520295 提交readme.txt

版本回退

[root@localhost repository]# git reset --hard HEAD^ #回退到上一版本

 
  1. [root@localhost repository]# git log

  2. commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f

  3. Author: bai <xxx@qq.com>

  4. Date: Mon Jan 8 11:26:26 2018 +0800

  5.  
  6. readme增长222222

  7.  
  8. commit 876477f1b209ba61de4248ff26c2c1a098520295

  9. Author: bai <xxx@qq.com>

  10. Date: Mon Jan 8 11:20:45 2018 +0800

  11.  
  12. 提交readme.txt

能够看到删除000的操做没有了
若是想要回退到上上个版本就把HEAD^ 改为 HEAD^^,以此类推
若是想回到100个版本以前的话,就git reset --hard HEAD~100

回退到指定版本

[root@localhost repository]# git reset HEAD 版本号

得到版本号

 
  1. [root@localhost repository]# git reflog

  2. 19ecf86 HEAD@{0}: HEAD^: updating HEAD

  3. 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
而后再重复第二步

删除文件

 
  1. [root@localhost repository]# git rm readme.txt

  2. [root@localhost repository]# git commit -m “删除readme”

建立分支

 
  1. [root@localhost repository]# git checkout –b fenzhi

  2. 这个命令至关于两条命令

  3. git branch fenzhi 建立分支

  4. git checkout fenzhi 切换到该分支

咱们在分支上修改了文件内容提交后,在主分支上是看不到刚才修改的内容的

查看当前分支

 
  1. [root@localhost repository]# git branch

  2. * fenzhi

  3. master

带星号的则表明当前在该分支上

合并分支

 
  1. [root@localhost repository]# git checkout master #在master分支上进行合并

  2. [root@localhost repository]# git merge --no-ff fenzhi

在分支上修改内容后,与主分支合并,合并后就统一了文件内容

删除分支

[root@localhost repository]# git branch -d fenzhi

解决冲突

当你在主分支上和其余分支上修改了同一个文件而且都提交了,当在主分支上合并的时候就会产生冲突
初学Git及简单搭建git服务器和客户端
查看文件内容是这样的
初学Git及简单搭建git服务器和客户端
Git用<<<<<<<,=======,>>>>>>>标记出不一样分支的内容,其中<<< HEAD是指主分支修改的内容,>>>>fenzhi 是指fenzhi上修改的内容
咱们能够手动修改文件,解决冲突,而后在提交到版本库

用git log查看分支历史

git log --graph --pretty=oneline --abbrev-commit
初学Git及简单搭建git服务器和客户端

隐藏工做区

在开发中,会常常碰到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内容也删除了。

©著做权归做者全部:来自51CTO博客做者xinsir999的原创做品,如需转载,请注明出处,不然将追究法律责任

git服务器Linux

0

分享

相关文章
相关标签/搜索