Git--工作区、暂存区、版本库、远程仓库

参考:

https://www.cnblogs.com/qdhxhz/p/9757390.html

https://blog.csdn.net/weixin_41282486/article/details/79734793

【Git】(1)---工作区、暂存区、版本库、远程仓库

一、概念

   1、四个工作区域

Git本地有四个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)、git仓库(Remote Directory)。文件在这四个区域之间的转换关系如下:

    Workspace: 工作区,就是你平时存放项目代码的地方

Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息

    Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

        Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

   2、工作流程

git的工作流程一般是这样的:

1、在工作目录中添加、修改文件;

2、将需要进行版本管理的文件放入暂存区域;

3、将暂存区域的文件提交到git仓库。

因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

   3、文件的四种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用

SHA-1算法计算文件的校验和。

Untracked:   未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.

 Unmodify:   文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified.

                   如果使用git rm移出版本库, 则成为Untracked文件

  Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过,

                返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改

    Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存,

               文件状态为Modified

 下面的图很好的解释了这四种状态的转变:

新建文件--->Untracked

使用add命令将新建的文件加入到暂存区--->Staged

使用commit命令将暂存区的文件提交到本地仓库--->Unmodified

如果对Unmodified状态的文件进行修改---> modified

如果对Unmodified状态的文件进行remove操作--->Untracked

二、四个区域常用命令

   1、新建代码库

复制代码
# 在当前目录新建一个Git代码库
 git init
# 新建一个目录,将其初始化为Git代码库
git init [project-name]
# 下载一个项目和它的整个代码历史
git clone [url]
复制代码

   2、查看文件状态

#查看指定文件状态
git status [filename]
#查看所有文件状态
git status

    3、工作区<-->暂存区

复制代码
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的所有文件到暂存区
git add .
#当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用(⚠️)
git rm file_path
#当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 这个时候直接push那边这个文件就没有,如果push之前重新add那么还是会有。
git rm --cached file_path
#直接加文件名   从暂存区将文件恢复到工作区,如果工作区已经有该文件,则会选择覆盖
#加了【分支名】 +文件名  则表示从分支名为所写的分支名中拉取文件 并覆盖工作区里的文件
git checkout
复制代码

    4、工作区<-->资源库(版本库)

复制代码
#将暂存区-->资源库(版本库)
git commit -m '该次提交说明'
#如果出现:将不必要的文件commit 或者 上次提交觉得是错的  或者 不想改变暂存区内容,只是想调整提交的信息
#移除不必要的添加到暂存区的文件
git reset HEAD 文件名
#去掉上一次的提交(会直接变成add之前状态)   
git reset HEAD^ 
#去掉上一次的提交(变成add之后,commit之前状态) 
git reset --soft  HEAD^ 
复制代码

    5、远程操作

# 取回远程仓库的变化,并与本地分支合并
git pull
# 上传本地指定分支到远程仓库
git push

   6、其它常用命令

复制代码
# 显示当前的Git配置
git config --list
# 编辑Git配置文件
git config -e [--global]
#初次commit之前,需要配置用户邮箱及用户名,使用以下命令:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
#调出Git的帮助文档
git --help
#查看某个具体命令的帮助文档
git +命令 --help
#查看git的版本
git --version
复制代码

参考

一个小时学会Git

工作区、暂存区、仓库三者关系

区分三者关系

       Git最让你迷惑的无非是它里面的各种概念了,如果是刚开始接触Git希望看完本篇介绍之后有一个清晰的认识,笔者认识也有限这里只说说个人对使用Git的感受,说一下它里面的几个最常用的概念的理解。

       在初始化git版本库之后会生成一个隐藏的文件 .git ,可以将该文件理解为git的版本库 repository,而我们自己建立的项目文件夹即工作区 working directory ,在.git 文件夹里面还有很多文件,其中有一个index 文件 就是暂存区也可以叫做 stage ,git还为我们自动生成了一个分支master以及指向该分支的指针head ,如下图   

       

       从图中可以看出来respository包括分支master和stage, working diretory 可以理解为我们打开开发环境如eclipse,里面的内容即工作区的内容,在工作区里面有的代码以及配置文件等我们需要提交到版本库里面,最终是到了分支master上面,暂存区只是一个临时保存修改文件的地方。

       实例讲解

       平时我们使用的命令git add file1 是把文件从工作区提交到暂存区,git commit -m "prompty" file1 是把文件从暂存区提交到了分支master下面,这里因为只有一个分支master,就提交到master上了,下面让我们再来结合具体例子来说明一下。

       我们修改一下tgb.txt文件增加一行 "l love you" ,并新建一个文件 test1.txt,现在还没有执行git add命令,这种修改都还停留在工作区内,用git status查看状态,如图

      

       上图表明修改并没有在暂存区里面,当我们执行git add test1.txt ,git add tgb.txt后,再来看一下状态

        

      这两个文件被添加到了暂存区,但是还没有提交,当执行git commit -m "tijiao" 后文件即从暂存区到了master分支上面,如图将看不到暂存区里面有什么内容。

     

      Git管理的是添加到暂存区里面的修改,包括增删改等等都算是可以跟踪的文件变动,也可以说git只管理我们变动的部分变动的我们才往暂存区提交,这也是git比其他版本系统设计优秀的一点,以后,会详细说一下各个版本系统管理文件是如何管理的,他们的设计思想是什么。

       通过三个命令理解

      下面还有一个需要注意的git diff 命令的差异:

  git diff 比较的是工作区和暂存区的差别
  git diff --cached 比较的是暂存区和版本库的差别
  git diff HEAD 可以查看工作区和版本库的差别

      通过一个添加文件既可以明显看出他们之间区别,不过这里有一个前提是已经提交到暂存区的文件修改的时候才可以看出明显区别,这也是以为啥git只能跟着提交到暂存区的文件,如果只是在工作区新建一个文件,那么输入这三个命令都没有结果为空白。

      我们继续修改tgb.txt,在文件末尾添加  we are good boy.

      分别输入三个命令,效果为:

      

      从图中可以看出,工作区与暂存区、工作区与版本库都有变化,而版本库与暂存区并没有变化。进一步执行git add tgb.txt 

        

      执行git add tgb.txt之后发现git diff没有输出内容,表明工作区与暂存区已经同步,暂存区与版本库、版本库与工作区没有同步。最后一步执行git commit 

         

       当执行完git commit后,三个命令都没有输出结果,表明我们修改的文件已经被同步的版本库,已经被版本库管理起来了。

总结:

       版本库管理文件会很方便尤其是代码,等好多的命令熟了之后也会觉得并不是那么难用,主要使用的时候觉得git反应比较快,而且速度还可以,现在很多人都在window开发而喜欢具有界面的版本工具软件,而不去学习git命令,学习一些git 命令还是很有用的,假如让你去linux上面开发或者在linux系统上面管理代码,你就会完全束手无策不懂原理也不懂命令,需要从新学习从新认识git。

       可以说各种命令是git的根本,学习了命令无论哪一个界面管理工作一看也就会了,现在有好多的git可视化工具,不如学几个命令,况且再多的界面底层也是调用这么多的命令来实现的,有了界面就让我们变懒了,降低了开发者的水平,提高开发效率的同时也失去了更多的学习、研究机会。

原文地址:https://www.cnblogs.com/xuwc/p/14057966.html