仅当其他分支引用提交时才执行git重置

时间:2016-06-03 00:23:33

标签: git git-reset

只有当不同的分支引用提交时,有没有办法从分支中删除几个提交?

例如,如果我做了以下提交:

ABC-1: Add views for feature ABC-1
ABC-1: Add controller action for feature ABC-1

然后我发现我在develop分支上执行了这些操作,而不是feature/ABC-1,我做了

git checkout -b feature/ABC-1
git checkout develop
git reset --hard HEAD~~

有没有我可以传递给git reset的选项,如果我没有创建feature/ABC-1分支,我会拒绝执行git重置?有点像git branch -d如果它引用了您当前所在的分支中包含的提交,那么它只会删除一个分支吗?

我能做到

git checkout -b feature/ABC-1
git branch -d develop
git checkout HEAD~~
git checkout -b develop

但是丢失了有关哪个远程分支develop正在跟踪的信息。

1 个答案:

答案 0 :(得分:1)

git reset没有内置任何内容,但git branch --contains <commit-specifier>显示其提示提交具有指定提交的每个分支作为其历史记录的一部分。因此,如果您在一个分支上,git branch --contains HEAD将打印一个名称,如果您在其分支提交未包含在任何其他分支中的分支上,或者如果您位于分支上的两个或更多名称,则会打印一个名称commit 包含在其他一些分支中。 (如果你在一个分离的HEAD上指向一个没有包含在任何分支中的提交,或者如果你在一个分支中包含一个分离的HEAD上,那么你根本就没有名字。)

解析git branch的输出有点脆弱,因为它是一个瓷器命令而不是管道命令。一个足够新的Git版本在git for-each-ref中有标记,可以为脚本提供可靠的处理。但是,在这种情况下,git branch --contains HEAD | wc -l足够稳固。因此(未经测试和编写的更多用于说明目的而不是其他任何目的):

#! /bin/sh
# make sure we are in a git directory at all
git rev-parse -q --verify HEAD >/dev/null || exit
# are we on any (named) branch? if so, which one?
if current_branch=$(git symbolic-ref -q HEAD 2>/dev/null); then
    detached=false
    expected=1
else
    detached=true
    expected=0
fi
count=$(git branch --contains HEAD | wc -l)
extra=$((count - expected))
if [ $extra -gt 0 ]; then
    echo "other branch(es) protect the HEAD commit"
else
    echo "moving HEAD would lose commits"
fi