我来自Subversion背景,一般来说,您可以使用每个文件的提交消息/注释单独检入文件。我对Git的观察(可能不正确)是,工作流程会使您将所有阶段文件一起提交并使用单个提交消息,因为git commit
的默认语法是一次提交所有阶段文件。最初我想以svn的方式思考事物,即每个文件的提交。但是我对Git试图实现的行为的想法似乎对我更有意义,因为变化是变化,无论它们是什么,无论它们在哪里,而不是仅仅考虑每个文件。
我是否认为Git一般会采取这种行为?显然你可以提交单个文件,但似乎在Git思考中不那么频繁。
答案 0 :(得分:4)
诀窍是要认识到你可以完全控制哪些变化上演了。这可能是所有更改,可能是对一个文件的更改,可能是对某些文件的某些更改。基本上,它可以是你想要的任何东西。
有趣的一点并非git commit
,而是git add
。以下是一些常见的情景:
将所有更改暂存到文件foo.bar
:
git add foo.bar
从文件foo.bar
暂存一些更改:
git add --patch foo.bar
此模式将" chunk"你的更改并询问是否应该提交每个块。
对已跟踪文件(即Git已在跟踪的文件)进行所有更改:
git add -u
此选项的文档解释了它比我做得更好:
更新索引,使其具有匹配
<pathspec>
的条目。这将删除并修改索引条目以匹配工作树,但不添加新文件。如果在使用
<pathspec>
选项时没有给出-u
,则会更新整个工作树中的所有跟踪文件(旧版本的Git用于限制对当前目录及其子目录的更新)
很多人也喜欢使用git add .
,但我从来没有成为我工作流程的一部分。您可以在this question中了解git add .
和git add -u
之间的差异。基本上,git add .
也会对未跟踪文件进行阶段更改,但不阶段文件删除,-u
确实会暂存。
当然,您也可以将多个文件中的更改分段。 我倾向于不通过文件来破坏提交,而是通过逻辑更改来破坏提交。如果您正在修复错误并且需要修改三个文件,那么这三组修改就会结合在一起。 git add foo bar baz
,git commit
。
在提交之前查看暂存的更改非常有用。
git diff
显示非暂停更改。git diff --staged
显示暂存的更改。这些是您在运行git commit
。我经常在提交之前运行这两个,只是为了确保我知道我上演了什么。
如果您要提交所有已修改的文件(可以使用git add -u
暂存的文件),您可以使用快捷方式git commit -a
:
使用-a开关和 commit 命令自动&#34;添加&#34;从所有已知文件(即已在索引中列出的所有文件)中更改并自动&#34; rm&#34;索引中已从工作树中删除的文件,然后执行实际提交;
答案 1 :(得分:1)
绝对不是。事实上,使用git,只对单个文件提交部分更改是极其常见的,这是git最大的优势之一。您可以在单个文件中进行两个逻辑上不同的更改,并单独提交它们。这就是为什么据说git跟踪内容而不是文件。需要您将所有更改提交到单个文件的版本控制系统相比之下会感到笨拙和野蛮。