【问题标题】:How do I prevent git push <branch> from pushing unless I am checked out on that branch?除非我在该分支上签出,否则如何防止 git push <branch> 推送?
【发布时间】:2012-08-13 18:52:00
【问题描述】:

我遇到的问题是我的手指会自动输入git push origin master。如果我正在处理new-branch 并且打算输入git push origin new-branch 并且master 上有未推送的更改,它们将被意外推送。有什么方法可以防止这种情况,让我只能推送到当前分支吗?

【问题讨论】:

    标签: git


    【解决方案1】:

    您可以使用git-config 中的push.default 设置指定git push 在没有给出参考规范的情况下做什么。三种模式适合您的情况:

    simplecurrentupstream 模式适用于那些想要在完成工作后推出单个分支的人,即使其他分支尚未准备好推出。

    请注意,此设置仅在没有给出 refspec 的情况下生效,即运行 git push 而没有进一步的参数。 git push origin master 仍会将master 推送到origin

    根据经验,您应该始终创建单独的工作分支,并且永远不要将中间结果提交到您的主分支。 git flow 简化了这个工作流程。

    来自documentation

    push.default

    定义git push 在命令行上没有给出 refspec、远程中没有配置 refspec 并且命令行上给出的任何选项都没有暗示 refspec 时应该采取的操作。可能的值是:

    • nothing - 不要推任何东西。

    • matching - 在两端推送所有具有相同名称的分支。这适用于那些将所有分支准备成可发布的形状,然后用一个命令将它们推出的人。它不适合推送到由多个用户共享的存储库,因为如果其他用户更新了分支,本地停滞的分支将尝试非快进推送。 + 这是目前的默认值,但 Git 2.0 会将默认值更改为 simple

    • upstream - 将当前分支推送到其上游分支(tracking 是已弃用的同义词)。这样,git push 将更新与git pull 合并的远程引用相同的远程引用,使pushpull 对称。上游分支的配置方法见“branch..merge”。

    • simple - 类似于upstream,但如果上游分支的名称与本地分支不同,则拒绝推送。这是最安全的选择,非常适合初学者。它将成为 Git 2.0 中的默认设置。

    • current - 将当前分支推送到同名分支。

    【讨论】:

    • 另外,如果您对不带参数更改git push 的行为不感兴趣,您可以为所有分支设置上游分支并使用git push HEAD 推送当前签出的分支。跨度>
    • @MarcinK 啊,这也很聪明,除非你一直在分支之间移动并且HEAD 在其他地方。
    • @Adam 我从您的问题中了解到,您总是想推送当前分支。 HEAD 总是在当前分支。
    【解决方案2】:

    您想将 git 升级到 1.7.11 或更高版本,并使用“简单”push.default:

    o    simple - like upstream, but refuses to push if the upstream branch's name is different from the local one. This is the safest option and is
         well-suited for beginners. It will become the default in Git 2.0.
    

    这将完全避免您的问题。请注意,它也将成为 Git 2.0 中的默认选项。您可以通过以下方式启用它:

    git config push.default simple
    

    【讨论】:

    • 这听起来和我要找的完全一样。我会尝试一下:)
    • 其实这也不是解决办法,git push origin master还是推master->master而不是什么都不做。
    • 啊,是的,没有默认选项会阻止您显式推送指定的 ref,但是启用此选项后,您可以在不带任何参数的情况下发出 git push 并让它在跟踪远程分支的分支上正常工作.
    • 我想这正是您想要重新训练手指的方式。您想使用 git 别名,还是不在命令中使用参数?
    • 我最终可能会创建一个别名,强制我输入mygitpush remote branch,但禁止推送到非活动分支,然后隐藏git push。我喜欢被强迫直言不讳,否则我会搞砸的。
    【解决方案3】:

    您可以创建一个别名,例如,gitpushcurrent,指向git push origin $(git branch | grep "*" | sed "s/* //")

    然后重新训练您的手指以自动键入 gitpushcurrent 而不是 git push origin master。因此您无需考虑当前分支是什么。

    【讨论】:

    • 这是我的第一个想法,但我认为可能有一种内置的方法。据我所知,这是最好的解决方案。
    【解决方案4】:

    我使用 Git 已经有几天了,但顺便说一句,您可以:

    1. 注意您使用键盘输入的内容。 Git 功能强大,而且,如果您的手指训练有素,可以自动输入任何内容,您可能会造成很大的损失,例如删除您的工作分支,或者在您不想要的时候合并分支。永远小心。

    2. aliases 用于您的命令。它们非常强大,可以节省您的时间,防止您制作您并不真正想要的东西。

    3. 阅读一些有趣且有用的主题,例如 this SO question 或 this 一个关于 ServerFault 的问题。

    【讨论】:

      【解决方案5】:

      git -g config push.default 当前

      【讨论】:

        【解决方案6】:

        这个问题和“Confirmation of git push command”很相似

        而且,我也将在这里提出same solution

        您所需要的只是提交到“master”等受保护分支的预挂钩。

        "how-to-prevent-push-to-master" 上的这个博客应该对您有所帮助。

        PS:需要 GIT 1.8.2 或更高版本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-13
          • 2012-07-15
          • 2019-05-09
          • 1970-01-01
          • 1970-01-01
          • 2016-04-25
          • 2013-08-15
          • 1970-01-01
          相关资源
          最近更新 更多