如何使用单个命令进行暂存并提交所有文件,包括新添加的文件?

532

如何使用单个命令对包括新添加的文件在内的所有文件进行暂存和提交?


5
令人沮丧的是,过去可以使用标准语法提交和添加任何新文件:git commit -a。但像往常一样,Git 语法发生了变化。它让现有用户感到困惑(并且破坏了他们的脚本),取消了有用的功能,并替换了一个不必要的标志。 - fijiaaron
2
这个问题在 git add -A, git commit in one command? 也有重复。那里的被接受的答案与这里的类似,但建议创建一个 Git 别名来缩短输入命令的长度(并展示了如何创建别名)。 - Mark Amery
15个回答

702

这个问题是什么?

git add -A && git commit -m "Your Message"

算作“单个命令”吗?

根据下面@thefinnomenon的回答进行编辑

要将其作为git别名,请使用:

git config --global alias.coa "!git add -A && git commit -m"

提交所有文件,包括新文件,并带有一条消息进行提交:

git coa "A bunch of horrible changes"

解释

git add文档中获取:

-A, --all, --no-ignore-removal

不仅在工作树中有匹配的文件,而且在索引中已经有条目的地方也更新索引。这将添加、修改和删除索引条目以匹配工作树。

如果使用 -A 选项时没有给出 <pathspec>,则会更新整个工作树中的所有文件(旧版本的 Git 只会更新当前目录及其子目录)。


4
提交信息怎么样? - Narendra Jaggi
11
@NarendraJaggi git add -A && git commit -m "Your Message" 意思是将所有修改的文件添加到git仓库中,并提交这些修改,同时附上一条简短的注释消息:"Your Message"。 - Dr.jacky
1
可以将这个放在独立的.sh或.bat文件中,只需使用一个命令即可。消息可能是param1。 - BlueWizard
4
在PowerShell中,将“&&”替换为“;”以运行两个命令,就像这样: git add -A ; git commit -m "Your Message" - Rafael Miceli
我在Mac上尝试创建别名,但是出现了一个错误提示:“扩展别名'coa'失败;'git'不是一个git命令”。 - undefined
显示剩余2条评论

479

这个命令将会添加并提交所有修改过的文件,但不会包括新创建的文件:

git commit -am  "<commit message>"

根据 man git-commit:

-a, --all
    Tell the command to automatically stage files that have been modified
    and deleted, but new files you have not told Git about are not
    affected.

132
实际上,这并没有回答问题,事实上特别指出(甚至用粗体标出)了所寻求解决方案的一个关键部分。 - Arunas
9
不添加或提交未跟踪的文件。 - b15
5
当你在执行了 "git add -A" 后意识到自己忘记修改代码中的一些小细节时,以下方法适用于大多数典型情况。我不喜欢重复从头开始写相同的提交信息。 - KorbenDallas
1
但是楼主说“所有文件”,所以我认为这个不算。 - Frederick G. Sandalo
还有,你可以在你的 .bashrc 文件中为基本的 git 命令添加快捷方式: alias gpl='git pull' alias gps='git push' alias gc='git commit' alias gs='git status' alias gd='git diff' alias ga='git add' alias gck='git checkout' alias gb='git branch' alias gl='git log' alias lcp='git format-patch -1 HEAD' alias resetToMaster='git reset --hard origin/master' - ni3

55

不确定为什么这些答案都没有直接给出我认为是正确解决方案的方法,不过就算这样,以下是我使用的方法:

1. 创建一个别名:

git config --global alias.coa '!git add -A && git commit -m'

注意:在执行git add -A命令之前需要加上!,才能使其正常工作。您可以在这里阅读有关Git别名的更多信息:git-scm.com | 2.7 Git Basics - Git Aliases

2. 添加所有文件并提交消息:

git coa "A bunch of horrible changes"

注意coa 是“全部提交”(commit all)的缩写,可以用自己喜欢的任何词汇替换。


28

我使用这个函数:

gcaa() { git add --all && git commit -m "$*" }
在我的zsh配置文件中,这样我就可以轻松地执行:
> gcaa This is the commit message

自动暂存并提交所有文件。


