如何在一个命令中实现git的add、commit和push操作?

299

有没有办法将这三个命令合并成一个?

git add .
git commit -a -m "commit" (do not need commit message either)
git push

有时我只需要更改一个字母,例如CSS内边距等。但是,我仍然需要编写所有三个命令才能推送更改。在许多项目中,我是唯一的推动者,因此这个命令非常棒!


14
你尝试过编写 shell 脚本吗? - Paul
1
https://dev59.com/-VzUa4cB1Zd3GeqP3XV- - CodeGroover
我的代码有很多变化,即使你只是在CSS中更改了一个填充或一个字母等。提交消息和所有这些命令的东西都增加了很多工作量。 我还没有尝试过shell脚本。它怎么做呢?谢谢! - Gediminas Šukys
3
“(也不需要提交信息)”http://images.wikia.com/dragonball/images/a/a7/Facepalm_227785.jpg - Ajedi32
2
如果您为每个更改实例都进行提交,则操作不正确。在功能完成或错误解决后执行命令(这可能是单个更改)。 - Mark
显示剩余2条评论
34个回答

334

基于 @Gavin 的回答:

将 lazygit 改为函数而不是别名可以让你传递参数。我已经将以下内容添加到我的 .bashrc (如果是Mac,则为 .bash_profile):

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}
这使您能够提供提交信息,例如
lazygit "My commit msg"

当然,您可以通过接受更多的参数来进一步增强此功能,例如要推送到哪个远程位置或者哪个分支。


16
无需重新启动,只需执行“source .bashrc”即可。 - Sambit Tripathy
34
可以使用$*代替$1,这样就不需要打引号了:lazygit My commit msg - Kai Carver
23
@KaiCarver 很好的想法,但我个人不太喜欢。这样做会阻止您使用多个参数,并且违反了单个带空格字符串参数在引号中包含的常规约定。对我来说,这已经是第二天性(我认为很多开发人员也是如此)。省略引号会感觉不太规范。 - btse
8
懒得git,最好的名字! - user1447414
6
@btse 我是一个外交的人 + 今天是星期五。这是使用 @KaiCarver 建议的函数: function dirtygit() { git add . git commit -a -m "$*" git push } - OnklMaps
显示剩余15条评论

127

我最终在我的.gitconfig文件中添加了一个别名:

[alias]
    cmp = "!f() { git add -A && git commit -m \"$@\" && git push; }; f"

用法:git cmp"长提交消息在此处"

添加所有文件,然后使用注释作为提交消息并将其推送到 origin。

我认为这是更好的解决方案,因为您可以控制提交消息。

该别名还可以从命令行定义,这会将其添加到您的.gitconfig中:

git config --global alias.cmp '!f() { git add -A && git commit -m "$@" && git push; }; f'

7
这正是我一直在寻找的!完美地运行,谢谢!我找不到完整的语法参考或详细的命令列表。!f() { ... }; f具体是做什么的?对这行代码的更深入解释将使答案更好。 - Dmitry Gamolin
4
它定义了函数 f,然后调用它。 - Oliver
2
@Oliver 为什么要加引号?为什么要加感叹号?结尾的 f 是调用函数吗?"$@" 是什么意思? - Philip Rego
@PhilipRego 错了,是 Oliver :p - Oliver
在VSCode PowerShell中出现问题,我无法在提交消息中添加空格:(git cmp“空格无效”,所以我不得不在它们之间添加破折号。如果有什么方法,请让我知道,聪明的头脑们。 - GorvGoyl
显示剩余3条评论

87

虽然我同意韦恩·沃纳对此持怀疑态度,但从技术上讲,这是一种选择:

git config alias.acp '! git commit -a -m "commit" && git push'

这定义了一个别名,以运行commitpush。您可以使用git acp来调用它。请注意,这种“shell”别名始终在您的git存储库根目录下运行。

另一个选择是编写一个后提交钩子来进行推送。

哦,顺便说一下,您确实可以将参数传递给shell别名。如果您想传递自定义提交消息,则可以使用:

git config alias.acp '! acp() { git commit -a -m "$1" && git push ; } ; acp'

当然,现在你需要给出一个提交信息:git acp "我的信息在这里!"


@wlz 我刚刚试了一下,它可以正常工作。请注意整个字符串都在单引号内。 git 会自动添加转义字符(使用 git config -e 进行检查)。 - Tilman Vogel
抱歉,你是对的 :)。我直接编辑了.gitconfig文件。双引号已经用 \ " 转义了。 - wlz
3
为什么这个答案不被接受?它做到了问题所要求的。+1。 - lucid_dreamer
2
在Windows上,我需要转义$1周围的双引号才能从PowerShell中使其工作(使用..."$1"...)。 - DReimer
请更新一个在Windows上也能正常工作的答案。 - ANimator120

