git使用规范 - Go语言中文社区

git使用规范


Git操作文档

安装

  1. Git官网进行下载

  2. 按默认选项进行安装

  3. 安装完成后可以在开始菜单里找到"Git"->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

  4. 设置用户名和邮箱

    相当于“自报家门”,提交的时候让中控机知道是谁提交的

    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"
  1. 使用如下命令查看是否设置成功
  2. 使用如下命令查看是否设置成功
    $ git config --list

创建版本库

版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

  1. 创建版本库
    $ mkdir repository
    $ cd repository
    $ pwd
    /g/repository

如果使用的是windows系统,为了避免一些问题,请确保目录名(包括父目录)不包含中文。

  1. 通过如下命令,将这个目录修改为Git可以管理的仓库
    $ git init
    Initialized empty Git repository in G:/repository/.git/

可以发现该目录下出现了一个 .git 目录

如果没有看到 .git 目录,那可能是因为这个目录是隐藏的,使用 ls -ah 命令可以看见

Git基本流程

  1. 把文件添加到版本库
    所有版本控制系统只能跟踪文本文件的改动,但图片、视频这种二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能知道文件的大小变了,但无法知道具体修改了哪里。
    使用windows系统的时候要注意,不能用windows自带的记事本编辑任何文本文件,因为会产生编码问题,建议使用Notepad++来代替,并且把NotePad++的默认编码修改为UTF-8 without BOM

  2. 编写一个 readme.txt 文件,内容如下:

        Git is a version control system
        Git is free software
    
  3. 使用 git add 告诉Git,把文件提交到仓库 :

        $ git add readme.txt

执行完之后没有任何显示,就表示添加成功

  1. 用命令 git commit 告诉Git,把文件提交到仓库:
     $ git commit -m "A readme file"
    [master (root-commit) 2a00c8b] A readme file
    1 file changed, 2 insertions(+)
    create mode 100644 readme.txt   

其中的内容是 1 file changed ,一个文件被修改, 2 insertions(+) ,插入了两行内容

  1. 继续工作,修改 readme.txt 中的内容

    Git is a distributed version control system.

    Git is free software.

  2. 运行 git status 命令查看状态

$ git status

On branch master

Changes not staged for commit:

(use “git add …” to update what will be committed)

(use “git checkout – …” to discard changes in working directory)

modified: readme.txt

no changes added to commit (use “git add” and/or “git commit -a”)

上面的命令输出告诉我们, readme.txt 被修改过了,但是没有提交。

如果想查看提交的具体内容,可以使用 git diff 命令

    $ git diff
    diff --git a/readme.txt b/readme.txt
    index 09e8d4d..d5512c0 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -1,2 +1,2 @@
    -Git is a version control system
    +Git is a distributed control system
     Git is free software
     No newline at end of file
  1. 提交

$ git add readme.txt

依然没有任何输出,在提交之前使用 git status 查看状态

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

            modified:   readme.txt

git status 告诉我们,修改即将被提交的包括: readme.txt

提交

    $ git commit -m "add distributd"
    [master 8a282b1] add distributd
     1 file changed, 1 insertion(+), 1 deletion(-)

一种较为简单的方法是,在工作区对文件修改之后运行 git commit -am " " 命令 或 git commit -a -m " " 命令 来将 git add filename 和 git commit -m " "合二为一、一步到位。

  1. 使用 git status 查看状态
    $ git status
    On branch master
    nothing to commit, working tree clean   

当前没有药提交的需求,且工作目录是干净的

版本穿梭

  1. 再次修改 readme.txt 文件
    Git is a distributed control system
    Git is free software distributed under the GPL..
  1. 尝试提交
    $ git add readme.txt
    $ git commit -m "add GPL"
    [master 5573b4f] add GPL
     1 file changed, 1 insertion(+), 1 deletion(-)
  1. 查看历史提交记录

