git

作者: Tony_Yu | 来源:发表于2017-06-04 21:21 被阅读0次

    git命令

    git介绍

    分布式版本控制系统。

    git版本库操作

    1. 创建git仓库
      在C:\github\创建目录helloworld,进入该目录C:\github\helloworld,打开git bash,执行以下命令
    $ git init
    Initialized empty Git repository in C:/github/helloworld/.git/
    

    会发现C:\github\helloworld目录下多了一个.git文件夹

    1. git仓库添加文件
    $ touch README.md
    $ vim README.md
    $ git add README.md
    
    1. git提交文件到仓库
     git commit -m "wrote a readme file"
    
    1. 修改文件,查看git仓库状态以及文件修改状态
      更改README.md文件内容,查看git仓库状态
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   README.md
    

    git status告诉我们将要提交的仓库在工作区和暂存区(工作区和暂存区下面介绍)做了哪些修改
    在git提交文件之前,我们忘记了文件做了什么修改,可以先查看下文件的修改情况.

    $ git diff README.md
    diff --git a/README.md b/README.md
    index b80c463..8589d53 100644
    --- a/README.md
    +++ b/README.md
    @@ -1 +1,7 @@
     学习git的Java 例子
    +1、初始化git 仓库
    +git init
    +2、添加文件到git仓库
    +git add file1 file2 ...
    +3、提交修改到git仓库
    +git commit -m "提交变更到git"
    
    1. 再次提交文件
      提交新增的文件和修改过的文件,都需要先使用git add指令把文件添加到git仓库
    $ git add README.md
    $ git commit -m "修改README.md"
    
    //向仓库添加所有改动
    git add -A
    //向仓库添加所有新增和更改的文件
    git add .
    git add *
    //添加修改和删除,但是不包括新建文件
    git add -u .
    

    小结

    • [x] git init初始化git仓库
    • [x] git add -A 添加文件(新增/变更/删除)
    • [x] git commit提交文件到仓库

    git版本控制

    git版本回退

    1. git log查看仓库提交历史
    $ git log
    commit 4fcf873881ab2b8b5eb03cbfef1d641b632eb289
    Author: jjqiubj@cn.ibm.com <jjqiubj@cn.ibm.com>
    Date:   Tue May 9 13:22:10 2017 +0800
    
        test delete
    
    commit 40033016fc902101e4ce27ee7eb19709bee3f016
    Author: jjqiubj@cn.ibm.com <jjqiubj@cn.ibm.com>
    Date:   Tue May 9 13:16:11 2017 +0800
    
        add test.txt
    
    commit 8010ee0ba5f6f130bcc3dee1956b58eb1617f674
    Author: jjqiubj@cn.ibm.com <jjqiubj@cn.ibm.com>
    Date:   Mon May 8 15:59:46 2017 +0800
    
        修改README.md
    
    commit bae79353290525e4fa3607e33666b5fbb09eff60
    Author: jjqiubj@cn.ibm.com <jjqiubj@cn.ibm.com>
    Date:   Mon May 8 15:42:37 2017 +0800
    
        wrote a readme file
    
    

    git log命令显示从最近到最远的提交日志。Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示
    2.git reset版本回退
    回退到README.md第一次修改提交的地方

     git reset --hard bae79353290525e4fa3607e33666b5fbb09eff60
    HEAD is now at bae7935 wrote a readme file
    $ git log
    commit bae79353290525e4fa3607e33666b5fbb09eff60
    Author: jjqiubj@cn.ibm.com <jjqiubj@cn.ibm.com>
    Date:   Mon May 8 15:42:37 2017 +0800
    
        wrote a readme file
    

    回退后在使用git log查看记录,只会看到"第一提交"到"回退版本"之间的log
    3.git reflog查看命令历史,帮助版本回退到“未来”
    如果先想回退到“回退版本”到“最新提交”之间的版本,可以使用reflog获取到所有的commit id

    $ git reflog
    8010ee0 HEAD@{0}: reset: moving to 8010ee0ba5f6f130bcc3dee1956b58eb1617f674
    bae7935 HEAD@{1}: reset: moving to bae79353290525e4fa3607e33666b5fbb09eff60
    17f7439 HEAD@{2}: commit: delete
    43b1130 HEAD@{3}: commit: add
    4fcf873 HEAD@{4}: commit: test delete
    4003301 HEAD@{5}: commit: add test.txt
    8010ee0 HEAD@{6}: commit: 修改README.md
    bae7935 HEAD@{7}: commit (initial): wrote a readme file
    $ git reset --hard 8010ee0
    

    总结

    • [x] git log查看提交历史
    • [x] git reset --hard commit-id 版本回退
    • [x] git reflog查看git命令执行历史

    git工作区和暂存区

    1. 工作区
      工作区就是git项目的目录,比如C:\github\helloworld
    2. 版本库
      工作区有个目录.git,这个不算是工作区,是Git的版本库。
      版本库中存放的有暂存区stage,git为我们创建的第一个分支master,以及指向master的指针HEAD


      git初始化项目
    3. 暂存区和工作区

    git代码提交分为两步:第一步,git add,这个步骤就是把文件提交到暂存区;第二步,git commit,这个步骤就是把暂存区的所有内容提交到当前分支。
    eg:

    • git项目中修改README.md,添加一个新的文件
    • 查看仓库当前状态
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   README.md
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
            LICENSE
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    • 执行git add
    $ git add .
    
    qiujiaojiao@ADMINIB-39ARTF6 MINGW64 /c/github/helloworld (master)
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            new file:   LICENSE
            modified:   README.md
    

    执行完git add,变更被保存在git 暂存区,这个时候git项目的文件结构如下:

    git add项目结构
    执行完git commit,暂存区的内容就被提交到当前分支,这个时候的git项目的文件结构如下:
    git commit后项目结构
    小结
    • [x] git先将代码添加到暂存区,然后才提交到当前分支。git的有个HEAD指针指向当前分支

    git变更管理

    1. 撤销修改
    • 工作区修改了,没有add到暂存区:git checkout --
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   README.md
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    qiujiaojiao@ADMINIB-39ARTF6 MINGW64 /c/github/helloworld (master)
    $ git checkout -- README.md
    
    
    • 工作区修改了,已经添加到暂存区

    eg: 修改已经在暂存区了

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            modified:   README.md
    
    

    撤销暂存区变更

    $ git reset HEAD README.md
    Unstaged changes after reset:
    M       README.md
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   README.md
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    

    撤销工作区修改

    $ git checkout -- README.md
    
    qiujiaojiao@ADMINIB-39ARTF6 MINGW64 /c/github/helloworld (master)
    $ git status
    On branch master
    nothing to commit, working directory clean
    
    

    2.删除

    • 工作区删除了,希望版本库也删除
      eg: 工作区当前已经处于删除状态
    $ git status
    On branch master
    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:    test.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    

    更新删除到版本库

    $ git rm test.txt 
    rm 'test.txt'
    $ git commit -m "delete modify"
    [master 4bc4820] delete modify
     1 file changed, 0 insertions(+), 0 deletions(-)
     delete mode 100644 test.txt
    
    qiujiaojiao@ADMINIB-39ARTF6 MINGW64 /c/github/helloworld (master)
    $ git status
    On branch master
    nothing to commit, working directory clean
    
    
    • 工作区删除了,但是不希望版本库删除
    $ git checkout -- test.txt
    
    qiujiaojiao@ADMINIB-39ARTF6 MINGW64 /c/github/helloworld (master)
    $ git status
    On branch master
    nothing to commit, working directory clean
    
    

    总结

    • [x] 工作区删除,希望版本库删除:(1)git rm ${file} (2) git commit -m
    • [x] 工作区误删除,恢复工作区: git checkout -- ${file}

    git远程仓库

    可以自己搭建一个git服务器,做为git远程仓库的服务器。也可以使用官网github。本文以官网GitHub为例

    添加远程仓库

    1. 配置GitHub的SSH Key
    $ ssh-keygen -t rsa -C "henu_qjj@sina.cn"
    #根据提示输入回车键即可
    
    1. 把生成的公钥文拷贝到GitHub上
      GitHub官网注册->登录GitHub->Settings->SSH and GPG keys->New SSH Key
      id_rsa.pub的内容拷贝上去,这样你的这台pc就可以向GitHub推送内容了。
    2. GitHub上创建远程仓库
      登录GitHub->New repository,创建一个新的远程仓库
    3. 本地仓库跟远程仓库关联
      根据GitHub创建仓库后的提示,把本地仓库和远程关联起来。
    $ git remote add origin https://github.com/${GitHub-username}/helloworld.git
    

    提交本地库内容到远程库

    git push -u origin master
    

    总结

    • [x] 本地仓库跟远程仓库关联:
      git remote add origin https://github.com/${GitHub-username}/helloworld.git
    • [x] 第一次推送本地所有内容到远程仓库
      git push -u origin master

    从远程仓库克隆

    1. 在GitHub创建远程仓库
    2. 下载远程仓库

    GitHub支持两种方式的下载

    //使用git协议,使用ssh key校验,git push不需要输入用户名和密码
    $ git clone git@github.com:qiuyu2014/gitrepository.git
    

    或者

    //使用https协议,git push 代码的时候需要输入用户名和密码
    $ git clone https://github.com/qiuyu2014/gitrepository.git
    

    git 支持多种协议:地传输,SSH 协议,Git 协议和 HTTP 协议等,Reference Git协议
    总结

    • [x] git关联远程仓库:(1)git remote add origin https://github.com/${GitHub-username}/${git-project}.git (2)git push -u origin master
    • [x] git从远程仓库下载代码:git clone

    git分支管理

    原理

    master:指向master分支最新提交的指针
    dev:指向dev分支的最新提交的指针
    HEAD:当前分支最新提交的指针,例如:如果当前分支是master,则指向master指针

    1. 刚开始git项目,是一条直线,master指向最新提交HEAD指向当前分支的最新提交


    2. master分支每次提交,master和HEAD都会向前移动


    3. 创建dev分支


    4. 现在切换到dev分支
      在dev分支下,修改项目,提交变更
    5. dev分支合并到master分支
      直接修改master指针,指向dev的最新提交就可以了。


    分支基本命令使用例子

    1. 创建新的分支dev
    $ git branch dev
    
    1. 切换到dev分支
    $ git checkout dev
    Switched to branch 'dev'
    
    1. 查看当前分支
    $ git branch
    * dev
      master
    

    4.修改dev分支内容

    $ git status
    On branch dev
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   README.md
    $ git add README.md
    $ git commit -m "分支管理"
    [dev b182941] 分支管理
     1 file changed, 1 insertion(+)
    

    5.切换master

    $ git checkout master
    

    发现master分支上,看不到dev修改提交的内容
    6.合并分支
    git merge 合并指定分支到当前分支

    $ git merge dev
    Updating 28e754e..b182941
    Fast-forward
     README.md | 1 +
     1 file changed, 1 insertion(+)
    

    Fast-forward信息,是指这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
    git merge 合并指定分支到当前分支
    7.删除dev分支

    $ git branch -d dev
    Deleted branch dev (was b182941).
    

    总结

    • [x] 查看分支:git branch
    • [x] 创建分支:git branch ${branch-name}
    • [x] 切换分支:git checkout ${branch-name}
    • [x] 创建并切换分支:git checkout -b ${branch-name}
    • [x] 合并某分支到当前分支:git merge ${branch-name}
    • [x] 删除分支:git branch -d ${branch-name}

    冲突解决

    1. 创建并切换到dev分支
    $ git checkout -b dev
    //修改README.md,添加以下内容
    四 git冲突解决:dev分支内容
    
    1. 提交dev修改
    $ git add README.md
    $ git commit -m "冲突解决:dev"
    
    1. master分支修改
    $ git checkout master
    //修改README.md,添加以下内容
    四 git冲突解决:master分支内容
    $ git add README.md
    $ git commit -m "冲突解决:master"
    

    当前dev,master以及HEAD指针如下图所示:


    1. 合并dev到master分支
    $ git merge dev
    Auto-merging README.md
    CONFLICT (content): Merge conflict in README.md
    Automatic merge failed; fix conflicts and then commit the result.
    

    5.解决冲突,重新提交
    查看master分支的README.md文件,冲突内容如下

    <<<<<<< HEAD
    四 git分支解决:master
    =======
    四 git冲突解决:dev分支内容
    >>>>>>> dev
    
    

    Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:

    四 git分支解决:master
    四 git冲突解决:dev分支内容
    

    提交master解决冲突后的修改

    $ git add README.md
    $ git commit -m "冲突解决"
    

    现在master和dev的情况如下图:



    查看master分支合并情况

    git log --graph --pretty=oneline --abbrev-commit
    

    总结

    • [x] git merge 会把要合并的分支和当前代码合并到一起,会列出冲突
    • [x] 合并后的冲突需手动解决,然后提交代码
    • [x] git log --graph可以查看合并图

    gitlab安装配置

    Reference:

    https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/

    https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/

    1. 安装gitlab
      本文使用的是ubuntu14.04,其他操作系统请参考Reference给出的链接。
    // 首先信任 GitLab 的 GPG 公钥:
    root@kvm-009864:~# curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
    //配置软件源
    vim /etc/apt/sources.list.d/gitlab-ce.list
    deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu trusty main
    //安装gitlab-ce
    sudo apt-get update
    sudo apt-get install gitlab-ce
    
    1. 启动gitlab
    //配置并启动
    sudo gitlab-ctl reconfigure
    

    在浏览器输入http://${ip},第一次登陆会让更改密码,用户名是root。
    gitlab的配置文件/etc/gitlab/gitlab.rb,如果要修改gitlab的配置,修改该文件相应的配置即可,然后执行sudo gitlab-ctl reconfigure 就可以重新加载配置,并启动gitlab

    相关文章

      网友评论

          本文标题:git

          本文链接:https://www.haomeiwen.com/subject/tmmvfxtx.html