【问题标题】:Force push current branch强制推送当前分支
【发布时间】:2012-07-12 07:40:24
【问题描述】:

我经常 rebase 功能分支,然后想强制将它们推送到服务器。

git push --force origin feature-mongodb-support

git push --force origin <current branch>有什么快捷方式吗?

【问题讨论】:

  • 我总是设置配置/跟踪,以便 git push 单独推送到默认的远程跟踪分支。如果你能做到这一点,你可以去git push -f? (只是好奇:如果你推送一个糟糕的 rebase,你在这个工作流程中的备份计划是什么?我假设你是唯一一个在这些功能分支上工作的人?)
  • 这个问题不是专门针对常用的git push -f origin <current branch name>构造中如何去掉当前分支名称的吗?然后接受的答案完全没有抓住重点,@Mike 的评论应该是接受的答案。
  • 我认为最好的答案是将其设置为默认值:git config --global push.default current(来自here)。

标签: git git-push git-alias


【解决方案1】:

您可以使用别名来缩短命令。像这样使用它:

git config --global alias.fpush "push --force origin"

现在要推送你的分支,只需输入:

git fpush feature-mongodb-support

或者您甚至可以将分支名称硬编码到命令中:

git alias fpush "push --force origin feature-mongodb-support"

并仅使用git fpush 将您的宝贵工作推送到上游。

但是,非快进更新是危险的,因为您基本上会覆盖服务器上发生在最后一次合并/变基到本地分支和强制推送之间发生的所有历史记录。如果您需要经常执行这些操作,那么您的工作流程中肯定有出了点问题

【讨论】:

  • 我是唯一一个在功能分支上工作的人。我只想保持功能分支可以快速转发到主分支,以使我的生活更轻松。这有什么问题吗?
  • 是的,这是有风险的。您将只用一个命令覆盖您的分支。更好的一点是在功能完成后以交互方式将您的功能分支重新设置在主分支之上。您的 master 中仍然有干净的历史记录,并且不会有所有这些覆盖的风险。
  • 我这样做是因为我需要合并来自 master 分支的新更改,以测试新功能是否仍然适用于新的 master 代码。风险在哪里?
  • 风险在于用一些错误的代码覆盖远程分支(连同它的历史)并丢失你以前的工作。如果这与您无关 - 只需使用答案中的解决方案。
  • 如果您遵循此建议并在您的 git 别名中包含远程名称(通常为 origin),您可能会遇到 bash [tab] 完成仍然尝试添加远程而不是直接跳到的问题提供分行名称。要解决此问题,请在采购 bash_completion 之后在 ~/.profile 中定义您自己的自定义替换函数:_git_fpush() { _git_branch; }(其中“fpush”与您的 git 别名的名称匹配。)这将导致 bash 将您的别名视为与 branch 相同命令。
【解决方案2】:

在阅读了这些答案并阅读了相关问题的答案 (https://stackoverflow.com/a/18782415/586) 后,我创建了此别名以根据当前分支名称强制推送到 origin

fp = "!git push -f origin \"$(git rev-parse --abbrev-ref HEAD)\""

【讨论】:

  • 如果远程分支(我们推送到的)与本地分支的名称不同,这将如何工作?
  • @user1021726 它没有。
  • 这是涵盖整个问题的答案......但本地分支和远程分支需要具有相同名称的限制。
【解决方案3】:

您可以通过设置 push.default 属性来更改默认行为:

git config --global push.default current

然后:

git push -f

将强制推送到您当前的分支。

这是来自http://schacon.github.io/git/git-config.html的复制/粘贴:

push.default

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

  • 什么都没有 - 不要推动任何东西。

  • 匹配 - 推送所有匹配的分支。在两端具有相同名称的所有分支都被认为是匹配的。这是默认设置。

  • upstream - 将当前分支推送到其上游分支。

  • tracking - 已弃用的上游同义词。

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

【讨论】:

  • 工作精美,完全按照 OP 的要求执行。谢谢!
【解决方案4】:

如果你使用oh my zsh,你可以这样做

ggfl

它会为你做这件事

git push --force-with-lease origin <your_argument>/$(current_branch)

https://github.com/robbyrussell/oh-my-zsh/wiki/Cheatsheet

【讨论】:

    【解决方案5】:

    这应该可以解决问题:

    git alias fpush "push --force origin"
    

    这将使您可以使用 git fpush 作为更短的替代方案。

    【讨论】:

    • 除非我弄错了,否则这会推送 all 碰巧有本地更改的分支,包括潜在的主分支或完全不相关的分支,而不仅仅是当前分支。加上强推,这是极其危险的。
    【解决方案6】:

    为了自动强制推送到被跟踪的分支(不管它的名称和上游),我设计了这个别名:

    fbrpush=!git push $(git rev-parse --abbrev-ref=loose --symbolic-full-name @{upstream} \
                        | sed 's:/: +:')
    

    (为了便于阅读,换行)

    (基于another SO answer

    【讨论】:

      【解决方案7】:

      当前分支名称也可以自动推断出来。

      我使用一个小的 shell 脚本来强制推送到当前分支:

      git branch | grep '*' | awk '{print $2}' | xargs -I % git push origin % -f
      

      命令git branch*符号标记当前分支,所以我们可以用grep '*'得到相关行并解析得到分支名称。

      那么快捷命令可以定义为.bashrc.zshrc中的别名:

      alias gfp=/path/to/script
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 2022-01-15
        • 1970-01-01
        • 2012-12-11
        • 1970-01-01
        • 2015-12-15
        相关资源
        最近更新 更多