到目前我们已经提交了三次记录,可以利用 git log 来查看提交的历史记录

    $ git log
    commit 5573b4fd56ef86cc836924098d99f1968b81c531 (HEAD -> master)
    Author: xmh  <609692132@qq.com>
    Date:   Mon Mar 18 18:48:54 2019 +0800

        add GPL

    commit 8a282b123b2661f553fc7c49274cbc95ab4e4887
    Author: xmh  <609692132@qq.com>
    Date:   Mon Mar 18 18:32:19 2019 +0800

        add distributd

    commit 2a00c8b6367b225f472550e4e36905e0d4ef1ada
    Author: xmh  <609692132@qq.com>
    Date:   Mon Mar 18 16:50:05 2019 +0800

        A readme file

还有一种查看记录的方式是 git log --pretty=oneline

    $ git log --pretty=oneline
    5573b4fd56ef86cc836924098d99f1968b81c531 (HEAD -> master) add GPL
    8a282b123b2661f553fc7c49274cbc95ab4e4887 add distributd
    2a00c8b6367b225f472550e4e36905e0d4ef1ada A readme file

前面一大串的内容是 commit id (版本号),版本号用16进制表示,且每次都不同。

  1. HEAD
    在Git中,使用HEAD表示当前版本,用HEAD表示上一个版本,用HEAD^表示上上一个版本

  2. 正式开始版本穿梭

现在我们要把当前版本( add GPL )穿梭到上个版本( add distributd ),使用 git reset 命令

    $ git reset --hard HEAD^
    HEAD is now at 8a282b1 add distributd

git reset 命令有三个参数

  1. –mixed 参数: 这个参数可以省略,在直接输入 git reset commit_id 的时候即代表 git reset --mixed commit_id 。该参数可以回退版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件

  2. –soft 参数:不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件

  3. –hard 参数:清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换

使用 git log 查看提交历史记录,会发现因为回退了版本,所以少了最新的一条记录。

    $ git log
    commit 8a282b123b2661f553fc7c49274cbc95ab4e4887 (HEAD -> master)
    Author: xmh  <609692132@qq.com>
    Date:   Mon Mar 18 18:32:19 2019 +0800

        add distributd

    commit 2a00c8b6367b225f472550e4e36905e0d4ef1ada
    Author: xmh  <609692132@qq.com>
    Date:   Mon Mar 18 16:50:05 2019 +0800

        A readme file
  1. 撤销版本回退

其实相较于“撤销回退”来说,还是用“穿梭”更为合适,因为这步操作不是前进了一步之后向后退了一步,而是向前进一步之后再进一步,但是为了与上一步形成对比,暂用“撤销回退”。

1. 使用 commit id 撤销回退

这种方法只建立在当前 Git Bash 窗口没有关闭的情况下,我们可以通过上下翻看命令和命令的输出内容来找到被回退的版本( add GPL )的 commit id ,然后就可以指定回到原来的那个版本

    $ git reset --hard 5573b4
    HEAD is now at 5573b4f add GPL

再次查看提交历史

    $ git log
    commit 5573b4fd56ef86cc836924098d99f1968b81c531 (HEAD -> master)
    Author: xmh  <609692132@qq.com>
    Date:   Mon Mar 18 18:48:54 2019 +0800

        add GPL

    commit 8a282b123b2661f553fc7c49274cbc95ab4e4887
    Author: xmh  <609692132@qq.com>
    Date:   Mon Mar 18 18:32:19 2019 +0800

        add distributd

    commit 2a00c8b6367b225f472550e4e36905e0d4ef1ada
    Author: xmh  <609692132@qq.com>
    Date:   Mon Mar 18 16:50:05 2019 +0800

        A readme file

查看 readme.txt 中的内容,发现再次改变

    $ cat readme.txt
    Git is a distributed control system
    Git is free software distributed under the GPL..

2. 使用 git reflog 查看到 commit id 之后撤销版本回退

