1. git 的 add ,是一个容易引起疑问的命令。在 subversion 中的 svn add 动作是将某个文件加入版本控制,而 git add的意义完全不同。

同时, git diff --cached 是比较 stage 的文件的差异的,也是一个不直观的命令。

github 2008年的blog中,也提到,容易引起混淆:
https://github.com/blog/196-gittogether-2008
http://learn.github.com/p/normal.html

things like making use of the term ‘stage’ for things that happen in the index (such as using ‘git diff —staged’ instead of ‘git diff —cached’) is being worked on. I’m excited that staging files may soon be done via ‘git stage’ rather-than/in-addition-to ‘git add’. This is nice for new users who often have a hard time seeing why you have to keep ‘git add’ing to stage your changes.

事实上,在 git 的后续版本中,就做了两个修改:
git stage 作为 git add 的一个同义词
git diff --staged 作为 git diff --cached 的相同命令
为了容易理解,推荐大家使用 git stage 和 git diff --staged 这两个命令,而git add 和 git diff --cached 这两个命令,仅仅为了保持和以前的兼容做保留。

2. 增加 stage 的带来的好处是什么?
主要有两个好处,一个是分批、分阶段递交,一个是进行快照,便于回退
2.1 分批递交,降低commit的颗粒度
比如,你修改了 a.py, b.py, c.py, d.py,其中 a.py 和 c.py 是一个功能相关修改,b.py,d.py属于另外一个功能相关修改。那么你就可以采用:
git stage a.py c.py
git commit -m "function 1"
git stage b.py d.py
git commit -m "function 2"

2.2 分阶段递交
比如,你修改了文件 hello.py,修改了一些以后,做了 git stage heello.py动作,相当于对当前的hello.py 做了一个快照, 然后又做了一些修改,这时候,如果直接采用 git commit 递交,则只会对第一次的快照进行递交,当前内容还保存在 working 工作区。

当前的最新修改,则需要再做一次 git stage ,才能递交。

这中间细微的差别,请参见:
http://learn.github.com/p/normal.html

由于git这个特性,需要注意到是,每次递交之前,需要确认是否已经将相关的修改都stage 了,否则可能仅仅递交了部分不完整的修改。
比如你修改了部分内容,进行了 stage,后来你又做了一些修改,然后就递交,这时,后面的修改,并没有递交。

2.3 文件快照,便于回退
做了部分修改以后,进行 git stage,然后任何时刻,都可以回退到stage时的状态:

git checkout -- hello.py

3. git diff , git diff --staged 和 git diff HEAD的差别

当一个文件做了stage,然后又做了一些修改,则:

git diff 显示当前工作区的文件和stage区文件的差异

git diff --staged 显示stage区和HEAD的文件的差异

git diff HEAD 显示工作区和上次递交文件的差异

具体参见 git help diff 的EXAMPLES部分。

使用 git status 可以看到,一个文件可能同时存在两种差异。具体参见:
http://learn.github.com/p/normal.html

4. reset 和 checkout的区别
当文件加入了 stage 区以后,如果要从stage删除,则使用 reset,此时工作区的文件不做任何修改,比如:
git reset hello.py
这个命令就是 git stage hello.py 的反操作。

当文件加入了 stage 区以后,后来又做了一些修改,这时发现后面的修改有问题,想回退到stage的状态,使用 checkout 命令:
git checkout hello.py

5. 可以使用 git commit -a 命令,跳过 git stage 这个命令,直接递交

6. 最佳实践:
做了阶段性修改,但是还不能做一次递交,这时先 git stage 一下
如果有问题,可以随时 checkout 回退
递交之前,使用 git status,git diff HEAD 仔细查看是否需要的递交
git commit -a ,保证递交了所有内容

