【问题标题】:git add, commit and push commands in one?git add、commit 和 push 命令合二为一?
【发布时间】:2013-11-04 21:07:30
【问题描述】:

有什么办法可以将这三个命令合二为一吗?

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

有时我只更改一个字母、CSS 填充或其他内容。不过,我必须编写所有三个命令来推动更改。有很多项目我只是一个推动者,所以这个命令会很棒!

【问题讨论】:

  • 你试过写一个shell脚本吗?
  • 我的代码有很多变化,当你只改变css中的一个填充,或者一个字母等等。提交消息和所有这些命令的东西增加了很多工作。没有尝试过shell脚本。怎么做?谢谢!
  • 如果您对每个更改实例都进行提交,那么您做错了。当您完成功能或解决错误时执行命令(这可能是一次更改)

标签: git


【解决方案1】:

基于@Gavin 的回答:

让lazygit 成为一个函数而不是一个别名,这样你就可以给它传递一个参数。我已将以下内容添加到我的 .bashrc(如果是 Mac,则为 .bash_profile):

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

这允许您提供提交消息,例如

lazygit "My commit msg"

您当然可以通过接受更多参数来进一步加强这一点,例如要推送到哪个远程位置或哪个分支。

【讨论】:

  • 不需要重启,直接做"source .bashrc"
  • 可以使用$* 而不是$1 来节省输入引号:lazygit My commit msg
  • @KaiCarver 不错的想法,但我个人不喜欢它。它会阻止您使用多个 args,并且也违反了单个字符串 arg 的常规约定,其中空格用引号引起来。在这一点上,这是我的第二天性(我假设有很多开发人员)。省略引号感觉很脏。
  • lazygit,有史以来最好的名字!
  • @btse 我是个外交官 + 今天是星期五。这是使用@KaiCarver 建议的函数:function dirtygit() { git add . git commit -a -m "$*" git push }
【解决方案2】:

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

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

用法:git cmp "Long commit message goes here"

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

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

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

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

【讨论】:

  • 这正是我一直在寻找的!完美运行,谢谢!我找不到完整的语法参考或详细的命令列表。 !f() { ... }; f究竟做了什么?对该行的更多解释将使答案更好。
  • @DmitriyDemir 定义函数f,然后调用它。
  • 效果很好。我在开头添加了git pull,以便减少合并。
  • @Oliver 为什么用引号括起来?为什么会有感叹号?最后的 f 是否调用该函数?什么是“$@”?
  • @PhilipRego 错了奥利弗:p
【解决方案3】:

虽然我同意 Wayne Werner 的疑问,但从技术上讲,这是一种选择:

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 "My message goes here!"

【讨论】:

  • @wlz 我刚试了一下,效果很好。请注意,整个字符串都在单引号内。 git 自动添加了转义符(使用 git config -e 检查)。
  • 对不起,你是对的:)。我直接编辑 .gitconfig 文件。 " 已经用 \" 转义了。
  • 为什么这不是公认的答案?它做了被问到的事情。 +1。
  • 在 Windows 上,我需要转义 $1 周围的双引号以使其在 PowerShell 中工作(使用 ... \"$1\" ...)
  • 请更新一个适用于 Windows 的答案
【解决方案4】:

我在我的 .bash_profile 中使用它

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

它的执行方式

gp A really long commit message

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

【讨论】:

  • 我真的很喜欢这个。 ...因此将其纳入我自己的 ~/.bash_profile ;) 谢谢.. +1
  • 小心别名gp。它会与 Oh-My-Zsh 的 git 插件冲突,其中 gp 用于 git push
【解决方案5】:

我认为您可能误解了 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 - 但您似乎正在尝试使用它。您可能会发现文章末尾的一些资源here 很有用。

