如何仅提交部分文件?

390
我有两个项目。一个是“官方”项目,第二个是轻微的修改(添加了一些文件)。我创建了一个新分支,并将新文件放入其中。但在开发过程中,一些两个分支共同的文件被更改。
如何仅提交这些文件?

这两个项目连接到同一个Git仓库吗? - Oleksandr
是的,它是同一个代码库,但我不想将我的分支推送到服务器上。 - Nips
那么为什么不将你的新分支合并到主分支(或其他官方分支)呢? - Oleksandr
1
以下是这些问题的答案:https://dev59.com/SWw05IYBdhLWcg3wkirX https://dev59.com/Z2w05IYBdhLWcg3wiybg - eckes
8个回答

382

我想你希望将更改提交到一个分支,然后在另一个分支中使这些更改可见。在 Git 中,当切换分支时,你不应该有任何未提交的修改。

你可以通过以下方式仅提交更改过的文件:

git commit [some files]

或者如果您确信您有一个干净的暂存区,您可以:

git add [some files]       # add [some files] to staging area
git add [some more files]  # add [some more files] to staging area
git commit                 # commit [some files] and [some more files]

如果你想让该提交在两个分支上都可用,则执行以下操作:

git stash                     # remove all changes from HEAD and save them somewhere else
git checkout <other-project>  # change branches
git cherry-pick <commit-id>   # pick a commit from ANY branch and apply it to the current
git checkout <first-project>  # change to the other branch
git stash pop                 # restore all changes again

46
如果只要提交某些文件,即使其他更改已经暂存,应该使用第二个示例(git commit [some files],这意味着使用了 --only 选项)。第一个示例(git add [some files]后跟git commit)也会提交任何已暂存的其他更改。 - Lexikos
11
可以给git commit [一些文件]提供示例,例如应该如何替换[一些文件]、逗号、空格等。 - Claudiu Creanga
3
通常,shell命令中的各个部分是由空格分隔的。如果您深入研究,可以将其更改为任何其他分隔符。 - Alexander Oh
2
如果您能添加一些示例,那么这个答案将会更好。 - Yamur

214
获取您想要提交的文件列表
$ git status

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
modified:   file4

将文件添加到暂存区

$ git add file1 file2

检查一下你正在承诺的内容。
$ git status

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   file1
    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:   file3
    modified:   file4

使用提交信息提交文件

$ git commit -m "Fixed files 1 and 2" -- file1 file2

如果你不小心提交了错误的文件
$ git reset --soft HEAD~1

如果你想取消暂存文件并重新开始
$ git reset

Unstaged changes after reset:
M file1
M file2
M file3
M file4

1
这是错误的。我执行了 git add file1 file2 然后执行了 git commit -m "Fixed files 1 and 2",但它提交了所有文件。 - Binar Web
1
@BinarWeb 因为你已经将所有这些文件暂存(添加)了。但是在回答中值得一提的是要绝对清楚。在你的情况下,以下命令可以工作:git commit file1 file2 -m "Fixed files 1 and 2" - UncaughtTypeError
@UncaughtTypeError 不明白为什么这个答案会得到这么多赞,因为问题明确说了“两个分支共同的”,这意味着它已经被暂存了。正如Binar Web所提到的,这个答案是错误的,与问题所问不符。 - Farid
我纠正了这个答案,但不确定是哪个主持人没有批准它,并将无效的答案作为一个被接受的答案留下来。根据@UncaughtTypeError所说,提交选定文件的命令是git commit file1 file2 -m "Fixed files 1 and 2"。 - vijay pujar

146

您可以提交一些更新的文件,例如:

git commit file1 file2 file5 -m "commit message"

除了文件,您还可以指定目录和文件名模式,git 将提交目录中的所有暂存文件以及与模式匹配的文件。如果您需要提交大量文件,则特别方便。 - NZD

49

假设您已对多个文件进行了更改,如下:

  • File1
  • File2
  • File3
  • File4
  • File5

但是您只想提交File1和File3的更改。

有两种方法可以实现:

1.仅将这两个文件暂存,使用以下命令:

git add file1 file3

然后,提交

git commit -m "your message"

然后推送。
git push

2. 直接提交

git commit file1 file3 -m "your message"

然后推送

git push

实际上,第一种方法在我们经常修改文件并将它们推送到暂存区的情况下非常有用——>大型项目,通常是线上项目。
但如果我们修改文件但不进行推送,则可以直接提交——>小型项目。


1
当您不像第二个示例那样指定文件名时,Git 会假定这些参数的命令标记为 --only。然后,它将是与 git commit --only file1 --only file3 -m "my message" 相同的命令,或者使用快捷方式 git commit -o file1 -o file3 -m "my message"。参考:https://git-scm.com/docs/git-commit - user

43

有些内容看起来“不完整”

人们会不确定是否应该使用引号等等。

添加一个具体的文件,显示位置路径。

git add JobManager/Controllers/APIs/ProfileApiController.cs

提交(请记住,提交只在本地生效,不会影响任何其他系统)

git commit -m "your message"  

推送到远程仓库

git push  (this is after the commit and this attempts to Merge INTO the remote location you have instructed it to merge into)

其他答案展示了你有时需要执行的隐藏等操作。


13
如果您已经暂存文件,请简单地取消暂存它们:

如果您已经暂存文件,请简单地取消暂存它们:

git reset HEAD [file-name-A.ext] [file-name-B.ext]

然后逐个把它们再次添加回去。


2
我认为你也可以使用命令行:
git add -p

这使您能够逐个查看所有未提交的文件,并选择是否要提交它们。

然后,对于每个修改,您有一些选项可供选择:我使用“y”表示“是,我要添加此文件”,使用“n”表示“不,我稍后会提交此文件”。

Stage this hunk [y,n,q,a,d,K,g,/,e,?]?

对于其他选项(q、a、d、K、g、/、e、?),我不确定它们的作用,但我猜测“?”可能会帮助您深入了解细节。
这样做的好处是您可以推送您的工作,并在创建新分支后,所有未提交的工作将跟随您转移到该新分支。如果您编写了许多不同的代码,并且实际上想在推送到Github之前重新组织您的工作,那么这非常有用。
希望这有所帮助,如果之前已经提到过(如果有的话),请见谅。

1
这是一个简单的方法,如果你没有太多的代码更改:
1. git stash
2. git stash apply
3. remove the files/code you don't want to commit
4. commit the remaining files/code you do want

如果你想把删除的代码(未提交的部分)放在另一个提交或分支中,那么在仍然在这个分支上的情况下执行以下操作:

5. git stash apply
6. git stash

在第5步中,由于您已经应用了stash并提交了第4步中需要的代码,所以新应用的stash中的差异和未跟踪代码就是您在第3步中删除的代码,然后在第4步中提交。因此,在第6步中,代码库中未提交的代码会被保存到一个stash中,这些更改很可能是您不想丢失的,对吧?因此,现在可以通过在正确的分支上执行git stash apply并提交来提交来自第6步的新stash到此分支或任何其他分支。显然,这假设您在一个流程中完成所有步骤;如果您在这些步骤的任何其他点上使用stash,那么您需要记下每个步骤的stash引用(而不只是基本的stash并应用最近的stash)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接