让 "git pull" 在拉取不同分支时要求确认

8
在同时处理许多项目和分支时,有时候会犯一些愚蠢的错误,比如拉取到了错误的分支。例如,在master分支上执行git pull origin dangerous_code,并且很长一段时间内都没有注意到这个错误。这个小错误导致了很多麻烦。
是否有任何方法可以使git在尝试拉取当前未检出分支之外的分支时要求确认?基本上,如果分支名称与当前检出的分支不匹配,我希望它能要求确认。

有没有办法让git在我尝试拉取当前分支以外的分支时要求确认?不幸的是,远程分支的名称可能与跟踪它的本地分支的名称不同。但你可以检查当前分支的上游(如果有的话)是否对应于你正在尝试拉取的分支。这个方法对你有用吗? - jub0bs
1
不幸的是,远程分支的名称可能与跟踪它的本地分支名称不同。好吧,但这不是很常见吗?至少在我工作的环境中从来没有发生过。 - SiliconMind
好的,但这不是很常见吗?根本不是:git push -u origin master:jubobs 将把 master 的上游设置为 origin/jubobs。我在这里提到这一点,因为对于您的问题,一个强大的解决方案应该覆盖这种情况。您可能想要根据这些信息重新制定您的问题。 - jub0bs
然而,这仍然不是我的问题。为了简单起见,让我们只关注检查分支名称,好吗? - SiliconMind
1个回答

5
现在,我将专注于如何在执行任何拉取操作之前提示用户确认。
不幸的是,因为没有所谓的预拉取钩子,我认为你不能直接让实际的pull命令为你执行此操作。我认为你有两个选择:
1- 使用fetch然后使用merge(而不是pull)
不要运行git pull,而是运行git fetch,然后运行git mergegit rebase;将pull分解为它自然包含的两个步骤将迫使您仔细检查要合并/变基的内容。
2- 定义一个别名,在拉取之前询问确认
定义并使用一个pull包装器(作为Git别名),如果您尝试从名称与当前本地分支不同的远程分支拉取,则提示您进行确认。
请在~/bin/目录下创建一个名为git-cpull.sh(代表确认后拉取)的脚本文件,并加入以下内容:
#!/bin/sh

# git-cpull.sh

if [ "$2" != "$(git symbolic-ref --short HEAD)" ]
then
    while true; do
        read -p "Are you sure about this pull?" yn
        case "$yn" in
            [Yy]*)
                git pull $@;
                break
                ;;
            [Nn]*)
                exit
                ;;
            *)
                printf %s\\n "Please answer yes or no."
        esac
    done
else
    git pull $@
fi

然后定义别名:
git config --global alias.cpull '!sh git-cpull.sh'

之后,如果您运行例如:

git cpull origin master

但是当前分支不是主分支master,在实际执行任何pull操作之前,您将被要求确认。

示例

$ git branch
* master
$ git cpull origin foobar
Are you sure about this pull?n
$ git cpull origin master
From https://github.com/git/git
 * branch            master     -> FETCH_HEAD
Already up-to-date.

实际上,第二个选项对我来说完全没问题。 - SiliconMind
有没有办法让Git在我尝试拉取当前检出的本地分支所跟踪的远程分支之外的分支时要求确认? 有的 :) 基本上,如果分支名称不匹配(被检出和正在被拉取的分支),我希望它要求确认。这就是我需要的全部内容。 - SiliconMind
这不是我的问题的答案。但我认为可以在你的脚本中调用 git statusgit branch |grep "*" 来查看当前分支,并将其与命令行中的分支进行匹配。 - SiliconMind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接