有未跟踪的修改时,如何防止在git中切换分支?

时间:2018-09-04 15:51:59

标签: git

如果我有未提交的更改将被结帐所覆盖,Git不允许切换到另一个分支。

如果更改没有冲突,Git将允许切换到另一个分支。

即使更改不会因此而被覆盖,是否有办法阻止切换分支?我想防止将未提交的更改意外地提交到错误的分支。

谢谢, 没事

2 个答案:

答案 0 :(得分:1)

我不知道,也找不到任何会改变checkout以这种方式工作的配置。

您可以编写一个脚本来检查未提交的更改,并且只有在没有更改的情况下,才调用checkout。 (例如,您可以使用git diff --quiet HEAD来验证您的工作树是否看起来像最后一次提交,如果要另外确保您没有暂存更改然后在工作树中撤消它们,则可以使用git diff --quiet --cached HEAD。 )然后,您可以根据需要添加别名,或者直接调用它,以进行“更安全的”分支结帐。

最安全的方法是始终检查要提交的内容(或至少要推送的内容;如果在推送之前发现错误,通常可以很容易地撤消提交)。 / p>

答案 1 :(得分:0)

由于没有pre-checkout钩子,因此无法防止切换分支。但是Git有一个post-checkout钩子,当有一个或多个未跟踪文件时,它可以自动切换回上一个分支/状态。

这里是post-checkout的示例。将其部署到.git/hooks下并使其可执行。

#!/bin/bash

foo=$(git config --get my.foo)
if [[ "$foo" = "yes" ]];then
    exit 0
fi

oldref=$1
newref=$2
flag=$3
if [[ "$flag" -eq 1 ]] && [[ "$(git status --porcelain | grep -oe '^??' | uniq)" = ?? ]];then
    echo "There are untracked files. Go back to the previous state."
    git -c my.foo=yes checkout -
fi
exit 0
  1. flag签出分支时为1,签出时为0 文件。
  2. ??是未跟踪文件的状态。
  3. -c my.foo=yes可防止无限期调用post-checkout。如果您想绕过此post-checkout,请运行git -c my.foo=yes checkout ...。您可以将my.foo命名为与任何现有配置变量不同的名称。
  4. git checkout -是返回到先前状态的快捷方式。