git服务器环境搭建和客户端简单操作

                     LinuxGit的初级使用

几个概念       工作目录(work tree)       本地仓库(local repository)   暂存区域 (index)    

 

工作目录:  就是你可以使用git操作的命令,比如git checkout啦,暂时可以理解为当前目录下有.git文件夹的目录

暂存区域:  所谓的暂存区域只不过是个简单的文件,一般都放在 Git 目录中。有时候人们会把这个文件叫做索引文件(index),不过标准说法还是叫暂存区域。

本地仓库:  就是把暂存区域里面的文件提交到git能够管理的和追踪的仓库里面,

先了解一下这3个概念,以后会在实践中加深理解

 服务器端:

[root@gitserver ~]# mkdir /git   =>在根目录下新建一个git目录

[root@gitserver ~]# cd /git      => 进入刚才新建的目录

[root@gitserver git]# ls  -a     =>  里面空空如也,没有任何隐藏文件

[root@gitserver git]#  git --bare init    =>初始化一个裸仓库

Initialized empty Git repository in /git/

[root@gitserver git]# ls -a            =>里面多了一些管理仓库的配置文件

.  ..  branches  config  description  HEAD  hooks  info  objects  refs

 

注意!

     初始化仓库有2种方式  git --bare init git init 区别有以下2

  1, 用git init 初始化里面,git目录下面只有一个.git文件夹,用git --bare init里面的都是些配置文件,如上操纵 显示的结果 

  2,  "git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作。但别的用户在将更新push上来的时候容易出现冲突。比如有用户在该目录(就称为远端仓库)下执行git操作,且有两个分支(master  b1),当前在master分支下。另一个用户想把自己在本地仓库(就称为本地仓库)的master分支的更新提交到远端仓库的master分支,他就想当然的敲了git push origin master:master于是乎出现错误 ,因为远端仓库的用户正在master的分支上操作,而你又要把更新提交到这个master分支上,当然就出错了确定一个repository是否为bare库的关键在于core.bare属性(boolean型属性)。core.bare属性可以有git config命令设置,也可以通过修改config文件的方式设置conf文件指的就是当前库下面的conf配置文件,如果这里 bare = true 那么即使有.git文件夹也还是不能进行相关操作。 如果使用了git init初始化,则远程仓库的目录下,也包含work tree,当本地仓库向远程仓库push时, 如果远程仓库正在push的分支上(如果当时不在push的分支,就没有问题), 那么push后的结果不会反应在work tree上, 也即在远程仓库的目录下对应的文件还是之前的内容,必须得使用git reset --hard才能看到push后的内容.

现在我们已经把远程仓库搭建好了,不过现在这个仓库里面什么也没有,赶快添加点东西进    去把,

[root@gitserver git]# mkdir ycjtest    

[root@gitserver git]# cd ycjtest

[root@gitserver ycjtest]# vim testdoc     =>在仓库路径下新建一个文件夹放入testdoc文档保存退出

注意 : 刚才那个文件只是保存在了磁盘下面,还没有往仓库里面提交,也就是说现在仓库里面还是空空如也,不要试图在仓库目录下面看到仓库里面的东西,即使在客户端提交到远程仓库了,在这里你也看不到提交的内容。到底怎么看后面我们会讲到。

 

[root@gitserver ycjtest]# git add testdoc 

fatal: This operation must be run in a work tree    =>报错啦!对了,这是个bare仓库,不能进行git命令的相关操作,

注意:这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(”This operation must be run in a work tree”),所以对于远程仓库,我们初始化的时候最好使用git --bare init命令初始化。

为了以后方便测试,我们再用同样的方法在根目录下新建一个git1仓库,这里用git init 进行仓库初始化,同样在里面新建一个ycjtest的文件夹 里面放1testdoc的文档

[root@gitserver git1]# git add .    =>当前目录到添加到暂存区,别忽略了后面的点

[root@gitserver git1]# git commit -a -m 'testycj hello'   =>提交所有暂存区的文件到仓库

[master (root-commit) 56f8557] testycj hello

 Committer: root <root@gitserver.(none)>

Your name and email address were configured automatically based

on your username and hostname. Please check that they are accurate.

You can suppress this message by setting them explicitly:

 

    git config --global user.name "Your Name"

    git config --global user.email [email protected]

 