当关闭了Git Bash窗口之后,如果还想回退到 add GPL 版本的话,就必须找到 add GPL 的 commit id ,Git提供了一个 git reflog 来记录你的每次命令

    $ git reflog
    5573b4f (HEAD -> master) HEAD@{0}: reset: moving to 5573b4
    8a282b1 HEAD@{1}: reset: moving to HEAD^
    5573b4f (HEAD -> master) HEAD@{2}: commit: add GPL
    8a282b1 HEAD@{3}: commit: add distributd
    2a00c8b HEAD@{4}: commit (initial): A readme file

我们可以看到add GPL的 commit id 为5573b4

小结:

    1. HEAD指向的版本就是当前版本
    2. 穿梭前,用 git log 可以查看提交历史,以便确定要回退到哪个版本。
    3. 撤销回退时,用 git reflog 查看命令历史,以便确定要穿梭到的哪个版本。

工作区和暂存区

工作区

工作区就是你在电脑中看到的目录,比如我的 repository 文件夹就是工作区,

版本库

工作区有一个隐藏的目录 .git ,这个就是Git的版本库。

版本库中存了很多东西,其中最重要的就是称为 stage (或者叫 index )的暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向 master 的一个指针叫 HEAD 。

暂存区

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用 git add 把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用 git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个 master 分支,所以,现在 git commit 就是往 master 分支上提交更改。

其三者的关系如下图所示

在这里插入图片描述

  1. 首先在工作区中添加一个 LICENSE.txt 的文件
    查看状态
    $ git status
    On branch master
    Untracked files:
      (use "git add  <file>..." to include in what will be committed)

            LICENSE.txt

    nothing added to commit but untracked files present (use "git add" to track)

可以看到此时出现了一个未跟踪的(Untracked)的文件 LICENSE.txt

但此时的暂存区是空的

在这里插入图片描述

  1. 将 LICENSE.txt 添加到暂存区
    $ git add LICENSE.txt

查看状态

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

            new file:   LICENSE.txt

在这里插入图片描述

  1. 将 readme.txt 修改为如下内容
    Git is a distributed control system
    Git is free software distributed under the GPL..
    Git has a mutable index called stage.
  1. 查看状态
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD  <file>..." to unstage)

            new file:   LICENSE.txt

    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.txt

此时可以看到有两种分类:

  • “修改即将被提交”的文件: LICENSE.txt
  • “修改即将被分批提交”的文件: readme.txt

5.将 readme.txt 文件提交到暂存区

    $ git add readme.txt

查看状态

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

            new file:   LICENSE.txt
            modified:   readme.txt

可以看到这两个文件都被归类为“修改即将被提交”的文件,此时三者的状态也变为:

在这里插入图片描述

所以 git add 命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行 git commit 就可以一次性把暂存区的所有修改提交到分支。

  1. 提交到 master 分支
    $ git commit -m "To kown how stage works"
    [master 07c1400] To kown how stage works
     2 files changed, 3 insertions(+), 1 deletion(-)
     create mode 100644 LICENSE.txt

查看状态

    $ git status
    On branch master
    nothing to commit, working tree clean

提交之后,如果没有对工作区再进行修改的话,那么此时工作区就是干净的,而且于此同时,三者的状态也变为:

在这里插入图片描述

管理修改

在这个章节,我们首先只要知道,Git跟踪并管理的是修改,而非文件。

  1. 首先在 readme.txt 文件中添加末尾一行
    Git is a distributed control system
    Git is free software distributed under the GPL..
    Git has a mutable index called stage.
    Git tracks changes.
  1. 提交到暂存区
    $ git add readme.txt

查看状态

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

            modified:   readme.txt
  1. 再次修改 readme.txt 文件为以下内容:
    Git is a distributed control system
    Git is free software distributed under the GPL..
    Git has a mutable index called stage.
    Git tracks changes of files.
  1. 提交到 master 节点
    $ git commit -m "第二次修改未提交"
    [master dc74f03] 第二次修改未提交
     1 file changed, 2 insertions(+), 1 deletion(-)
  1. 查看状态
    $ 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.txt

    no changes added to commit (use "git add" and/or "git commit -a")