【讨论】:

  • +1 了解有关工作流程的说明。但是git add .git commit -a are not the same thing
  • 谢谢你的解释,但是如果有这样的命令给那些知道自己在做什么的人,GIT不会崩溃...
  • @Lucas:有经验的程序员会告诉你,要求自动提交-推送命​​令的人不知道他们在做什么。 3 阶段代码签入是有原因的(如果您使用的是功能分支,则为 4 阶段)。
  • @slebetman:我没有正确解释。使用 facebook 应用程序,每一个更改都必须部署到实时服务器,即使是用于开发。所以,我们设置了提交钩子来做到这一点。您进行更改,提交并在您的应用程序中查看更改。使用 git,我需要添加、暂存然后推送它以查看单个更改。看起来是不是有点矫枉过正?
  • 是的,但您也不需要提交测试代码。您应该编写一些代码,对其进行测试,然后然后 提交和推送。根据我的经验,传说中使用本地 git 提交来提供某种多文件“撤消”功能在传说中的使用比在现实中要多得多。
【解决方案6】:

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

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

【讨论】:

  • 如果您希望将此作为答案,请添加有关其工作原理的更多评论。只是代码转储的答案通常不受欢迎。见How to Answer
  • 我认为这应该是正确的答案。因为它尽可能简洁地回答问题。只需将其输入终端即可!如果您不想添加别名,另一种选择是简单地创建一个 textExpander 扩展并通过组合键触发它。
  • 效果很好。我认为这应该是公认的答案。
【解决方案7】:

在 bash 中设置为别名:

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

叫它:

$ lazygit

(要使此别名永久化,您必须将其包含在您的 .bashrc 或 .bash_profile 中)

【讨论】:

【解决方案8】:

最简单的解决方案是:

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

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

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

