zoukankan      html  css  js  c++  java
  • github

    Git本地仓库

    原文:http://www.cnblogs.com/wilber2013/p/4189920.html

    Git基本概念

    在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的所有更新。

    现在我们已经知道什么是repository(缩写repo)了,假如我们现在建立一个仓库(repo),那么在建立仓库的这个目录中有一个“.git”的文件夹。这个文件夹非常重要,所有的版本信息,更新记录,以及Git进行仓库管理的相关信息全部保存在这个文件夹里面。所以,不要修改/删除其中的文件,以免造成数据的丢失。

    进一步的讲解请参考下面一张图,大概展示出了我们需要了解的基本知识。

     根据上面的图片,下面给出了每个部分的简要说明:

    • Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
    • WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
    • .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
    • Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
    • Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
    • Stash:是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。

     有了上面概念的了解,下面就开始在本地repo上进行Git操作了。

    创建仓库

    通过“Git Bash”命令行窗口进入到想要建立版本仓库的目录,通过“git init”就可以轻松的建立一个仓库。

    这时,我们的仓库中会自动的产生一个“.git”文件夹,这个就是我们前面提到的Git管理信息的目录。

    添加

    现在我们在仓库中新建一个“test.txt”的文本文件,内容如下。

    123
    123

    通过"git status"可以查看WorkSpace的状态,看到输出显示"test.txt"没有被Git跟踪,并且提示我们可以使用"git add <file>..."把该文件添加到待提交区(暂存区)。

    注意,如果添加到暂存区,这时的更新只是在WorkSpace中。

    使用"git add test.txt"或者"git add .",然后继续查看WorkSpace的状态。这时发现文件已经被放到暂存区。

    这时的更新已经从WorkSpace保存到Stage中。

    最后,我们就可以通过“git commit -m”来提交更新了。-m后面跟的是对commit的描述(message)。

    这时的更新已经从Stage保存到了Local Repo中。

    通过上面的操作,文件"test.txt"就成功的被添加到了仓库中。

    更新

    假设现在需要对"test.txt"进行更新,修改文件后,查看WorkSpace的状态,会发现提示文件有更新,但是更新只是在WorkSpace中,没有到暂存区中。

    莫语常言道知足,万事至终总是空。
    理想现实一线隔,心无旁骛脚踏实。 
    谁无暴风劲雨时,守得云开见月明。
    花开复见却飘零,残憾莫使今生留。

    同样,通过add、commit的操作,我们可以把文件的更新先放到暂存区,然后从暂存区提交到repo中。

    注意,只有被add到暂存区的更新才会被提交进入repo。提交前,如果对WorkSpace的文件进行修改,而没有被添加到暂存区,那么提交进repo中的只是暂存区的更新,WorkSpace修改的部分不会提交进repo中的。

     git diff

    "git diff"是个很有用,而且会经常用到的命令,用于显示WorkSpace中的文件和暂存区文件的差异。先将我们之前的test.txt文件中的内容改成纯数字然后提交到repo中,中文字符运行该命令会显示乱码。

    123
    123

    接下来修改成下面内容,我们通过"git diff"可以查看WorkSpace和Stage的diff情况,当我们把更新add到Stage中,diff就不会有任何输出了。

    123
    123
    
    456
    456

    当然,我们也可以把WorkSpace中的状态和repo中的状态进行diff,命令如下。

    git diff HEAD~n

    撤销更新

    根据前面对基本概念的了解,更新可能存在三个地方,WorkSpace中,Stage中和repo中。下面就分别介绍一下怎么撤销这些更新。

    撤销WorkSpace中的更新

    接着上面的例子,先将test.txt中的文本设置如下内容,并提交。

    abc
    abc

    然后将test.txt中的内容进行修改:

    abc
    123
    bca
    321

    我们可以使用"git checkout --<file>..."来撤销WorkSpace中的更新。执行test.txt中的文本会变成两行"abc"。

    注意:使用这种方法撤销更新的时候一定要慎重,因为通过这种方式撤销后,更新将没有办法再找回。

    撤销Stage中的更新

    由于上个步骤,我们将test.txt修改撤销了。这里再次修改为下面内容,并且使用了"git add"把这个更新提交到了暂存区。这时,"git status"的输出中提示我们可以通过"git reset HEAD <file>..."把暂存区的更新移出到WorkSpace中。

    如果想继续撤销WorkSpace中的更新,请参考上面一步。

    abc
    123
    cba
    321

    撤销repo中的更新

    介绍撤销repo中的更新之前,我们先看一下"git log"这个命令,通过这个命令我们可以查看commit的历史记录。

    撤销提交有两种方式:使用HEAD指针和使用commit id

    在Git中,有一个HEAD指针指向当前分支中最新的提交。当前版本,我们使用"HEAD^",那么再钱一个版本可以使用"HEAD^^",如果想回退到更早的提交,可以使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)

    git rest --hard HEAD^
    git rest --hard HEAD~1
    git rest --c2760c5512bc67a8b990c1da508d40cca623f23

    再次查看,发现最新的提交已经被撤销了,查看test.txt中的文件,发现内容又变成两行"abc"文本。

    那么问题就来了,我现在又想恢复被撤销的提交,当然Git是支持这样的操作。

    下面来看看"git reflog"这个命令。"git log"只是包括了当前分支中的commit记录,而"git reflog"中会记录这个仓库中所有的分支的所有更新记录,包括已经撤销的更新。

    有了这个,我们就可以恢复撤销操作。

    git reset --hard HEAD@{1}
    git reset --hard f752570

    再次查看,发现我们撤销的内容已经回来了。

    --hard和--soft

    前面在使用reset来撤销更新的时候,我们都是使用的"--head"选项,其实与之对应的还有一个"--soft"选项,区别如下:

    --head:撤销并删除相应的更新

    --soft:撤销相应的更新,把这些更新的内容放到Stage中

    删除文件

    在Git中,如果我们要删除一个文件,可以使用下面的命令,"git rm"相比"rm"只是多了一步,把这次删除的更新发到Stage中。

    rm <file>
    git rm <file>

    总结

    好文要顶 关注我 收藏该文

    厚积薄发
  • 相关阅读:
    轻量级数据库sqlite的使用
    Integer引发的思考
    css限制显示行数
    数据库 chapter 17 数据仓库与联机分析处理技术
    数据库 chapter 15 对象关系数据库系统
    数据库 chapter 16 XML数据库
    数据库 chapter 14 分布式数据库系统
    数据库 chapter 11 并发控制
    数据库 chapter 12 数据库管理系统
    数据库 chapter 13 数据库技术新发展
  • 原文地址:https://www.cnblogs.com/xinfengzi/p/5966769.html
Copyright © 2011-2022 走看看