在以前,我们每次提交之后,工作区都是干净的,然而这次却提示我们 readme.txt 文件被修改,可以有两个选择,一个是添加到暂存区,另一个是撤销工作区的修改。

回顾一下我们此次操作:

第一次修改 -> git add -> 第二次修改 -> git commit

我们添加到 master 节点的,仅仅是被 git add 操作放到暂存区的内容,而非是 readme.txt 文件

所以这就是Git管理的只是修改的原因

小结:

    每次修改,如果不用git add到暂存区,那就不会加入到commit中。

撤销修改

此章节类似于版本穿梭,但不同的是,版本穿梭时仅利用 commit id 就可以在多个版本之间来回穿梭,撤销修改只能一步一步的回退,是真正意义上的回退。

未提交到暂存区

 在 readme.txt 文件的末尾随便添加一行,如果你发现这句话不合时宜,那么你可以选择手动删除,或者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.txt
 
     no changes added to commit (use "git add" and/or "git commit -a")
 ```

!!#ff0000 use "git checkout – … " to discard changes in working directory !!==> 使用"git checkout – "命令来放弃工作区中的修改

  1. 丢弃工作区的修改
        $ git checkout -- readme.txt

查看是否撤销

        $ cat readme.txt
        Git is a distributed control system
        Git is free software distributed under the GPL..
        Git has a mutable index called 

文档果然恢复了原样。

命令 git checkout – readme.txt 意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次 git commit 或 git add 时的状态。

  • 已提交到暂存区

    1. 将修改后的 readme.txt 文件提交到暂存区
    2. 查看状态
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD  <file>..." to unstage)

            modified:   readme.txt

Git同样告诉我们使用“git reset HEAD ”可以把暂存区的修改撤销掉,重新放回工作区

  1. 将暂存区的修改回退到工作区
    $ git reset HEAD readme.txt
    Unstaged changes after reset:
    M       readme.txt
  1. 丢弃工作区的修改
    $ git checkout -- readme.txt
  • 已提交到本地版本库
    提交到版本库之后就要利用版本穿梭,来进行修改。

  • 已提交到远程版本库
    无法再本地进行修改

删除文件

首先在工作区创建一个 test.txt 的文件,添加到工作区后再提交到版本库

为了模拟删除文件的场景,我们首先把工作区中的 test.txt 文件删除,此时将面临两个情况

查看一下状态

    $ 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提示我们:

  1. 可以使用"git add/rm "命令来删除版本库中的 test.txt 文件
  2. 可以使用"git checkout – "命令来撤销工作区的修改,也就是恢复 test.txt 文件

确实要删除test.txt文件

使用 git add/rm filename 命令

    $ git add test.txt
  1. 查看状态
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD  <file>..." to unstage)

            deleted:    test.txt

Git告诉我们,如果提交的话,就会删除 test.txt 文件

  1. 使用 git commit -m " " 来提交到版本库
    $ git commit -m "delete test.txt"
    [master ba751d5] delete test.txt
     1 file changed, 0 insertions(+), 0 deletions(-)
     delete mode 100644 test.txt

误删除test.txt文件

使用 git checkout – test.txt 命令就可以将被删除的 test.txt 文件恢复到工作区

git checkout – filename 命令就相当于将版本库中的内容同步到工作区

关于使用 git log --graph --oneline 命令时,所输出内容的括号中的信息,即下图红色框选择的部分

在这里插入图片描述
括号中的分支名表示这个分支停留在对应的commit_id,可以看到我们当前在dev分支下,如果我们切换到master分支:

在这里插入图片描述
可以看到mater分支仍然指向 919086c 提交点,而dev分支却不见了,这是因为dev分支超前master分支一个提交,所以自然看不到dev分支的状态

在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qqqqll3/article/details/90175122
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