【讨论】:

    【解决方案9】:

    在 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 
    

    将打开编辑器,一旦您保存消息,它也会推送它。

    【讨论】:

      【解决方案10】:

      你可以试试gitu

      第一次(必须安装node js):

      npm install -g git-upload
      

      之后:

      gitu COMMIT_MSG
      

      同时发出这三个命令。

      好处是您在重新安装系统或想在不同的计算机上执行此操作时不必担心,并且不需要修改文件。 这也适用于不同的平台(不仅是 Linux 和 Mac,还包括 Windows 下的命令提示符,如 cmdpowershell)只是你必须安装 npmnodejs (@ 987654328@ 当然)。

      【讨论】:

        【解决方案11】:

        如果文件已经被跟踪,那么你不需要运行git add,你可以简单地写git commit -am 'your message'

        如果你不想写提交信息,你可以考虑做类似的事情

        git commit --allow-empty-message -am ''

        【讨论】:

          【解决方案12】:

          This Result - 试试这个: git add、git commit 和 git push 的简单脚本一个命令

          在 Windows 上打开您的 CMD 并粘贴此答案

          git commit -m "your message" . && git push origin master

          这个例子我的图片截图: https://i.stack.imgur.com/2IZDe.jpg

          【讨论】:

            【解决方案13】:

            我使用批处理文件:

            @ECHO OFF
            SET /p comment=Comment:
            git add *
            git commit -a -m "%comment%"
            git push
            

            【讨论】:

            • probs 如果您从命令行接受 args 会更容易。我只是去“lezygit MESSAGE”等。它很酷!
            【解决方案14】:

            正如this 回答中提到的,您可以创建一个 git 别名 并为其分配一组命令。在这种情况下,它将是:

            git config --global alias.add-com-push '!git add . && git commit -a -m "commit" && git push'
            

            并与它一起使用

            git add-com-push
            

            【讨论】:

            • 这不会为之前的任何答案添加任何内容。
            • 对不起,你是对的。我想我没有注意到蒂尔曼沃格尔的答案和我的一样。我应该删除它吗??
            【解决方案15】:

            用下面的代码编写一个名为 gitpush.sh 的小脚本,并将其添加到您的 ~ 目录中。

            echo $1
            git add .
            git commit -m "$1"
            git push
            

            现在在 ~/.bashrc 中添加一个别名,如下所示:

            alias gitpush='~/gitpush'
            

            现在从任何 git 存储库中只需编写 gitpush "message" 。

            【讨论】:

              【解决方案16】:

              对于 macOS 用户:

              1. 打开您的 TerminaliTerm2 或您使用的其他终端。

              2. 使用命令 ~/ 移动到您的用户配置文件文件夹。这是.bash_profile 文件的默认文件夹:

                1234563 /li>
              1. 现在您可以对文件进行简单的更改。粘贴这些代码行以更改终端提示:

              function lazygit() {
                  git add .
                  git commit -a -m "$1"
                  git push
              }
              

              1. 现在输入ctrl + o 保存您的更改,然后按回车键保存。然后输入ctrl + x 退出nano

              2. 现在我们需要激活您的更改。输入source .bash_profile(或. ~/.bash_profile)并观察您的提示变化。

              3. 在 iTerm2 中,Preferences/Profiles/General/Command 设置为 Login ShellSend text at start 设置为 source ~/.bash_profile。因此,您无需在每次 macOS 重新启动后手动进行。

              凭据:https://natelandau.com/my-mac-osx-bash_profile

              【讨论】:

                【解决方案17】:

                如果您使用的是 Mac:

                1. 启动终端并输入cd ~/ 进入您的主文件夹

                2. 输入 touch .bash_profile 以创建您的新文件。

                3. 用你最喜欢的编辑器编辑.bash_profile(或者你可以只输入 open -e .bash_profile 在 TextEdit 中打开)。

                4. 将以下内容复制并粘贴到文件中:

                function lazygit() {
                    git add .
                    git commit -a -m "$1"
                    git push
                }
                

                在此之后,重新启动您的终端并简单地添加、提交和推送一个简单的命令,例如:

                lazygit "This is my commit message"
                

                【讨论】:

                  【解决方案18】:

                  对于 MAC VSC 用户,最佳设置是:

                  1) 按 'shift+cmd+P' 并输入:

                  Shell Command: install 'code' command in PATH
                  

                  按 ENTER(这将安装代码命令以轻松访问 bash_profile)

                  2 ) 你现在可以运行:code ~/.bash_profile 打开空的 bash_profile

                  3) 在那里输入一个新函数:

                  function lazygit() {
                      git add .
                      git commit -m "$*"
                      git push
                  }
                  

                  4) 现在重新启动 VSC

                  5) 进行更改,保存并输入lazygit message 以同时运行三个命令

                  【讨论】:

                    【解决方案19】:

                    上面的脚本有一些问题:

                    shift“移除”参数$1,否则,“push”会读取它并“误解”。

                    我的建议:

                    git config --global alias.acpp '!git add -A && branchatu="$(git symbolic-ref HEAD 2>/dev/null)" && branchatu=${branchatu##refs/heads/} && git commit -m "$1" && shift && git pull -u origin $branchatu && git push -u origin $branchatu'

                    【讨论】:

                      【解决方案20】:

                      当你想要 git commit 的类似 svn 的行为时,在你的 .gitconfig 中的 git 别名中使用它

                      commit = "!f() { git commit \"$@\" && git push; };f"

                      【讨论】:

                        【解决方案21】:

                        如果您使用的是鱼壳(基于 btse 的回答):

                        在“~/.config/fish/functions”中将此文件保存为“quickgit.fish”。如果目录不存在,则创建该目录。 '--git-dir=$PWD/.git' 确保我们针对调用函数的 git 项目运行 git 命令

                        function quickgit # This is the function name and command we call
                            git --git-dir=$PWD/.git add . # Stage all unstaged files
                            git --git-dir=$PWD/.git commit -a -m $argv # Commit files with the given argument as the commit message
                            git --git-dir=$PWD/.git push # Push to remote
                        end
                        

                        重新启动终端,导航到项目,进行更改,现在您可以调用'quickgit“示例消息”'。 现在将添加、提交和推送更改:)。

                        也可以在这里找到 Gist:https://gist.github.com/Abushawish/3440a6087c212bd67ce1e93f8d283a69

                        【讨论】:

                          【解决方案22】:

                          已经有很多好的解决方案,但这里有一个我觉得更适合我想要的工作方式的解决方案:

                          我在我的路径中放置了一个名为“git-put”的脚本,其中包含:

                          #!/bin/bash
                          git commit "$@" && git push -u
                          

                          这让我可以运行:

                          git put -am"我的提交信息"

                          ..添加所有文件,提交并推送它们。

                          (我还添加了“-u”,因为无论如何我都喜欢这样做,即使它与此问题无关。它确保始终设置上游分支以进行拉取。)

                          我喜欢这种方法,因为它还允许使用“git put”而不添加所有文件(跳过“-a”),或者使用我可能想要传递的任何其他选项来提交。此外,“put”是“push”和“commit”的缩写

                          【讨论】:

                            【解决方案23】:

                            我喜欢运行以下命令:

                            git commit -am "message";git push
                            

                            【讨论】:

                            • 我认为;应该在你的命令中替换为&&,因为只有在前一个命令没有错误的情况下,后者才会执行git push命令。跨度>
                            【解决方案24】:

                            如果你使用 VSCode,你可以下载 this 扩展,它可以让你通过一个简单的键盘快捷键来完成。

                            【讨论】:

                              【解决方案25】:

                              我为命令做了这个 .sh 脚本

                              #!/bin/sh
                              cd LOCALDIRECTORYNAME/  
                              git config --global user.email "YOURMAILADDRESS"
                              git config --global user.name "YOURUSERNAME"
                              git init
                              git status
                              git add -A && git commit -m "MASSAGEFORCOMMITS"
                              git push origin master
                              

                              【讨论】:

                                【解决方案26】:

                                由于问题没有指定哪个外壳,这里是基于早期答案的 eshell 版本。这在 eshell 别名文件中,它可能在 ~/.emacs.d/eshell/alias 我已经添加了第一部分 z https://github.com/rupa/z/ 让你快速 cd 到一个目录,这样无论如何都可以运行你当前的目录是什么。

                                alias census z cens; git add .; git commit -m "fast"; git push
                                

                                【讨论】:

                                  【解决方案27】:

                                  添加~/.bash_profile 用于添加、提交和推送,只需一个命令即可:

                                  function g() { git commit -a -m "$*"; git push; }
                                  

                                  用法:

                                  g your commit message
                                  g your commit message 'message'
                                  

                                  尽管您不能在提交消息中使用分号或括号(允许使用单引号),但不需要引号。如果您想要其中任何一个,只需在您的消息中加上双引号,例如:

                                  g "your commit message; (message)"
                                  

                                  要在您的消息中创建评论,请执行以下操作:

                                  g "your commit message:
                                  > your note"
                                  

                                  还有一个以类似方式添加和提交的功能:

                                  function c() { git add --all; git commit -m "$*"; }
                                  

                                  工作方式与g 功能完全相同,并且具有相同的约束。只需输入c 即可。 例如

                                  c your commit message
                                  

                                  您还可以添加别名用于推送到远程:

                                  alias p='git push'
                                  

                                  用法:

                                  p
                                  

                                  这相当于 2 个字母,cp 您在使用 git 存储库时使用。或者您可以使用g 来代替只用一个字母完成所有操作。

                                  别名和函数的完整列表: https://gist.github.com/matt360/0c5765d6f0579a5aa74641bc47ae50ac

                                  【讨论】:

                                    【解决方案28】:

                                    lazygit 答案的基础上,以下解决方案添加了用户检查以在推送之前验证更改。如果取消,它将恢复命令。当且仅当本地仓库发生变化时,所有这些都会发生。

                                    ### SAFER LAZY GIT
                                    function lazygit() {
                                      git add .
                                      if git commit -a -m "$1"; then
                                        read -r -p "Are you sure you want to push these changes? [y/N]} " response
                                        case "$response" in
                                          [yY][eE][sS]|[yY])
                                            git push
                                            ;;
                                          *)
                                            git reset HEAD~1 --soft
                                            echo "Reverted changes."
                                            ;;
                                        esac
                                      fi
                                    }
                                    

                                    【讨论】:

                                      【解决方案29】:

                                      这非常适合命令分组。

                                      Grouping Commands

                                      { 列表; } 在大括号之间放置命令列表会导致列表在当前 shell 上下文中执行。没有创建子shell。列表后面的分号(或换行符)是必需的。

                                      legit(){ git add --all; git commit -m "$1"; git push origin master; }
                                      legit 'your commit message here'
                                      

                                      【讨论】:

                                      • 如果提交消息之间有空格,这将不起作用
                                      【解决方案30】:

                                      我发现 this yolo 别名在我懒惰的时候甚至向提交提交随机评论都很棒。它开箱即用,效果很好,所以我只做git yolo,我的所有更改都会自动推送。

                                      【讨论】:

                                        猜你喜欢
                                        • 1970-01-01
                                        • 2012-11-23
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2017-12-30
                                        • 2018-02-14
                                        相关资源
                                        最近更新 更多