1
对于类似bash的函数:function gcaa() { git add --all && git commit -m "$*" && git push } - Damilola
2
@Damilola - 你所说的 bash-like 是什么意思?答案中的语法在 bash 中也适用。 - Eliran Malka

27

一行代码,但不是单个命令(这是原帖作者所要求的)。 - Eliran Malka

9
在git中提交可以是一个多步骤过程,也可以是一个步骤的过程,这取决于具体情况。
  1. This situation is where you have multiple file updated and wants to commit:

    You have to add all the modified files before you commit anything.

    git add -A
    

    or

    git add --all
    
  2. After that you can use commit all the added files

    git commit
    

    with this you have to add the message for this commit.


6
如果你只想要一个“快速且简单”的方法来保存当前分支上的更改,可以使用以下别名:
git config --global alias.temp '!git add -A && git commit -m "Temp"'  

在运行该命令后,您可以只需键入git temp,Git 就会自动将您的所有更改作为一个名为“Temp”的提交提交到当前分支。然后,您可以稍后使用git reset HEAD~来“撤消”更改,以便继续工作,或使用git commit --amend来添加更多更改并/或给它一个适当的名称。

5
运行给定的命令。
git add . && git commit -m "Changes Committed"

然而,即使看起来是一个单独的命令,它实际上是分成两个命令依次运行。在这里,我们只是使用&&将它们组合起来。这与单独运行git add .git commit -m "Changes Committed"没有太大区别。您可以一次运行多个命令,但顺序很重要。如果您想要将更改推送到远程服务器并将其暂存和提交,则可以按照以下方式执行:

git add . && git commit -m "Changes Committed" && git push origin master

相反,如果你改变顺序并将push放在第一位,它将首先执行,并且不会在暂存和提交后给出所需的推送,因为它已经先运行了。 &&在第一个命令成功返回或错误级别为0时,在该行上运行第二个命令。与&&相反的是||,当第一个命令不成功或错误级别为1时,运行第二个命令。
另外,您可以创建别名作为git config --global alias.addcommit'!git add -a && git commit -m',并将其用作git addcommit -m“添加并提交新文件”

4

我在我的配置文件中有两个别名:

alias.foo=commit -a -m 'none'
alias.coa=commit -a -m

如果我太懒了,我就会使用以下命令提交所有更改:

git foo

只需快速提交即可

(这句话是关于IT技术的)
git coa "my changes are..."

COA代表“提交全部”。


10
我会不喜欢与充斥着“none”的提交消息的代码库一起工作,我也会因此基于这个原因拒绝任何PR。不幸的是,你只有在需要回溯审计很久以前写的东西时才能学到好的提交消息的重要性(“这行代码引起了一个错误...为什么要添加它,如果我改变/删除它会有什么问题?”)。 - gregmac
1
带有“none”的提交永远不打算长期存在。通常我会开始自己的特性分支,进行微小的提交,并将它们压缩成更合理的东西,然后再合并。显然,那些为每个修改的函数做提交并且不介意完整的git日志的人不需要这样做。 - SystematicFrank
1
我在这种情况下使用“wip”(即“正在进行的工作”)而不是“none”,并且我只将这样的提交推送到我的私有分支。 - Sergej Koščejev
这仍然是没有帮助的,因为最终那些“wip”或“none”的提交将进入其他人看到的分支,并污染消息日志。如果您在推送之前压缩所有提交,则可以接受,但对于团队来说仍然很烦人。 - Jordan
不是答案,因为它不提交新添加的文件。 - Jesper Rønn-Jensen
很多人(不幸的是)将版本控制用作日志文件系统,并且不编写提交消息(或使用一些无用的通用消息)。这使得其他人在未来难以处理代码。 - Peter Mortensen

2
很好的答案,但如果你想要一行代码完成所有操作,你可以使用连接(concatenate)、别名(alias)并享受方便: git add * && git commit -am "<commit message>" 这是一行代码,但是包含两个命令,正如前面提到的,你可以为这些命令取一个别名: alias git-aac="git add * && git commit -am "(末尾的空格很重要),因为你将为新的简写命令参数化。
从现在开始,你将使用这个别名: git-acc "<commit message>" 你基本上是在说:
git,帮我添加所有未跟踪的文件,并用给定的提交消息提交它们。
希望你使用Linux,希望这有所帮助。

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