git服务器环境搭建和客户端简单操作
Linux下Git的初级使用
几个概念 工作目录(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的文件夹 里面放1个testdoc的文档
[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 you@example.com
If the identity used for this commit is wrong, you can fix it with:
git commit --amend --author='Your Name <you@example.com>'
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下来,你才可以提交上去。
箭头在哪里标着,就代表当前版本是哪个,版本不一样,到时候的工作空间里面的内容是不一样的。
更多推荐
所有评论(0)