为什么要先 git add 才能 git commit

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 ,保证递交了所有内容

时间: 2024-10-12 05:35:11

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

git add && git add -u && git add -A

git add将当前工作目录中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步.可以递归添加,即如果后面跟的是一个目录作为参数,则会递归添加整个目录中的所有子目录和文件. git add [path]表示 add to index only files created or modified and not those deleted .通常是通过git add [path]的形式把[path]添加到索引库中,[path]可以是文

git add和git commit

git命令使用:提交前可指定要提交哪些文件,然后使用git commit来提交 样例: git status 输出: Changes to be committed: modified:   app/Library/Common.php Changes not staged for commit: modified:   .env modified:   index.php Untracked files: .idea/ 如果你想加入本次要提交的文件,使用命令:git add index.php

git init,git add和git commit三者的区别和使用

git init(版本库初始化命令) $cd /usr/local $mkdir demo $cd demo $git init 之后可以在demo目录下看到看到一个.git隐藏文件夹,这个文件夹就是版本库,而demo目录及其子目录就是工作区. git add(将工作区文件提交到暂存区stage) $touch welcome.txt $git add 文件welcome.txt从工作区被提交到暂存区,但此时文件并没有真正进入到版本库当中,文件目前只处于一个中间状态. git commit(将暂

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

前言: plumbing命令 和 porcelain命令 git中的命令分为plumbing命令和porcelain命令: porcelain命令就是我们常用的git add,git commit等命令 plumbing命令可以理解为更底层的命令,实际上一个porcelain命令可以由若干个plumbing命令完成(见下文),plumbing命令可以帮助我们了解git底层的工作原理 阅读本文还需要了解.git目录的结构功能,以及git中的对象(commit对象.tree对象.blob对象等等)等

Git中将git add 与 git commit合并

修改hello.php文件 vim hello.php <?php         echo "hello world!"; ?> 查看hello.php文件 cat hello.php 查看项目文件状态 git status -s add与commit合并操作 git commit -am "合并提交" 命令行输出

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

特点:Git极其强大的分支管理:分布式版本 集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器.中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆.集中式版本控制系统最大的毛病就是必须联网才能工作. 使用Git 1.创建版本库 首先,选择一个合适的地方,创建一个空目录,通过git init命令把这个目录变成Git可以管理

Git 学习(三)本地仓库操作——git add &amp; commit

Git 和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念.这在上章节已有提及,这章节具体说明什么是工作区及暂存区,以及如何使用本地git库的操作命令:重点 git add 及 git commit . 回顾上一章节版本库创建: 先将 D:盘下的 learngit 整个文件夹删除,然后创建空的 Git 版本库. 工作区(Working Directory) 和  版本库(Repository) 工作区即操作系统中看到的文件夹,如  d:/learngit ,目前工作区是空的. 工作区有一

git add

git add git add命令把工作目录下面的有修改的文件添加的index(staging)里面去. git add告诉Git你想在下次commit的时候把什么文件包含进去. 但是, git add没有真正的对仓储有什么大的影响--在commit之前修改没有真正的被记录下来. 在add之前, 可以使用git status来查看工作目录和index区域的状态. 用法 git add <file> 把文件的所有修改加入到index(staging)中, 为了下次commit. git add

git add 命令的一个习惯用法:逐个挑选改动

普通的git命令入门级的介绍中一般都用“git add .” 或者“git add -a”, 而在实际工作中这种用法稍不注意会给你带来麻烦,经常提交你不希望的改动:一些自动编译成成的文件或者一些debug目的写入的log输出代码等等. 随着经验值的提高,某一天发现git add -p 才是符合程序员日常使用的命令.这个命令可以让你逐条的选择你的改动进入commit, 对你要的改动选‘y’, 不要的选‘n’就行.这样能保持提交代码的整洁干净, 同时也能在当前code 下保留你的debug 相关改动