git的理解

117 阅读3分钟

git

0.需要注意的点

  1. 基于git管理来看,工作区,暂存区,版本仓库实质上是管理的修改,暂存和提交的差异记录。"不能说提交后暂存区就没了",这比较容易引起偏差

  2. 廖雪峰讲的概念有误

    stage(暂存区) 并不是 working directory(工作区)和 HEAD(版本库) 之间的 临时枢纽,不能按照 "内存"、"购物车" 来理解 stage,否则你会很难理解 git diff、git diff --staged

    stage 中拥有着 和 working directory 中一模一样 的 目录结构、文件内容

  3. 当从版本库或暂存区回退到工作区时,工作区新增的文件(也就是版本库和暂存区没有的文件)不会被删除。,这点很重要。

1.修改

git add 实际上是让工作区的内容同步到暂存区

git commit 实际上就是把暂存区的内容同步到版本库

git checkout <file_name> 其实就是让暂存区同步到工作区

git reset <commit> 其实就是让版本仓库的内容同步到暂存区

git reset --hard <commit> 其实是让版本仓库的内容同步到暂存区和工作区,注意,这个时候工作区新增的文件不会被删除

1.1reset

git reset --soft HEAD~ 只是将版本仓库的tree的指针指向HEAD的父节点,而不会改变暂存区和工作区

git reset --mixed HEAD~ 在版本库回退上一版本的同时,让版本库内容同步到暂存区

git reset --hard HEAD^ 在版本库回退上一版本的同时,让版本库内容同步到暂存区和工作区

git reset HEAD 实际上就是与git reset --mixed HEAD^相同

1.2 通过路径来reset

git reset file.txt(这其实是git reset --mixed HEAD file.txt的简写形式)会让file.txt从HEAD复制到暂存区中。正好与git add相反

git reset HEAD^ file.txt 会将HEAD^的file.txt覆盖暂存区

1.3 checkout-index

git checkout-index -a 让将暂存区的文件写入工作区,注意:不会覆盖工作区的文件,即只会写入暂存区有而工作区没有的文件

git checkout-index -a -f 让工作区被暂存区文件全部覆盖,注意:该方法不会删除暂存区没有而工作区有的文件

1.4 checkout:切换分支和恢复暂存区的文件

  1. git checkout <branch>

    会让版本库的指针指向<branch>分支的HEAD,同时让工作区和暂存区同步到HEAD,注意:原来工作区的修改会被保留

  2. git checkout -b <new_branch>

    会创建分支并让版本库的指针指向该分支

  3. git checkout [--detach] <commit>

    可以让版本库的HEAD指向<commit>,同时让工作区和暂存区同步到HEAD,注意:原来工作区的修改会被保留

  4. git checkout <file_name>

    可以让暂存区的特定文件覆盖工作区,(如果是想暂存区文件全部覆盖工作区,可以git checkout .,注意:该方法不会删除暂存区没有工作区有的文件)

2.显示差异

git diff 详细显示工作区和暂存区的差异

git diff HEAD --filename 比较工作区和版本库的差异

git status 可以显示工作区和暂存区的差异与暂存区和版本库的差异

git log 显示版本库提交日志

3.git 出现:号

表示还有未显示的内容,可以继续按回车键查看,或者按q退出

参考:

git官网