zoukankan      html  css  js  c++  java
  • Git 的使用

     

    SVN与Git的最主要的区别?

          SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

          Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

     

    Git基本常用命令如下:

       mkdir:         XX (创建一个空目录 XX指目录名)

       pwd:          显示当前目录的路径。

       git init          把当前的目录变成可以管理的git仓库,生成隐藏.git文件。

       git add XX       把xx文件添加到暂存区去。

       git commit –m “XX”  提交文件 –m 后面的是注释。

       git status        查看仓库状态

       git diff  XX      查看XX文件修改了那些内容

       git log          查看历史记录

       git reset  –hard HEAD^ 或者 git reset  –hard HEAD~ 回退到上一个版本

                            (如果想回退到100个版本,使用git reset –hard HEAD~100 )

       cat XX         查看XX文件内容

       git reflog       查看历史记录的版本号id

       git checkout — XX  把XX文件在工作区的修改全部撤销。

       git rm XX          删除XX文件

       git remote add origin https://github.com/tugenhua0707/testgit 关联一个远程库

       git push –u(第一次要用-u 以后不需要) origin master 把当前master分支推送到远程库

       git clone https://github.com/tugenhua0707/testgit  从远程库中克隆

       git checkout –b dev  创建dev分支 并切换到dev分支上

       git branch  查看当前所有的分支

       git checkout master 切换回master分支

       git merge dev    在当前的分支上合并dev分支

       git branch –d dev 删除dev分支

       git branch name  创建分支

       git stash 把当前的工作隐藏起来 等以后恢复现场后继续工作

       git stash list 查看所有被隐藏的文件列表

       git stash apply 恢复被隐藏的文件,但是内容不删除

       git stash drop 删除文件

       git stash pop 恢复文件的同时 也删除文件

       git remote 查看远程库的信息

       git remote –v 查看远程库的详细信息

       git push origin master  Git会把master分支推送到远程库对应的远程分支上

     

    参考资料:http://blog.jobbole.com/78960/

     -------------------------------------------------------------------------------------------------------------------------------------

    git的server的搭建方式大致几种:

    1、基于git daemon搭建,这种方式配置还比较简单,但是貌似对身份认证支持不好。

    2、ssh方式,这种方式就是需要在server上加真实用户,对于我来说,觉得不太爽。

    3、http方式,简单方便,但是我不想再装个apache了。

    4、使用gitosis/gitolite搭建,这种方式搭建、配置过程会复杂一些,但是功能强大(功能上gitolite更丰富一些,

       并且考虑到gitosis有1年多没有更新了,于是决定使用gitolite)

    首先创建一个裸仓库

    服务器端:

    #cd /opt/git

    #mkdir project.git

    #cd project.git

    #git --bare init

    用户连接git server有两种方式:

    client1:

    #git clone gitserver:/opt/git/project.git

    #cd project

    #touch README

    #git commit -am 'fix for the README file'

    #git push origin master(上传)

    #git pull origin master(下载)

    client2:

    #cd myproject

    #git init

    #touch README

    #git add .

    #git commit -m 'initial commit'

    #git remote add origin git@gitserver:/opt/git/project.git

    #git push origin master(上传)

    #git pull origin master(下载)

    作为一个额外的防范措施,你可以用Git自带的git-shell工具限制git用户的活动范围。只要把它设为git用户登入的shell,

    那么该用户就无法使用普通的bash或者csh什么的shell程序。编辑/etc/passwd文件:

    #vim /etc/passwd

    在文件末尾,你应该能找到类似这样的行:

    git:x:1000:1000::/home/git:/bin/sh

    把 bin/sh 改为 /usr/bin/git-shell (或者用 which git-shell 查看它的实际安装路径)。该行修改后的样子如下:

    git:x:1000:1000::/home/git:/usr/bin/git-shell

    公共访问

    服务器端操作:

    首先,开启挂钩:

    #cd project.git

    #mv hooks/post-update.sample hooks/post-update

    #chmod a+x hooks/post-update

    post-update 挂钩是做什么的呢?其内容大致如下:

    # cat .git/hooks/post-update

    #!/bin/sh

    #

    # An example hook script to prepare a packed repository for use over

    # dumb transports.

    #

    # To enable this hook, rename this file to "post-update".

    #

    exec git-update-server-info

    意思是当通过SSH向服务器推送时,Git将运行这个 git-update-server-info命令来更新匿名HTTP访问获取数据时所需要的文件。

    接下来,在Apache配置文件中添加一个VirtualHost条目,把文档根目录设为Git项目所在的根目录。

    这里我们假定DNS服务已经配置好,会把对.gitserver的请求发送到这台主机:

    <VirtualHost *:80>

        ServerName git.vfast.com.cn

        DocumentRoot /opt/git

        <Directory /opt/git/>

            Order allow,deny

            Allow from all

        </Directory>

    </VirtualHost>

    另外,需要把/opt/git目录的Unix用户组设定为apache,这样web服务才可以读取仓库内容,

    因为运行CGI脚本的Apache实例进程默认就是以该用户的身份起来的:

    # chgrp -R apache /opt/git

    重启 Apache 之后,就可以通过项目的 URL 来克隆该目录下的仓库了。

    #git clone http://git.vfast.com.cn/project.git

    gitweb:

    #yum install gitweb

    安装完成后,CGI 脚本放在/var/www/git/gitweb.cgi。使用配置文件为 /etc/gitweb.conf。

    #vim /etc/gitweb.conf

    $projectroot = "/data1/code";  #/data1/code 是git仓库的存放目录

    #vim /etc/httpd/conf/httpd.conf  增加下面部分(这部分可以不要的看/etc/httpd/conf.d/git.conf就可以了)

    <VirtualHost *:80>

        ServerName gitserver

        DocumentRoot /var/www/git

        <Directory /var/www/git>

            Options ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch

            AllowOverride All

            order allow,deny

            Allow from all

            AddHandler cgi-script cgi

            DirectoryIndex gitweb.cgi

        </Directory>

    </VirtualHost>

    Gitosis:

    生成一个git用户的私钥/公钥对:

    client1(192.168.10.66):

    #ssh-keygen

    #scp /root/.ssh/id_rsa.pub 219.234.90.243:/data2/

    服务端(219.234.90.243):

    #yum install python-setuptools

    #git clone https://github.com/tv42/gitosis.git

    #git clone git://github.com/res0nat0r/gitosis.git###

    #cd gitosis

    #python setup.py install

    这会安装几个供 Gitosis使用的工具。默认Gitosis会把 /home/git作为存储所有Git仓库的根目录,这没什么不好,

    不过我们之前已经把项目仓库都放在 /data1/code里面了,所以为方便起见,我们可以做一个符号连接,直接划转过去,而不必重新配置:

    #gitosis-init < /tmp/id_dsa.pub  默认会在用户的家目录下创建仓库repositories目录,如果要想用其他目录的话可以再初始化之前做软连接

             #ln -s /data1/code /root/repositories

    #cd /root/repositories/gitosis-admin.git

    #chmod 755 /root/repositories/gitosis-admin.git/hooks/post-update

    client1(192.168.10.66):

    [root@localhost git]# ssh 219.234.90.243

    PTY allocation request failed on channel 0

    ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.

                                                                      Connection to 219.234.90.243 closed.

    说明 Gitosis 认出了该用户的身份,但由于没有运行任何 Git 命令,所以它切断了连接。

    #git clone 219.234.90.243:gitosis-admin.git 

    [root@localhost gitosis-admin]# ls -r ./*

    ./gitosis.conf  文件是用来设置用户、仓库和权限的控制文件

    ./keydir:

    root@localhost.localdomain.pub    目录则是保存所有具有访问权限用户公钥的地方— 每人一个。在keydir里的文件名

                                                                               (比如上面的 scott.pub)应该跟你的不一样 — Gitosis 会自动从使用 gitosis-init

                                                                                脚本导入的公钥尾部的描述中获取该名字。 

    创建新项目:

    #vim gitosis.conf

    [gitosis]

    [group gitosis-admin]

    writable = gitosis-admin

    members = root@localhost.localdomain

    [group web]

    writable = weblog_project

    members = root@localhost.localdomain       

    #git add .

    #git commit -am 'add weblog_project'

    #git push origin master (这是server端就能看到gitosis.conf文件的变化了)

    生成weblog_project.git 裸仓库

    #git remote add weblog 219.234.90.243:weblog_project.git                                                      

    #git push weblog master

    在新工程weblog_project 里首次推送数据到服务器前,得先设定该服务器地址为远程仓库。

    但你不用事先到服务器上手工创建该项目的裸仓库— Gitosis 会在第一次遇到推送时自动创建:

    获取weblog_project.git仓库:

    #git clone 219.234.90.243:weblog_project.git

    client2(192.168.10.67):

    #ssh-keygen

    #scp /root/.ssh/id_rsa.pub 192.168.10.66:/root/git/gitosis-admin/keydir/sunrencai.pub

    client1(192.168.10.66):

    #vim gitosis.conf

    [gitosis]

    [group gitosis-admin]

    writable = gitosis-admin

    members = root@localhost.localdomain

    [group web]

    writable = weblog_project

    members = root@localhost.localdomain sunrencai

    #git add .

    #git commit -am 'add a new user'

    #git push origin master

    client2(192.168.10.67):

    #git clone 219.234.90.243:weblog_project.git

    #vim gitosis.conf(文件说明)

    [gitosis]

    [group gitosis-admin]

    writable = gitosis-admin

    members = root@localhost.localdomain

    [group web]

    writable = weblog_project

    members = root@localhost.localdomain sunrencai

    [group web_ro] 设置只读权限

    readonly = weblog_project

    members = scott josie jessica

    [group web_2]

    writable  = another_weblog_project

    members   = @web john

    Gitolite:(使用) 

    服务端(219.234.90.243):

    #git clone git://github.com/sitaramc/gitolite

    #mkdir -p /root/bin/

    #gitolite/install -ln   # assumes $HOME/bin exists and is in your $PATH

    #gitolite setup -pk /data2/code/192.168.10.66.pub

    client1(192.168.10.66):

    #git clone 219.234.90.243:gitolite-admin.git

    client2(192.168.10.67):

    #ssh-keygen

    #scp /root/.ssh/id_rsa.pub 192.168.10.66:/root/git/gitolite-admin/keydir/192.168.10.67.pub

    client1(192.168.10.66):(增加192.168.10.67这台机器的访问)

    [root@localhost gitolite-admin]#vim conf/gitolite.conf 添加192.168.10.67这个用户

    repo gitolite-admin

        RW+     =   192.168.10.66 192.168.10.67

    repo testing

        RW+     =   @all

    #git add .

    #git commit -am 'add a new user'

    #git push origin master

    client2(192.168.10.67):

    #git clone 219.234.90.243:gitolite-admin.git

    #git clone 219.234.90.243:testing.git

    增加一个新项目:

    client1(192.168.10.66):(增加一个weblog项目)

    [root@localhost gitolite-admin]#vim conf/gitolite.conf 添加192.168.10.67这个用户

    [root@localhost gitolite-admin]# more conf/gitolite.conf

    repo gitolite-admin

        RW+     =   192.168.10.66 192.168.10.67

    repo testing

        RW+     =   @all

    repo project_weblog

        RW+     =       192.168.10.66 (只赋予了192.168.10.66这台机器访问,192.168.10.67是访问不了的)

    #git add .

    #git commit -am 'add a new user'

    #git push origin master

    #git clone 219.234.90.243:project_weblog.git 因为10.66有读写权限所有可以获取仓库

    client2(192.168.10.67):

    [root@localhost code]# git clone 219.234.90.243:project_weblog.git

    Initialized empty Git repository in /data2/code/project_weblog/.git/

    FATAL: R any project_weblog 192.168.10.67 DENIED by fallthru

    (or you mis-spelled the reponame)

    fatal: The remote end hung up unexpectedly

    client1(192.168.10.66):(增加192.168.10.67对weblog项目的只读权限)

    [root@localhost gitolite-admin]# more conf/gitolite.conf

    repo gitolite-admin

        RW+     =   192.168.10.66 192.168.10.67

    repo testing

        RW+     =   @all

    repo project_weblog

        RW+     =       192.168.10.66 (只赋予了192.168.10.66这台机器访问,192.168.10.67是访问不了的)

             R           =   192.168.10.67

    client2(192.168.10.67):

    [root@localhost code]# git clone 219.234.90.243:project_weblog.git

    Initialized empty Git repository in /data2/code/project_weblog/.git/

    remote: Counting objects: 4, done.

    remote: Compressing objects: 100% (2/2), done.

    remote: Total 4 (delta 0), reused 0 (delta 0)

    Receiving objects: 100% (4/4), done.

    #git add .

    #git commit -am 'add a new user'

    #git push origin master (没有写权限)

    FATAL: W any project_weblog 192.168.10.67 DENIED by fallthru

    (or you mis-spelled the reponame)

    fatal: The remote end hung up unexpectedly

    gitolite 高级部分:

    你可以给用户或者仓库分组。分组名就像一些宏;定义的时候,无所谓他们是工程还是用户;区别在于你使用“宏”的时候

    @oss_repos      = linux perl rakudo git gitolite

    @secret_repos   = fenestra pear

    @admins         = scott

    @interns        = ashok

    @engineers      = sitaram dilbert wally alice

    @staff          = @admins @engineers @interns

     

     

  • 相关阅读:
    Pycharm2017应用小技巧
    浅谈哈希表
    攻克网页文字不可复制的难题
    Java中List的相关知识
    电脑实用小技巧
    Jme3涉及的eclipse知识
    Word2010撤销按钮失效,Ctrl+Z失效解决办法
    Word文档中怎么删除空白页?删除空白页的六种方法
    word中分栏后文字均匀的分布在了左右两栏,而不是填满左栏再填右栏,怎么办?
    visdom服务启动时提示Downloading scripts, this may take a little while解决办法
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/5102500.html
Copyright © 2011-2022 走看看