git重设底座是否尽可能靠近头部?

git重设底座是否尽可能靠近头部?,git,rebase,Git,Rebase,我在git有一个私人分支,我已经有一段时间没碰过了。我想在master上重新设置它的基础,因此我: git checkout master git pull git checkout my-branch git rebase master First, rewinding head to replay your work on top of it... Applying: a bunch of stuff Applying: more stuff Applying: and so on CO

我在git有一个私人分支,我已经有一段时间没碰过了。我想在
master
上重新设置它的基础,因此我:

git checkout master
git pull

git checkout my-branch
git rebase master

First, rewinding head to replay your work on top of it...
Applying: a bunch of stuff
Applying: more stuff
Applying: and so on
CONFLICT (content): Merge conflict in src/foo.c
error: Failed to merge in the changes.
哦,不,我不能直接重设到
头部

git rebase --abort  # sigh
在这一点上,我通常会尝试使用
git-rebase-SHA1
git-rebase-SHA2
(其中SHA1、SHA2等位于
master
)将我的分支“棘轮”到尽可能靠近
HEAD
,直到我找到了它成功重新设置的最新点

我通常的选择候选重设基准点的技巧是在每次合并后立即尝试掌握


有没有一种很好的方法来自动化这个过程?

我认为Git没有现成的功能

但是,您可以使用脚本和Git别名来创建一种“fuzzyrebase”命令。这将尝试根据另一个ref重新设置基准,如果失败,将沿着其子代的树走,直到找到一个可以完全重新设置基准的ref

下面是一个perl脚本:

#!/usr/bin/perl -w

# get ref
my $ref=shift @ARGV;
if (!defined $ref) {
    warn "need ref to rebase against!\n";
    exit 1;
}

# attempt rebase
`git rebase $ref 2>&1`;

# detect if conflict occurred
# if so, abort the rebase
# and try again with the rebase target's parent
my @result = `git ls-files --unmerged`;
if (scalar @result > 0) {
    print "failed at $ref\n";
    `git rebase --abort 2>&1`;
    system("$0 $ref~");
} else {
    print "done at $ref\n";
}
假设您在
~/scripts/fuzzyRebase.pl
上有这个。定义Git别名,如下所示:

git config --global alias.fuzzyRebase !/~/scripts/fuzzyRebase.pl
现在,无论何时,只要您想调用模糊重基,您都可以使用:

git fuzzyRebase master

我不相信Git有你想要的现成的东西

但是,您可以使用脚本和Git别名来创建一种“fuzzyrebase”命令。这将尝试根据另一个ref重新设置基准,如果失败,将沿着其子代的树走,直到找到一个可以完全重新设置基准的ref

下面是一个perl脚本:

#!/usr/bin/perl -w

# get ref
my $ref=shift @ARGV;
if (!defined $ref) {
    warn "need ref to rebase against!\n";
    exit 1;
}

# attempt rebase
`git rebase $ref 2>&1`;

# detect if conflict occurred
# if so, abort the rebase
# and try again with the rebase target's parent
my @result = `git ls-files --unmerged`;
if (scalar @result > 0) {
    print "failed at $ref\n";
    `git rebase --abort 2>&1`;
    system("$0 $ref~");
} else {
    print "done at $ref\n";
}
假设您在
~/scripts/fuzzyRebase.pl
上有这个。定义Git别名,如下所示:

git config --global alias.fuzzyRebase !/~/scripts/fuzzyRebase.pl
现在,无论何时,只要您想调用模糊重基,您都可以使用:

git fuzzyRebase master

您从SHA1/2的重新定基中获得了什么好处?您最终将不得不在master上重新设置基础,并且您将获得相同的冲突。只需修复冲突并
git rebase--继续
。如果在重新设置基础中有成功的合并,它们将被应用,并且我在分支上有更少的提交(和潜在的冲突)可供查看。在SHA1/2上重新设置基础有什么好处?您最终将不得不在master上重新设置基址,您将得到相同的冲突。只需修复冲突并
git rebase--继续
。如果在重新设置基址中有成功的合并,它们将被应用,并且我在分支上有更少的提交(和潜在冲突)可供查看。我会尝试一下,但实际考虑一下,在合并到master时,这会变得复杂,因为当向后走并点击合并时,“master”没有什么特别的。嗯…@RogerLipscombe同意……我认为这里的要点是,您所寻求的将需要一些脚本,并且脚本可能会变得复杂,与各种边缘情况类似,如合并提交。注意,您不必
git ls文件--unmerged
,成功后
git rebase
的退出状态为0,1(通常为非零,但实际上目前为1)关于冲突。我会尝试一下,但实际上考虑一下,这在合并到master时会变得复杂,因为“master”没有什么特别的当向后走并点击merge.Hmmm.@RogerLipscombe同意…我认为这里的要点是,您正在寻找的内容需要一些脚本,并且脚本可能会变得复杂,与各种边缘情况类似,如merge commits这里有一个注释,您不必
git ls文件--unmerged
,即
gi的退出状态t rebase
在成功时为0,在冲突时为1(通常为非零,但实际上当前为1)。