如果我有未提交的更改将被结帐所覆盖,Git不允许切换到另一个分支。
如果更改没有冲突,Git将允许切换到另一个分支。
即使更改不会因此而被覆盖,是否有办法阻止切换分支?我想防止将未提交的更改意外地提交到错误的分支。
谢谢, 没事
答案 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
flag
签出分支时为1,签出时为0
文件。??
是未跟踪文件的状态。-c my.foo=yes
可防止无限期调用post-checkout
。如果您想绕过此post-checkout
,请运行git -c my.foo=yes checkout ...
。您可以将my.foo
命名为与任何现有配置变量不同的名称。git checkout -
是返回到先前状态的快捷方式。