If the identity used for this commit is wrong, you can fix it with:

 

    git commit --amend --author='Your Name <[email protected]>'

 

 1 files changed, 1 insertions(+), 0 deletions(-)           =>从这里可以看出提交了几个文件

 create mode 100644 testycj/testdoc

 

如何添加空文件夹到暂存区?git 和 svn 不同,仅仅跟踪文件的变动,不跟踪目录。这么设计是有原因的。但这会带来一些小麻烦。有时候,确实需要在代码仓库中保留某个空目录。比如测试时需要用到的空目录。变通的解决办法是在空目录下存一个 .gitignore 文件。然后 git add 此目录后,相当于跟踪了 .gitignore 文件,产生的“副作用”就是这个“空”目录也纳入“跟踪”,最终的效果是可以 check out 出一个看起来空空的目录。如果有许多这样的空目录,可以用下面的命令自动补充 .gitignore 文件:find . \( -type d -empty \) -and \( -not -regex ./\.git.* \) -exec touch {}/.gitignore \;然后  git add -f . -f是强制添加的意思,然后提交到仓库都可以了,

递归找寻当前目录下,类型为目录,且为空,也没有 .git 开头的文件,在其中用 touch 新建一个空的 .gitignore 文件。

客户端:

   客户端以window为例,如果通过ssh协议连接到远程仓库的话,推荐用ssh密钥对,免密码登陆,可以先用gitbash工具生成密钥对,公钥发给git管理员,私钥保存到当前用户目录下.ssh文件夹下面。以后工作都是在eclipse下面,所以你必须把你的私钥存放位置在eclipse下面配置

注意:管理员负责把公钥添加到服务器指定用户(比如eos)下面的.ssh目录下面的authorized_keys文件里面,只有这样,当你用eos用户连接远程仓库的时候,你的私钥才可以和服务器的公钥配对成功

 

 

下面从远程克隆一个git仓库到工作空间 ,红色箭头指的是克隆图标

 

 

我不是采用密钥对登陆的,所以需要输入root的密码

 

 

 

 

 

这个仓库将存放到本地哪个地方

 

剩下的Next即可,克隆之后发现git仓库多了一个叫git166的就是我们刚才克隆的远程仓库,

 

打开Wording Directory路径下面,刚才在服务端创建的文件到了本地的工作路径

 

打开里面的testdoc文档,修改里面的内容,添加一行注释,保存

 

然后选择项目右键,commit 

 

如果是用户/密码push远程仓库的话,需要输入密码在这里,ssh密钥则不需要

 

如果出现服务器拒绝push的话,

error: refusing to update checked out branch: refs/heads/master

则需要修改服务器端仓库配置文件,加上后面2行的

 

 

 

注意:如果使用了git init初始化,则远程仓库的目录下,也包含work tree,当本地仓库向远程仓库push时, 如果远程仓库正在push的分支上(如果当时不在push的分支,就没有问题), 那么push后的结果不会反应在work tree上, 也即在远程仓库的目录下对应的文件还是之前的内容,必须得使用git reset --hard才能看到push

 

 

 

 

服务器端操作

 

[root@gitserver testycj]# cat testdoc     ==.>虽然已经push到仓库,工作空间还是原样

hello world testdoc

[root@gitserver testycj]# git reset --hard    ==彻底回退到某个版本并刷新工作空间

HEAD is now at 6e87c18 commit from client

[root@gitserver testycj]# cat testdoc       ==》再次查看,发现显示了刚才提交的内容

hello world testdoc

<!--add a comment-->

可以看出刚才修改的内容已经提交到仓库里面了。

reset命令有3种方式:

git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息 

git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可 

git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容 

以下是一些reset的示例:

(1) 回退所有内容到上一个版本
git reset HEAD^
(2) 回退a.py这个文件的版本到上一个版本
git reset HEAD^ a.py
(3) 向前回退到第3个版本
git reset –soft HEAD~3
(4) 将本地的状态回退到和远程的一样
git reset –hard origin/master
(5) 回退到某个版本
 git reset 057d
(7) 回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit
git revert HEAD

 

Eclipse几个图标

向上的箭头有关1表示,本地仓库提交了1次,向下的箭头有个1表示服务器那边有了1个改动,你只有先把这个改动fetch下来,你才可以提交上去。

箭头在哪里标着,就代表当前版本是哪个,版本不一样,到时候的工作空间里面的内容是不一样的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章