zoukankan      html  css  js  c++  java
  • Git和Gitlab

    参考

    http://www.cnblogs.com/clsn/p/7929958.html#auto_id_16
    https://backlog.com/git-tutorial/cn/intro/intro1_1.html
    https://git-scm.com/book/zh/v2

    Git安装

    yum安装

    [root@12 ~]# yum install -y git

    编译安装

    下载地址

    https://github.com/git/git/releases

    安装依赖

    [root@12 ~]# yum install -y curl-devel expat-devel gettext-devel  openssl-devel zlib-devel gcc*

    上传tar包,编译安装

    [root@12 ~]# tar -zxf git-2.17.0.tar.gz
    [root@12 ~]# cd git-2.17.0/
    [root@12 git-2.17.0]# make configure

    如果报如图错误,安装qutoconf

    [root@12 git-2.17.0]# yum install -y autoconf

    没问题继续

    [root@12 git-2.17.0]# ./configure --prefix=/usr/local
    [root@12 git-2.17.0]# make
    [root@12 git-2.17.0]# make install

    配置Git

    [root@12 ~]# git config --global user.name "wanglan"  #配置Git使用用户
    [root@12 ~]# git config --global user.email "123456@qq.com" #配置Git使用邮箱
    [root@12 ~]# git config --global color.ui true  #语法高亮
    [root@12 ~]#  git config --list # 查看全局配置
    user.name=wanglan
    user.email=123456@qq.com
    color.ui=true

    配置后生成的配置文件

    [root@12 ~]# cat .gitconfig 
    [user]
        name = wanglan
        email = 123456@qq.com
    [color]
        ui = true

    创建Git仓库

    [root@12 ~]# mkdir git_data  #创建Git目录
    [root@12 ~]# cd git_data
    [root@12 git_data]# git init  #初始化Git仓库
    Initialized empty Git repository in /root/git_data/.git/ 
    [root@12 git_data]# git status #查看工作状态
    On branch master #位于master分支上
    
    No commits yet #没有提交的内容
    
    nothing to commit (create/copy files and use "git add" to track)

    创建文件

    [root@12 git_data]# touch README
    [root@12 git_data]# git status
    On branch master
    
    No commits yet
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
        README
    
    nothing added to commit but untracked files present (use "git add" to track)

    添加文件跟踪

    [root@12 git_data]# git add ./*  
    [root@12 git_data]# git status
    On branch master
    
    No commits yet
    
    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
    
        new file:   README

    文件会添加到 .git 的隐藏目录

    [root@12 git_data]# tree .git/
    .git/
    ├── branches
    ├── config
    ├── description
    ├── HEAD
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── fsmonitor-watchman.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── prepare-commit-msg.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   ├── pre-receive.sample
    │   └── update.sample
    ├── index
    ├── info
    │   └── exclude
    ├── objects
    │   ├── e6
    │   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags

    由工作区提交到本地仓库

    [root@12 git_data]# git commit -m "test"   # -m后面为注释信息
    [master (root-commit) 52c2c95] test
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 README

    查看Git的状态

    [root@12 git_data]# git status
    On branch master
    nothing to commit, working tree clean

    查看提交后的Git目录状态

    [root@12 git_data]# tree .git/
    .git/
    ├── branches
    ├── COMMIT_EDITMSG
    ├── config
    ├── description
    ├── HEAD
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── fsmonitor-watchman.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── prepare-commit-msg.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   ├── pre-receive.sample
    │   └── update.sample
    ├── index
    ├── info
    │   └── exclude
    ├── logs
    │   ├── HEAD
    │   └── refs
    │       └── heads
    │           └── master
    ├── objects
    │   ├── 52
    │   │   └── c2c95476560f3b65a23884bbf6a44c2e5e51c7
    │   ├── 54
    │   │   └── 3b9bebdc6bd5c4b22136034a95dd097a57d3dd
    │   ├── e6
    │   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        │   └── master
        └── tags

    删除Git内的文件

    没有添加到暂存区的数据直接rm删除即可

    已经添加到缓存区的数据:

    将文件从Git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)

     git rm --cached database

    将文件数据从git暂存区和工作目录一起删除  

    git rm -f database

    将文件撤出暂存区

    git reset HEAD database

    实践

    创建新文件

    [root@12 git_data]# touch 123
    [root@12 git_data]# git status
    On branch master
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
        123
    
    nothing added to commit but untracked files present (use "git add" to track)

    将文件添加到暂存区域

    [root@12 git_data]# git add 123
    [root@12 git_data]# git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        new file:   123
    
    [root@12 git_data]# 

    删除文件

    [root@12 git_data]# rm 123 -f 
    [root@12 git_data]# ls
    README
    [root@12 git_data]# git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        new file:   123
    
    Changes not staged for commit:
      (use "git add/rm <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        deleted:    123
    
    [root@12 git_data]# git reset HEAD 123
    [root@12 git_data]# git status
    On branch master
    nothing to commit, working tree clean

    重命名暂存区数据

    没有添加到暂存区的数据直接mv/rename改名即可。

    已经添加到暂存区数据:

    git mv README NOTICE

    查看历史记录

    查看提交历史记录

    git log

    查看最近几条记录

    git log -2

    显示每次提交的内容差异,例如仅查询最近一次差异

    git log -p  -1

    简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息

    git log --stat -2

    以更详细的模式输出提交的历史记录

    git log --pretty=fuller -2

    查看当前所有提交记录的简短SHA-1哈希字串与提交着的姓名

    git log --pretty=fomat:"%h %cn"

    使用format参数来指定具体的输出格式

    格式

    说明

    %s

    提交说明。

    %cd

    提交日期。

    %an

    作者的名字。

    %cn

    提交者的姓名。

    %ce

    提交者的电子邮件。

    %H

    提交对象的完整SHA-1哈希字串。

    %h

    提交对象的简短SHA-1哈希字串。

    %T

    树对象的完整SHA-1哈希字串。

    %t

    树对象的简短SHA-1哈希字串。

    %P

    父对象的完整SHA-1哈希字串。

    %p

    父对象的简短SHA-1哈希字串。

    %ad

    作者的修订时间。

    还原历史数据

    Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。

    查看现在的hash

    git reset --hard

    还原历史提交版本上一次

    git reset --hard HEAD^

    找到历史还原点的SHA-1值后,就可以还原(值不写全,系统会自动匹配)

    [root@12 git_data]# git log
    commit a409fc46f792228a8119705e9cc97c2a013534ab
    Author: clsn <13835544305@163.com>
    Date:   Wed Nov 29 11:44:14 2017 +0800
    
        test
    
    commit bb963eb32ad93a72d9ce93e4bb55105087f1227d
    Author: clsn <13835544305@163.com>
    Date:   Wed Nov 29 10:57:02 2017 +0800
    
        first commit

    还原数据

    [root@12 git_data]# git reset --hard  bb963
    HEAD 现在位于 bb963eb first commit
    # 查看数据
    [root@gitlab git_data]# ls
    README

    还原未来数据

    什么是未来数据?就是你还原到历史数据了,但是你后悔了,想撤销更改,但是git log已经找不到这个版本了

    查看未来历史更新点:git  reflog

    [root@12 git_data]# git reflog
    bb963eb HEAD@{0}: reset: moving to bb963
    a409fc4 HEAD@{1}: reset: moving to a409fc4
    bb963eb HEAD@{2}: reset: moving to bb963
    a409fc4 HEAD@{3}: commit: test
    bb963eb HEAD@{4}: commit (initial): first commit
    [root@gitlab git_data]#

    标签使用

    前面回滚使用的是一串字符串,又长又难记,

    当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag

    git tag v1.0

    查看当前所有的标签

    git show v1.0

    创建带有说明的标签,-a指定标签名字,-m指定说明文字

    git tag v1.2 -m "version 1.2 release is test"

    为同一个提交版本设置了两次标签,删除之前的v1.0

    git tag -d v1.0

    测试

    [root@12 git_data]# git reset --hard 0bdf2e7
    HEAD is now at 0bdf2e7 modified README file
    [root@gitlab git_data]# git reset --hard V1.0
    HEAD is now at a66370a add test dir
    
    [root@12 git_data]# git tag  v20171129
    [root@gitlab git_data]# git tag 
    v20171129

    对比数据

    git diff可以对比当前文件与仓库已保存文件的区别,知道了对README作了什么修改

    git diff README

    分支结构

    在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,平时不要随便直接修改里面的数据文件。干活都在dev分支上。每个人从dev分支创建自己个人分支,开发完合并到dev分支,最后dev分支合并到master分支。所以团队的合作分支看起来会像下图那样

    分支切换

    [root@12 git_data]# git branch linux
        [root@gitlab git_data]# git branch 
          linux
        * master
        [root@12 git_data]# git checkout linux 
        切换到分支 'linux'
        [root@gitlab git_data]# git branch 
        * linux
          master

    在linux分支进行修改

    [root@12 git_data]# cat README 
        [root@12 git_data]# echo "2017年11月30日" >> README 
        [root@12 git_data]# git add .
        [root@12 git_data]# git commit -m "2017年11月30日09点10分"
        [linux 5a6c037] 2017年11月30日09点10分
         1 file changed, 1 insertion(+)
        [root@12 git_data]# git status 
        # 位于分支 linux
        无文件要提交,干净的工作区

    回到master分支

    [root@12 git_data]# git checkout master 
        切换到分支 'master'
        [root@12 git_data]# cat README 
        [root@12 git_data]# git log  -1
        commit 7015bc7b316cc95e2dfe6c53e06e3900b2edf427
        Author: clsn <admin@znix.top>
        Date:   Wed Nov 29 19:30:57 2017 +0800
    
            123

    合并代码

    [root@12 git_data]# git merge linux 
        更新 7015bc7..5a6c037
        Fast-forward
         README | 1 +
         1 file changed, 1 insertion(+)
        [root@gitlab git_data]# git status 
        # 位于分支 master
        无文件要提交,干净的工作区
        [root@gitlab git_data]# cat README 
        2017年11月30日

    删除分支

     查看所有包含未合并工作的分支

    git branch --no-merged
    testing

    这里显示了其他分支。 因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败

    git branch -d testing
    error: The branch 'testing' is not fully merged.
    If you are sure you want to delete it, run 'git branch -D testing'

    如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它

    Gitlab(机器内存配置应最少为4G,否则会卡顿)

    参考文档:

    https://about.gitlab.com/installation/#centos-7

    安装并配置必要的依赖关系

    在CentOS上,以下命令也将在系统防火墙中打开HTTP和SSH访问

     
    [root@node1 ~]# yum install -y curl policycoreutils openssh-server openssh-clients
    [root@node1 ~]# systemctl enable sshd
    [root@node1 ~]# systemctl start sshd
    [root@node1 ~]# firewall-cmd --permanent --add-service=http
    如果开放了防火墙重新加载防火墙
    [root@node1 ~]#systemctl reload firewalld

    添加GitLab包服务器并安装包

    安装包下载地址

    官网 :https://about.gitlab.com/downloads/ 
    清华大学镜像: https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
    [root@node1 ~]# wget https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.6.2-ce.0.el7.x86_64.rpm
    [root@node1 ~]# rpm -ivh gitlab-ce-9.5.2-ce.0.el7.x86_64.rpm 

    配置并启动GitLab

    [root@node1 ~]# gitlab-ctl reconfigure  # 编译配置
    [root@node1 ~]# gitlab-ctl start [root@node1 ~]# gitlab-ctl status

    通过浏览器访问 :IP地址

    配置GitLab域名,否则项目git clone的地址时错

    [root@11 ~]# vim  /etc/gitlab/gitlab.rb
    编辑 :external_url '你的网址'
    例如 :external_url 'http://192.168.1.100'
    编辑完成后,再 gitlab-ctl reconfigure 使配置生效

    进行web界面操作

    第一次访问时创建密码

    登录用户为root,

    创建一个新的项目

     定义项目

     

    创建完成后会提示没有添加ssh秘钥

    在服务器上创建ssh秘钥

    [root@11 ~]# ssh-keygen 
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Created directory '/root/.ssh'.
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:8v/xXIGry7oNGpAemTjuMTWyauX0DNYgDdtTivrWRZQ root@10.0.0.11
    The key's randomart image is:
    +---[RSA 2048]----+
    |       .         |
    | .   .E          |
    |  * o.           |
    | + *. =       .  |
    |. .++X. S    . . |
    |. .=*.=o      . .|
    | .=*+o ...  ..  .|
    | .=.+o  o.+ .+ . |
    |.o .   . o+*o o  |
    +----[SHA256]-----+
    [root@10 ~]# cat .ssh/id_rsa
    id_rsa      id_rsa.pub  

    [root@11 ~]# cat .ssh/id_rsa.pub
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDQMQD/rUedK+DNzENuhcv8vF0zQ01iQ9nbjJIGdL/u/ymePXeydv1ZMQ1ZXZXGy4BT+Zg1Xj/KUxYbPyXQ0TIdnfF0d9FIraAfxk8K7m47l9c7iECcncvVnQfbHLpoCTudKnOiuci/4rKQzUxaSfZhdPsZ0NXyOCiYxC07ior4AMk/YeAwOVDWDU2CQDfur2QwUbLuV2+gFA2CR+9fYpXgYMv0Sr4cUJ02JOiz3rSAi6Anl4riyqI9qdX+1FU5bS1y5SJ/nbHwmu2MJ5vOeFczczpxocsXpQT/lz40HMnsjAXp38qTPdVIDS3Enig4mR9w64WZJ5M0lTCSamCtSep root@10.0.0.11

     

    将秘钥添加到web页面的用户中

     

     本地仓库创建 提交 推送

     所有代码只能向 dev 分支推送,不允许直接推送 master 分支。你也提不上。。

     方法一:适用于不存在demo仓库

    git clone http://git.xinchanedu.com/root/demo.git
    cd demo
    touch README.md
    git add README.md
    git commit -m "add README"
    git push -u origin master:dev

    方法二:适用于已经存在demo目录

     
    cd demo
    git init
    git remote add origin http://git.xinchanedu.com/root/demo.git
    git add .
    git commit -m "Initial commit"
    git push -u origin master:dev

    方法三:适用于已经存在demo仓库

     
    cd demo
    git remote rename origin old-origin
    git remote add origin http://git.xinchanedu.com/root/demo.git
    git push -u origin master:dev # 本地所有分支推到dev
    git push -u origin master:dev --tags # 本地所有tags推到dev

    创建文件并推到远端git仓库

    [root@11 Test1]# echo "clsn" >> clsn
    [root@11 Test1]# git push -u origin master

     

  • 相关阅读:
    在Linux下卸载Oracle 11g
    Android UI学习 Menu
    Android中设置EditText获得焦点时不弹出软键盘
    Android ADB 命令
    Oracle下载地址
    Android开发快捷键
    Android中将字符串文字内容复制到系统剪贴板
    MySQL数据库常用备份方法和注意事项
    详解Android首选项框架ListPreference
    sql连接查询方法
  • 原文地址:https://www.cnblogs.com/wanglan/p/8710963.html
Copyright © 2011-2022 走看看