git 强制推送到分支的别名

git alias for force pushing to branch

我有这个命令,我通常 运行 强制将我的更改推送到远程 b运行ch:

git push --force origin head:{remote-branch}

我想创建一个 git 别名,这样我就可以输入

git pfr {remote-branch}

同样的效果

我尝试将其添加到我的 .gitconfig 文件中:

pfr = push --force origin head:

但是当我 运行 git pfr {remote-branch} 使用别名时出现这个错误:

fatal: invalid refspec 'head:'

有什么想法可以实现我想要的吗?

在您的存储库中,打开终端并输入

git config --local --replace-all alias.pfr "push origin -f"

如果您希望您的别名在全球范围内存在,您可以使用 --global 选项。

git config --global --replace-all alias.pfr "push origin -f"

--replace-all 仅替换配置中先前存在的名为 pfr 的任何其他别名。

之后,您将能够做到:

git pfr branchName

并且对应的分支会被强制推送到远程

注意:如果您的分支正在被其他同事使用,则强制将分支推送到远程可能不是一个好主意,因为如果您在本地重写历史并强制推送,您的同事在尝试 merge/rebase 与您的分支。

希望对您有所帮助!

这里的问题是别名被扩展,然后附加参数作为 单独的词出现在它后面。 也就是说,prf 扩展为:

push --force origin head:

这样命令git pfr foo就变成了:

git push --force origin head: foo

而不是您想要的命令,它是:

git push --force origin head:foo

(注意此处缺少 space——分支名称 foo 与字符串 head: 连接为一个单词)。

这种 more-fancy 别名扩展需要比 Git 的别名处理更强大的功能。您可以放弃,或者使用 shell 别名。

虽然这有点棘手。为了说明这一点,这里有一个 shell 别名,前面带有命令 echo,它会打印它会做什么,而不是执行它:

prf = !echo git push --force origin head:

当我 运行 这样做时,它揭示了第一次尝试的问题:

$ git prf asdf
git push --force origin head:asdf asdf

</code> 扩展到第一个参数,并将其作为组合 single-word 表达式的一部分放入,因此它变成了 <code>head:asdf。但是 </code> 参数又重复了!那是因为 Git 传递了命令 <kbd>git push --force origin head:$1</kbd> 作为 shell 应该 运行 的命令,然后 <kbd>asdf</kbd> 作为该命令的第一个参数。 shell 扩展了 <code>,然后也保留了参数,因此 asdf 现在重复了。

要解决这个问题,我们需要让 shell 调用一个 shell 函数:

prf = "!f() { echo git push --force origin head:; }; f"

(因为这包含其他特殊字符,我们也需要引用整个内容。)运行 this 产生:

$ git prf asdf
git push --force origin head:asdf

这表明如果删除 echo,它将做正确的事情。

请注意,如果您不为 </code> 提供一个参数,shell 无论如何都会将其扩展为空字符串。如果您提供额外的参数(将变为 <code> 等),它们将被丢弃。所以总的来说,这个别名非常脆弱,整个方法并不是一个好的方法。只要您记住它的局限性,它就适合您的特定用例——但一般来说,您应该编写 Git scripts,而不是编写花哨的别名,在其中编写一个完整的程序(在 sh / bash 中)检测和处理 所有 它的参数,检查不正确的使用,等等。

最后,请注意永远不要使用小写 head 来指代当前的提交或分支。您应该始终将其写成大写,如 HEAD。您可以 在 Windows 和 MacOS 上使用小写变体 ,但事实证明,即使在那里,如果您使用 git worktree add,小写变体的行为也很糟糕。如果您觉得输入 HEAD 太麻烦,请记住 @ 是一个有效的同义词,因此您可以直接输入 HEAD 或其 not-very-portable 表亲 head 而不是输入一个字符 @.