zoukankan      html  css  js  c++  java
  • Git 单机版


    简介:

    Git 是一款开源的分布式版本控制系统,是当今最流行、先进的版本控制软件,没有之一。
    Git 是一个分布式的版本控制系统,相反 SVN 就是一个集中式的版本控制系统了。SVN 每修改完一个文件要提交到服务端进行保存,而 Git 在本地有一个完整的版本库。

    一、安装 Git

    1、Linux( CentOS )

    shell > yum -y install git

    ## 没错,已经安装完成了

    2、Windows( WIN7 )

    下载地址:https://github-windows.s3.amazonaws.com/GitHubSetup.exe
    > 双击图标,选择 install( 会自动下载程序包 )
    > 选择 skip ,如果你有 github 用户,也可以登陆哦
    > 点击左上角的 "+" ,添加自己的版本库,输入版本库名、选择版本库路径,最后点击创建
    > 然后就可以添加文件到版本库了,可以使用 Git Shell 命令行操作哟

    二、Git( CentOS )

    1、创建版本库

    shell > git config --global user.name "wang"
    shell > git config --global user.email "wang@163.com"
    shell > git config --global color.ui true

    ## 第一、二条是设置自己的用户名、邮件地址,分布式版本控制系统嘛,用来证明你是你。由于是全局配置,本地所有的版本库都是这个名,也可以单独为某个版本库设置( 这是必须设置的 )
    ## 第三条是智能颜色显示,输出的结果有颜色区分,看着方便、显着高大上,对就是这个意思

    shell > mkdir -p /git/gitdb ; cd /git/gitdb
    shell > git init
    Initialized empty Git repository in /git/gitdb/.git/
    shell > ls .git/
    branches config description HEAD hooks info objects refs

    ## 使用 git init 初始化版本库( 在哪个目录下执行,哪个目录就是版本库目录 )
    ## 这样就创建好了一个 gitdb 的版本库了,版本库的相关文件全保存在隐藏目录 .git 下,一般不要手动去修改里面的东西,否则会把版本库玩坏

    2、向版本库中添加文件

    ## 关于 Git 的操作,没有特殊说明情况下,操作目录都是 /git/gitdb/ 这里

    shell > head -5 /etc/passwd | tee passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    ## 把 /etc/passwd 文件中的前 5 行数据重定向到了 /git/gitdb/passwd 文件中,内容如上

    shell > git status
    # On branch master
    #
    # Initial commit
    #
    # Untracked files:
    # (use "git add <file>..." to include in what will be committed)
    #
    # passwd
    nothing added to commit but untracked files present (use "git add" to track)

    ## 这时通过 git status 指令可以看到,工作区有一个名为 passwd 的文件,还没有提交( 提交前要使用 git add <file> 指令将文件添加到暂存区 )
    ## 工作区:版本库目录即为工作区( 在版本库目录中创建一个文件,就是在工作区创建一个文件 )
    ## 暂存区:使用 git add 指令时,实际上就是把文件从工作区添加到暂存区的过程
    ## 分支:创建版本库时,git 会自动创建一个 master 分支,使用 git commit 指令时,实际上就是把暂存区的所有文件提交到 master 分支
    ## 所以这三者之间的关系是:工作区-->暂存区-->分支
    ## git add 可以多次添加、也可以一次添加多个文件到暂存区,git commit 会一次性把暂存区的所有修改提交到分支

    shell > git add passwd
    shell > git status
    # On branch master
    #
    # Initial commit
    #
    # Changes to be committed:
    # (use "git rm --cached <file>..." to unstage)
    #
    # new file: passwd
    #

    ## 添加完成后,发现暂存区有一个名为 passwd 的文件还没有提交( 可以使用 git rm --cached <file> 指令将暂存区的文件删除,注意:不是工作区的文件 )

    shell > git rm --cached passwd
    rm 'passwd'

    ## 删除后,你会发现:工作区的 passwd 文件还在,当使用 git status 指令时,状态又变回了没有 git add 时的状态

    shell > git add passwd
    shell > git commit passwd -m "one"
    git commit -m "one"
    [master (root-commit) 7af25e2] one
    1 files changed, 5 insertions(+), 0 deletions(-)
    create mode 100644 passwd

    ## 提交时,-m 参数用来做个标记,你可以标注一些有意思的东西,例如你做了什么修改之类的...

    shell > git status
    # On branch master
    nothing to commit (working directory clean)

    ## 这时使用 git status 指令发现工作区已经没有东西了( 提交完成 )

    3、恢复到上个版本或某个版本

    shell > sed -i 's/nologin/login/g' passwd
    shell > git status
    # On branch master
    # Changed but not updated:
    # (use "git add <file>..." to update what will be committed)
    # (use "git checkout -- <file>..." to discard changes in working directory)
    #
    # modified: passwd
    #
    no changes added to commit (use "git add" and/or "git commit -a")

    ## 由于把文件中 nologin 字段修改成了 login ,git status 发现 passwd 文件被修改了,但是还没有更新( git checkout -- <file> 待会说 )

    shell > git diff HEAD -- passwd
    diff --git a/passwd b/passwd
    index 03dab68..96635c1 100644
    --- a/passwd
    +++ b/passwd
    @@ -1,5 +1,5 @@
    root:x:0:0:root:/root:/bin/bash
    -bin:x:1:1:bin:/bin:/sbin/nologin
    -daemon:x:2:2:daemon:/sbin:/sbin/nologin
    -adm:x:3:4:adm:/var/adm:/sbin/nologin
    -lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    +bin:x:1:1:bin:/bin:/sbin/login
    +daemon:x:2:2:daemon:/sbin:/sbin/login
    +adm:x:3:4:adm:/var/adm:/sbin/login
    +lp:x:4:7:lp:/var/spool/lpd:/sbin/login

    ## 可以使用 git diff 指令查看工作区跟版本库( 分支 )的文件( 改动 )差异( HEAD 代表分支中( 版本库 )当前版本,即最新版本 )

    shell > git add passwd
    shell > git commit -m "two"
    [master 6fd5803] two
    1 files changed, 4 insertions(+), 4 deletions(-)
    shell > git status
    # On branch master
    nothing to commit (working directory clean)

    ## 将修改后的文件提交到了版本库中,搞了个标记叫 two ,呃,代表第二次提交
    ## 提交完成后,工作区就没有东西了

    shell > sed -i 's/bash/python/' passwd
    shell > git add passwd
    shell > git commit -m "three"
    [master 4cba143] three
    1 files changed, 1 insertions(+), 1 deletions(-)
    shell > git status
    # On branch master
    nothing to commit (working directory clean)
    shell > git diff HEAD -- passwd

    ## 第三次提交完成,使用 git diff 指令发现版本库中最新版本跟工作区文件完全相同

    shell > git log
    git log
    commit 4cba14306c482080f442043b33f1dd640352a3f9
    Author: wang <wang@163.com>
    Date: Tue Jul 21 19:51:30 2015 +0200
    
    three
    
    commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
    Author: wang <wang@163.com>
    Date: Tue Jul 21 19:43:17 2015 +0200
    
    two
    
    commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
    Author: wang <wang@163.com>
    Date: Tue Jul 21 18:54:41 2015 +0200
    
    one

    ## 通过 git log 指令可以清楚的看到总共有三次提交,标记为 one 、two 、three ,现在想回到上次版本( two )怎么办 ?

    shell > git reset --hard HEAD^
    HEAD is now at 6fd5803 two
    shell > cat passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/login
    daemon:x:2:2:daemon:/sbin:/sbin/login
    adm:x:3:4:adm:/var/adm:/sbin/login
    lp:x:4:7:lp:/var/spool/lpd:/sbin/login

    ## 使用 git reset 指令,HEAD^ 代表上个版本,HEAD^^ 代表上两个版本,现在已经回到了 two 版本了( three 版本的 bash 变为 python 已经又恢复成 bash 了 )

    shell > git log
    commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
    Author: wang <wang@163.com>
    Date: Tue Jul 21 19:43:17 2015 +0200
    
    two
    
    commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
    Author: wang <wang@163.com>
    Date: Tue Jul 21 18:54:41 2015 +0200
    
    one

    ## 现在就剩两个版本了,最上面 two 为最新版本,即当前版本
    ## 恢复到某个版本,假设有好多好多个版本,使用 HEAD^^^^ 或 HEAD~[number] 的方式就很不方便了( 都要数 )
    ## 既然 HEAD 代表版本号,那么恢复时直接输入版本号不就可以了?非常方便,git log 指令输出的 commit 字段( 7af25e23a89ba16e5ff14a8da305542bc9cc6062 )就是版本号

    shell > git reset --hard 7af25e2
    HEAD is now at 7af25e2 one
    shell > cat passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    ## 使用 git reset 指令时,只需输出版本号的前几位即可,可以看到已经恢复到了第一版,文件内容也变回了最初的状态

    shell > git log
    commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
    Author: wang <wang@163.com>
    Date: Tue Jul 21 18:54:41 2015 +0200
    
    one

    ## 这时使用 git log 指令发现只有第一次提交的版本了,那么现在想回到 two 或 three 版本该怎么办?( 版本号没有了 )

    shell > git reflog
    7af25e2 HEAD@{0}: 7af25e2: updating HEAD
    6fd5803 HEAD@{1}: HEAD^: updating HEAD
    4cba143 HEAD@{2}: commit: three
    6fd5803 HEAD@{3}: commit: two
    shell > git reset --hard 4cba143
    HEAD is now at 4cba143 three

    ## 使用 git reflog 指令可以看到操作记录,第一列就是我们想要的版本号,再次使用 git reset 指令恢复即可

    shell > cat passwd
    root:x:0:0:root:/root:/bin/python
    bin:x:1:1:bin:/bin:/sbin/login
    daemon:x:2:2:daemon:/sbin:/sbin/login
    adm:x:3:4:adm:/var/adm:/sbin/login
    lp:x:4:7:lp:/var/spool/lpd:/sbin/login
    shell > git log
    commit 4cba14306c482080f442043b33f1dd640352a3f9
    Author: wang <wang@163.com>
    Date: Tue Jul 21 19:51:30 2015 +0200
    
    three
    
    commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
    Author: wang <wang@163.com>
    Date: Tue Jul 21 19:43:17 2015 +0200
    
    two
    
    commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
    Author: wang <wang@163.com>
    Date: Tue Jul 21 18:54:41 2015 +0200
    
    one

    ## 文件内容、版本信息都回来了,现在的版本恢复到了 three 状态

    4、git checkout -- <file> :还记得这个不 ?

    shell > sed -i '1d' passwd
    shell > git status
    # On branch master
    # Changed but not updated:
    # (use "git add <file>..." to update what will be committed)
    # (use "git checkout -- <file>..." to discard changes in working directory)
    #
    # modified: passwd
    #
    no changes added to commit (use "git add" and/or "git commit -a")

    ## 当修改了工作区文件内容后,使用 git status 指令可以看到这样的提示( git checkout -- <file> 可以撤销工作区文件的修改 )

    shell > cat passwd
    bin:x:1:1:bin:/bin:/sbin/login
    daemon:x:2:2:daemon:/sbin:/sbin/login
    adm:x:3:4:adm:/var/adm:/sbin/login
    lp:x:4:7:lp:/var/spool/lpd:/sbin/login
    
    shell > git checkout -- passwd

    ## 使用 git checkout 指令撤销工作区文件的改动( 恢复到跟版本库一样的状态,就是刚才所有的修改全部被撤回 )

    shell > sed -i '1d' passwd
    shell > git add passwd
    shell > sed -i '1d' passwd
    shell > git status
    shell > git status
    # On branch master
    # Changes to be committed:
    # (use "git reset HEAD <file>..." to unstage)
    #
    # modified: passwd
    #
    # Changed but not updated:
    # (use "git add <file>..." to update what will be committed)
    # (use "git checkout -- <file>..." to discard changes in working directory)
    #
    # modified: passwd
    #

    ## 现在是一个什么情况呢 ?首先删除了文件第一行,执行了 git add 指令( 文件的修改被添加到了暂存区 ),接着又删除了一次,那么现在执行 git checkout 指令文件被恢复成什么样 ?

    shell > git checkout -- passwd

    ## 实践证明:文件被恢复到了暂存区的状态,也就是删除一次的状态

    shell > git status
    # On branch master
    # Changes to be committed:
    # (use "git reset HEAD <file>..." to unstage)
    #
    # modified: passwd
    #

    ## 这是暂存区的状态,怎么恢复暂存区的状态,也就是把第一次的删除也撤销( 注意:这已经 git add 了 )

    shell > git reset HEAD passwd
    Unstaged changes after reset:
    M passwd

    ## 还记得 git reset 这个指令不,没错用来恢复文件到上个版本的,也可以用来将暂存区的改动回退到工作区

    shell > git status
    # On branch master
    # Changed but not updated:
    # (use "git add <file>..." to update what will be committed)
    # (use "git checkout -- <file>..." to discard changes in working directory)
    #
    # modified: passwd
    #
    no changes added to commit (use "git add" and/or "git commit -a")

    ## 再次查看状态,提示工作区有改动,可以使用 git checkout -- <file> 将工作区的改动也撤销

    ## git reset 将文件回退到上一次版本 / 将暂存区的改动回退到工作区
    ## git checkout 将工作区的改动撤销 / 将工作区的改动回退到暂存区

    5、删除文件

    shell > git rm passwd
    rm 'passwd'
    shell > git commit -m "delete passwd"
    [master 3be8d7a] delete passwd
    1 files changed, 0 insertions(+), 5 deletions(-)
    delete mode 100644 passwd

    ## 使用 git rm 指令将版本库中的文件删除,然后提交删除( 文件就被删除了,版本库目录下也没有了 )

    shell > git log
    commit 3be8d7a3ade6f8947135843832bb6cfa075638a4
    Author: wang <wang@163.com>
    Date: Wed Jul 22 13:18:23 2015 +0200
    
    delete passwd
    
    commit 4cba14306c482080f442043b33f1dd640352a3f9
    Author: wang <wang@163.com>
    Date: Tue Jul 21 19:51:30 2015 +0200
    
    three
    
    commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
    Author: wang <wang@163.com>
    Date: Tue Jul 21 19:43:17 2015 +0200
    
    two
    
    commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
    Author: wang <wang@163.com>
    Date: Tue Jul 21 18:54:41 2015 +0200
    
    one
    
    shell > git reset --hard 4cba14
    HEAD is now at 4cba143 three

    ## ... 好不容易删除了,结果又给恢复了 ^_^ ,不要高兴太早,如果修改完文件,没有提交就删除了文件,那么刚才的修改就真的丢失了..

    shell > rm -rf passwd
    shell > git reset --hard 4cba14
    HEAD is now at 4cba143 three

    ## 是不是再也不用担心误删除文件了 ^_^ ( 单机情况下你别物理磁盘爆炸了,那就真的啥也没有了 )
    ## 参考教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

  • 相关阅读:
    插件式编程之使用反射分离MDI的父窗口和子窗口
    我总结的三层结构之一:Model示例
    我总结的三层结构之二:IDAL示例
    02.08 代理模式
    02.09 装饰模式
    块元素、行元素容纳规则
    CSS继承选择器与包含选择器的比较
    02.07 适配器模式
    02.10 桥模式
    匿名方法
  • 原文地址:https://www.cnblogs.com/wangxiaoqiangs/p/5336347.html
Copyright © 2011-2022 走看看