git -- (实用)对工作区和暂存区的一些操作场景

diff差异

工作区和暂存区 :  git diff 

工作区和HEAD  :  git diff  HEAD

暂存区和HEAD  :  git diff  --cached

不同分支的差异 :  git diff  dev1.0  master

不同commit的差异:git diff  sha1 sha2

指定文件: git diff sha1 sha2 -- test/ab.txt

说明:对于新增的文件,其只存在于工作区,且处于 Untracked 状态,Git 认为无论是哪两个 Git 区域之间的比对都没有意义,得到的结果是没有区别。使用git status查看;

撤销操作

本地仓库恢复暂存区内容 :
git reset HEAD -- 文件名   # 对某个文件进行恢复                    
git reset HEAD -- path    # 对某个路径进行恢复    
git reset HEAD            # 对所有文件进行恢复
(使用 git diff -cached 做比较)
 
暂存区恢复工作区内容 :  
git checkout -- 文件名     # 对某个文件进行恢复
git checkout -- path      # 对某个路径进行恢复 
git checkout              # 对所有文件进行恢复
(使用 git diff 做比较)

本地仓库恢复工作区和暂存区内容 :
git reset --hard HEAD
(使用 git diff HEAD 工作区和本地仓库做比较)
              
git reset HEAD 本地仓库对暂存区的恢复,加了--hard,对工作区也一起恢复。        

回到某个commit有两种方式:reset和revert(恢复)

git reset HEAD
git reset commit_id

git revert HEAD
git revert -n commit_id    -n 表示不立即commit,只是恢复工作区内容。

git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。

清除工作区变化

git reset --hard HEAD
git clean -df

清除暂存区变化

git rm -r --cached .
git rm -r --cached -- index.jsp

从工作目录中删除所有没有tracked过的文件和目录-d

git clean -df 

说明:git clean经常和git reset --hard一起结合使用. 记住reset只影响被track过的文件, 所以需要clean来删除没有track过的文件. 结合使用这两个命令能让你的工作目录完全回到一个指定的<commit>的状态
git clean的用法


下面转发文件转发自:https://www.cnblogs.com/soaeon/p/10908712.html

比较暂存区和HEAD所含文件的差异?

操作场景如下:

*   修改readme.md 文档
    *   vi readme.md
*   加入到暂存区域
     *   git add readme.md
*   使用git diff -cached 做比较

比较工作区和暂存区所含文件的差异?

操作场景如下:

*   修改readme.md 文档
    *   vi readme.md
*   加入到暂存区域
    *   git add readme.md
*   使用git diff 做比较

让暂存区恢复成和HEAD的一样?

git reset HEAD

暂存区覆盖工作区(将工作区的修改抹掉)

操作场景如下:

*   修改 re'adme.md
    *   vi readme.md
*   比较工作区和暂存区的问价差异
    *   git diff
*   将暂存区覆盖工作区
    *   git checkout -- readme.md
*   再次比较工作区和暂存区的差异
    *   git diff

取消暂存区部分文件的更改?

操作场景如下:

创建了两个文件, 同时加入到了暂存区域, 发现还需要修改

soaeon@DESKTOP-FUJJTHR MINGW64 /f/gitstudy (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   index.css
        new file:   index.js

index.css已经加入到暂存区域了, 但是还需要修改, 我们先从暂存区域撤回吧

soaeon@DESKTOP-FUJJTHR MINGW64 /f/gitstudy (master)
$ git reset HEAD   index.css

执行git status 查看一下是否退回来了

soaeon@DESKTOP-FUJJTHR MINGW64 /f/gitstudy (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   index.js

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        index.css

再比较一下工作区和暂存区的差别

soaeon@DESKTOP-FUJJTHR MINGW64 /f/gitstudy (master)
$ git diff --cached
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..e69de29
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 这次主要来讲讲Git的反悔操作,自己平时在写代码的过程中经常会出现想要弃用所有的改动或回滚到上一次commi...
    jumpingfrog0阅读 19,862评论 1 12
  • 一、基本概念: 注:对于git的分布式概念及其优点,不重复说明,自己百度或谷歌。本文中涉及到指令前面有$的,在cm...
    大厂offer阅读 1,489评论 0 3
  • 工作区和暂存区 工作区 在我们自己电脑中,里面有.git文件夹的那个目录,我们一般叫做git工作区,但是请注意.g...
    程序淡然阅读 316评论 0 1
  • 一 Git配置和仓库初始化 下面会介绍Git的使用,每个小节里会讲解各个功能在命令行中的实现方式,并在每小节的最后...
    Happioo阅读 3,495评论 0 5
  • 1. GIT命令 git init在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个re...
    江边一蓑烟阅读 845评论 0 0