zoukankan      html  css  js  c++  java
  • Git学习笔记02 --git的工作流程、Git 工作区、暂存区和版本库、基本使用教程(add、commit、reset)

    1. git的工作流程

    一般工作流程如下:

    • 克隆 Git 资源作为工作目录。
    • 在克隆的资源上添加或修改文件。
    • 如果其他人修改了,你可以更新资源。
    • 在提交前查看修改。
    • 提交修改。
    • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

    下图展示了 Git 的工作流程:

    2. Git 工作区、暂存区和版本库

    我们先来理解下 Git 工作区、暂存区和版本库概念:

    • 工作区:就是你在电脑里能看到的目录。
    • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
    • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

    下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

    • 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。

    • 图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

    • 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。

    • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

    • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

    • 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

    • 当执行 git rm --cached <file> 命令时,会直接从暂存区删除文件,工作区则不做出改变。

    • 当执行 git checkout . 或者 git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。

    • 当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

    3.创建版本库

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

    所以创建一个版本库也非常简单,如下我是D盘 下 目录下新建一个lucky95版本库。

    pwd 命令是用于显示当前的目录。

    (1) 通过命令 git init 把这个目录变成git可以管理的仓库,如下:

    这时候你当前目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。如下:

    (2)把文件添加到版本库中。

    首先要明确下,所有的版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成 2kb,但是到底改了啥,版本控制也不知道。

    案例:

    <1>在版本库lucky95目录下新建一个记事本文件 readme.txt 内容如下:

     

    第一步:使用命令 git add readme.txt添加到暂存区里面去。如下:

    如果和上面一样,没有任何提示,说明已经添加成功了。

    第二步:用命令 git commit告诉Git,把文件提交到仓库。

    现在我们已经提交了一个readme.txt文件了,我们下面可以通过命令git status来查看是否还有文件未提交,如下:

    说明没有任何文件未提交,但是我现在继续来改下readme.txt内容,比如我在下面添加一行内容

    继续使用git status来查看下结果,如下:

    上面的命令告诉我们 readme.txt文件已被修改,但是未被提交的修改。注意看中间字的颜色,红色表明还没有添加到暂存区,如果是绿色就表明已经添加到了暂存区

    第三步:接下来我想看下readme.txt文件到底改了什么内容,如何查看呢?可以使用如下命令:

    git diff readme.txt 如下:

    如上可以看到,readme.txt文件内容从一行内容改成 二行 ,添加了一行下边一行的内容。

    4.版本回退

    如上,我们已经学会了修改文件,现在我继续对readme.txt文件进行修改,再增加一行

    内容如下:

    继续执行命令如下:

    现在我已经对readme.txt文件做了三次修改了,那么我现在想查看下历史记录,如何查呢?我们现在可以使用命令 git log 演示如下所示:

     git log命令显示从最近到最远的显示日志,我们可以看到最近四次提交,如果嫌上面显示的信息太多的话,我们可以使用命令 git log –pretty=oneline(千万注意,不是online,是oneline)

    如果想回退到上一个版本的命令如下操作:

     

    此时发现readme.txt回到了版本1

    可以通过如下命令即可获取到版本号:git reflog  演示如下:

    通过上面的显示我们可以知道,--添加了第三行的内容--的版本号是f809e85.我们现在可以命令

    git reset  –-hard beb1eb4来恢复了。演示如下:

     

    此时发现readme.txt回到了版本3

    5 删除文件

     假如我现在版本库lucky95目录添加一个文件888.txt,然后提交。如下:

    如上:一般情况下,可以直接在文件目录中把文件删了,或者使用如上rm命令:rm 666.txt ,如果我想彻底从版本库中删掉了此文件的话,可以再执行commit命令 提交掉,现在目录是这样的,

    参考文献:https://blog.csdn.net/zteenmozart/article/details/80459462

  • 相关阅读:
    POJ-1189 钉子和小球(动态规划)
    POJ-1191-棋盘分割(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
  • 原文地址:https://www.cnblogs.com/luckyplj/p/15148730.html
Copyright © 2011-2022 走看看