49

我在我的.bash_profile中使用这个

gitpush() {
    git add .
    git commit -m "$*"
    git push
}
alias gp=gitpush

它执行起来像

gp A really long commit message

别忘了在保存别名后运行source ~/.bash_profile


1
我真的很喜欢这个。因此,我已经将它采用到我的~/.bash_profile中;) 谢谢.. +1 - AO_
注意别使用别名 gp,因为它会与 Oh-My-Zsh 的 git 插件冲突,该插件使用 gp 来执行 git push - deb

44

我认为你可能误解了git的设计流程。(澄清/更正我的评论,你不需要使用git add .,因为commit -a通常具有相同的目的——添加任何尚未暂存的更改,如果文件已经被添加)

通常情况下,你会执行以下操作:

# make some changes
$ git commit -a -m "Changed something"
# make some more changes
$ git commit -a -m "Changed something else"

洗涤,冲洗,重复,直到你完成了X功能,或者你到了一个停止点,或者你只是想让其他人看到你所做的。然后你就可以

$ git push

Git和SVN不同,但是看起来你正在尝试将其用作SVN。您可能会发现本文末尾的一些资源here对您有所帮助。


7
感谢您对工作流程的解释,但是git add .git commit -a并不是相同的东西 - Gabriele Petronella
9
谢谢您的解释,但是对于那些知道自己在做什么的人来说,如果有这样的命令,GIT不会崩溃。 - Gediminas Šukys
4
经验丰富的程序员会告诉你,那些要求自动提交推送命令的人不知道他们在做什么。使用三阶段代码提交(如果你使用特性分支,则是四阶段)有其原因。 - slebetman
1
@slebetman:我没有解释清楚。对于Facebook应用程序,即使是开发过程中的每个单独更改也必须部署到实时服务器。因此,我们设置了提交挂钩来完成此操作。您进行更改,提交它并在应用程序中查看更改。使用Git,我需要添加、暂存然后推送才能看到单个更改。这不是有点过度吗? - SenG
1
是的,但你不需要提交代码来测试它。你应该先编写一些代码,测试它,然后再提交和推送。在我的经验中,传说中使用本地git提交来提供某种多文件“撤消”功能的情况比实际情况要多得多。 - Joe Strout
显示剩余7条评论

40

你可以使用bash脚本,设置别名来启动任何命令或一组命令。

git commit -am "your message" && git push 

2
如果您希望将此作为答案,那么请添加更多关于它如何工作的评论。仅仅是代码转储的答案通常不受欢迎。请参见[答案]。 - Heretic Monkey
我认为这应该是正确的答案,因为它尽可能简洁地回答了问题。只需在终端中输入即可运行!如果您不想添加别名,另一种选择是创建一个文本扩展器并通过键组合触发它。 - Sentry.co
运行得非常好。我认为这应该是被接受的答案。 - datsb

23
最简单的解决方案是:

git commit -a -m "commit" && git push

git add 已经包含在提交的 -a 参数中,但如果需要,您可以将它们全部连接起来:

git add . && git commit -a -m "commit" && git push

值得考虑将 git pull & 作为第一步添加进去,这样很棒。 - IcedDante
git add不包括在-a选项中,尤其是对于未跟踪的文件:*-a, --all 告诉命令自动暂存已修改和已删除的文件,但未告知git的新文件不受影响。 - undefined

21

在bash中设置别名:

$ alias lazygit="git add .; git commit -a -m '...'; git push;";

称之为:

$ lazygit

要使此别名永久生效,您需要将其包含在您的.bashrc或.bash_profile文件中。


你需要将该别名添加到 .bashrc 或 .bash_profile 中,以使其永久生效。 - Gavin
我认为这个页面可以帮助解释:http://serverfault.com/questions/3743/what-useful-things-can-one-add-to-ones-bashrc - Gavin

11
在Linux/Mac中,这个实用选项也应该有效。
git commit -am "IssueNumberIAmWorkingOn --hit Enter key
> A detail here --Enter
> Another detail here --Enter
> Third line here" && git push --last Enter and it will be there

如果您正在本地创建新的分支,将git push替换为git push -u origin branch_name

如果您想在系统编辑器中编辑提交消息,则

git commit -a && git push 

点击打开编辑器,编辑并保存消息后会自动推送。


8
你可以尝试使用 gitu
首次使用(需安装 node js):
npm install -g git-upload

之后:
gitu COMMIT_MSG

同时执行这三个命令。

好消息是,当您重新安装系统或想在不同的计算机上进行此操作时,无需担心任何文件修改。这也可以在不同的平台上使用(不仅限于Linux和Mac,还包括Windows下的命令提示符,如cmdpowershell),只需要安装npmnodejs(当然还有git)即可。


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