在git中只提交某些更改的正确方法是什么?

时间:2016-02-09 23:39:07

标签: git

当我处理多个文件时,有时我会处理与不同文件相对应的不同功能。

我通常做的是:

git status
git add <file/directory 1> # eventually with /* following directory name to commit
                           # the subdirectories rather than the directory itself
                           # (not sure how it works exactly)
git add <file/directory 2>
git commit -a              # here add commit message in editor
[ ... after N commits ... ]
git push (origin master / whatever)

我注意到大多数时间它只是起作用:提交的文件正是我添加的文件。但有时候,它会提交所有文件。

我做错了吗?

另外,提交-a 提交-m 之间的区别是什么?

3 个答案:

答案 0 :(得分:4)

git commit -a是你的问题。 git commit -a添加所有文件修改并提交它们。 -a-m是非常不同的旗帜; -m允许您在命令行上键入消息。 man git-commitgit commit --help会向您显示标记的含义。

答案 1 :(得分:3)

当您提交时,您只提交已提交的提交的内容。要提交某些内容以进行提交,请使用git add

$ ls
file1 file2 file3

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   file1
    modified:   file2
    modified:   file3

no changes added to commit (use "git add" and/or "git commit -a")

这里,我们有三个文件,所有文件都经过修改。但是,我们只想提交file1file3

$ git add file1 file3

$ git commit -m 'my commit message'
[master 7c43d4b] my commit message
 2 files changed, 2 deletions(-)

提交已完成,但file2保持原样,未提交。

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   file2

no changes added to commit (use "git add" and/or "git commit -a")

当您使用-a标记git commit时,您告诉它首先添加已更改的所有内容,然后执行提交。这可能是一个有用的命令,但它似乎并不是你在这里寻找的东西。它大致相当于

cd /base/of/repository
git add .
git commit

(旁注:git commit -a只会添加对已跟踪文件的更改。如果您有.gitignore个文件或未跟踪文件,则这些更改上演。)< / p>

重要的是要意识到git add阶段更改了内容,这与文件并不总是一样。

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   file2

no changes added to commit (use "git add" and/or "git commit -a")

$ git add file2

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   file2

$ echo "foobar" >> file2

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   file2

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   file2

在这里,我们开始使用修改后的file2,然后使用git add进行展示。在那之后,它显示为准备提交。然后,我们再次更改文件 。现在,它已经为提交进行了一些更改,但是其他更改没有上传。如果我们现在承诺,

$ git commit -m 'my commit message'
[master 4342cdc] my commit message
 1 file changed, 1 deletion(-)

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   file2

no changes added to commit (use "git add" and/or "git commit -a")

我们已经进行了阶段性的改变,但那些没有上演的人仍然坐在那里等着我们处理它们。 两者都在同一个文件中。

这使得git中的提交非常灵活,尽管它会让人感到困惑。

您可能还想阅读git add -p,这是一种仅对文件更改部分进行分段的方法。我经常使用它来进行更改,但跳过文件中剩下的各种笔记和垃圾,但尚未清理。

答案 2 :(得分:1)

根据经验和正确的方法:

git status查看尚未提交的文件 git add -A添加所有未提交的文件 git add yourFileName ,然后 git commit -m "your message" 后跟 git push