为什么要先 git add 才能 git commit的更多相关文章

  1. git add && git add -u && git add -A

    git add将当前工作目录中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步.可以递归添加,即如果后面跟的是一个目录作为参数,则会递 ...

  2. git add -A /git add -u/git add .的用法

    git的指令详解 在git中有好多的指令,但是今天这几个指令就很容易忘记而且还容易混淆 git add -u <==> git add –update 提交所有被删除和修改的文件到数据暂存 ...

  3. git add , git commit 添加错文件 撤销

    1. git add 添加 多余文件 这样的错误是由于, 有的时候 可能 git add . (空格+ 点) 表示当前目录所有文件,不小心就会提交其他文件 git add 如果添加了错误的文件的话 撤 ...

  4. git add和git commit

    git命令使用:提交前可指定要提交哪些文件,然后使用git commit来提交 样例: git status 输出: Changes to be committed: modified:   app/ ...

  5. 使用plumbing命令来深入理解git add和git commit的工作原理

    前言: plumbing命令 和 porcelain命令 git中的命令分为plumbing命令和porcelain命令: porcelain命令就是我们常用的git add,git commit等命 ...

  6. git add . git add -u git add -A命令区别图解

    git版本不同会有所区别: Git Version 1.x:  Git Version 2.x:  git add .  修改(modified)以及新文件(new),但不包括被删除的文件. git ...

  7. git的常用指令(二) git add -A 、git add . 和 git add -u

    git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件. git add -u :他仅监控 ...

  8. 在dev分支上修改了文件,但是并没有执行git add. 和git commit命令,然后切换到master分支,仍然能看到dev分支的改动现象

    当我们创建一个新的分支dev,并且在新分支上修改了原文件,在我们没有提交到仓库的前提下,将分支再切换到master分支上,执行git status ,可以看到dev操作的状态: (1)因为未add的内 ...

  9. Git学习01 --git add, git commit , git log ,git status, git reset --hard, head

    Git官方提供的快速入门教程:https://try.github.io/levels/1/challenges/1 特点:Git极其强大的分支管理:分布式版本 集中式版本控制系统,版本库是集中存放在 ...

随机推荐

  1. IOS 单击手势和cell点击冲突

    环境: view上添加tableView,给view添加单击手势,点击cell却走的是手势方法. 解决: UITapGestureRecognizer *tap=[[UITapGestureRecog ...

  2. 2019.02.09 bzoj4710: [Jsoi2011]分特产(容斥原理)

    传送门 题意简述:有nnn个人,mmm种物品,给出每种物品的数量aia_iai​,问每个人至少分得一个物品的方案数(n,m,每种物品数≤1000n,m,每种物品数\le1000n,m,每种物品数≤10 ...

  3. 2018.11.17 codechef PRIMEDST(点分治+fft)

    传送门 fftfftfft一眼题(其实最先想到的是nttnttntt,wawawa了几次之后发现模数不够大果断弃疗写fftfftfft) 我们点分治统计答案的个数. 考虑现在已经统计出了到当前点的所有 ...

  4. 注解Demo

    1.创建注解类 2.在测试实体类中使用注解 3.构建注解解析类 4.执行注解解析方法

  5. C语言常用数据类型说明

     1.取值范围: short一般占两个字节,取值范围:-32768 - 32767   int一般占两个或四个字节,取值范围:-2147483648 - 2147483647 unsigned int ...

  6. Ubuntu 16.04 安装 postgresql 9.3

    1.Ctrl+Alt+t 打开终端 2.输入:wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo a ...

  7. fork、vfork、clone

    三个都是用来创建新进程的函数 fork 概念 1)fork函数调用一次会返回两次,给父进程返回子进程的进程ID,给子进程返回0(这么设计的原因:父进程可以有很多子进程,没有一个函数可以让父进程知道所有 ...

  8. dj django与ajax交互

    Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数 ...

  9. 【设计模式】Javascript设计模式——状态模式(行为型)

    注:这个模式是非常聪明的,很有点数学中组合的意思,现在,来看下这个模式是怎么个思想. 问题提出:假如某个操作有三种可能,分别为1,2,3,还可能是组合,比如先执行1,再执行2或者先执行2再执行3或者1 ...

  10. CentOS 5.5 防火墙开启、关闭以及开放指定端口

    之前有讲过公司新买的服务器使用的是CentOS5.5, 部署好Tomcat之后却发现输入114.80.*.*:8080(即ip:8080)却无法显示Tomcat默认的首页. 因为以前部署在Win Se ...