我经常将特性分支做变基操作,然后想强制推送到服务器。
git push --force origin feature-mongodb-support
有没有可以简化 git push --force origin <当前分支>
的快捷方式?
您可以使用别名来缩短命令。像这样使用:
git config --global alias.fpush "push --force origin"
现在只需要输入以下命令即可推送您的分支:
git fpush feature-mongodb-support
或者您甚至可以将分支名称硬编码到命令中:
git alias fpush "push --force origin feature-mongodb-support"
并且只使用git fpush
将你的宝贵工作推送到上游。
然而,非快进式更新是危险的,因为您基本上会覆盖掉在最后一次合并/变基到您的本地分支和强制推送之间在服务器上发生的所有历史记录。如果您经常需要执行此操作,则工作流程中肯定存在问题。
origin
),你可能会遇到bash [tab]
自动补全仍然尝试添加远程而不是直接跳转到提供分支名称的问题。为了解决这个问题,在source bash_completion之后在~/.profile
中定义你自己的自定义替换函数:_git_fpush() { _git_branch; }
(其中"fpush"匹配你的git别名的名称)。这将使bash将你的别名视为与“branch”命令相同。 - beporterorigin
:fp = "!git push -f origin \"$(git rev-parse --abbrev-ref HEAD)\""
git config --global push.default current
git push -f
该命令将强制推送到您当前的分支。
以下是来自http://schacon.github.io/git/git-config.html的复制/粘贴:
push.default
定义当没有在命令行上给定refspec、远程没有配置refspec,也没有通过命令行上给定的任何选项暗示refspec时,git push应采取的操作。 可能的值为:
nothing - 不推送任何东西。
matching - 推送所有匹配的分支。在双方都具有相同名称的所有分支都被视为匹配。这是默认设置。
upstream - 将当前分支推送到其上游分支。
tracking - 上游的废弃同义词。
current - 将当前分支推送到同名的分支。
ggfl
git push --force-with-lease origin <your_argument>/$(current_branch)
这应该能解决问题:
git alias fpush "push --force origin"
git fpush
作为缩写的替代方式。fbrpush=!git push $(git rev-parse --abbrev-ref=loose --symbolic-full-name @{upstream} \
| sed 's:/: +:')
(为了易读性,此处换行)
(基于另一个SO答案)
当前分支名称也可以自动推断出来。
我使用一个小的 shell 脚本来强制推送到当前分支:
git branch | grep '*' | awk '{print $2}' | xargs -I % git push origin % -f
命令git branch
会在当前分支上打上*
符号,因此我们可以使用grep '*'
获取相关行并解析以获取分支名称。
然后,快捷命令可以在.bashrc
或.zshrc
中定义为别名:
alias gfp=/path/to/script
更新。
自Git 2.22版本以来(请参见此答案:stackoverflow.com/a/6245587/1326411),可以简化为:
alias git-fp='git branch --show-current | xargs -I % git push origin % --force-with-lease'
为了进一步阐述@jlleblanc的好答案,如果您想添加保护措施以防止强制推送到主分支(这可能非常难以撤消)
[alias]
fp = "!branch=$(git branch --show-current); [[ -z $branch || $branch = 'master' ]] && echo 'Command cannot be used on master branch or when not on branch.' || git push -f origin \"$(git rev-parse --abbrev-ref HEAD)\""
它将做相同的事情,只是如果当前分支是主分支,它将跳过并打印警告。
git push
仅推送到默认的远程跟踪分支。如果你能做到这一点,你可以使用git push -f
吗?(只是好奇:如果你推送了一个错误的rebase,你在这个工作流程中有备份计划吗?我假设你是唯一在这些特性分支上工作的人?) - mpontillogit push -f origin <current branch name>
结构中摆脱当前分支名称吗?那么被接受的答案完全错过了重点,@Mike的评论应该被接受为答案。 - AndreKRgit config --global push.default current
(来自这里)。 - orad