git rebase как можно ближе к HEAD?
У меня есть частная ветка в 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.
О нет, я не могу перебазировать напрямую HEAD
!
git rebase --abort # sigh
Что я обычно делаю в этот момент, это пытаюсь "укоротить" мою ветку как можно ближе к HEAD
по возможности, используя git rebase SHA1
, git rebase SHA2
(где включены SHA1, SHA2 и т. д. master
до тех пор, пока я не найду самую последнюю точку, в которой она успешно восстанавливается.
Моя обычная техника для выбора кандидатов для перебазирования - это попытка сразу после каждого слияния с мастером.
Есть ли хороший способ автоматизировать этот процесс?
1 ответ
Я не верю, что у Git есть то, что вы ищете "из коробки".
Но вы можете использовать скрипт и псевдоним Git для создания некой команды "нечеткой перебазировки". Это попытается сделать перебазировку против другого реф, и, если он потерпит неудачу, поднимется по дереву своего потомка, пока не найдет реф, против которого можно чисто перебазировать.
Вот скрипт на 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