git rebase fatal: требуется одна ревизия

162

У меня есть ветвь публичного репозитория, и я пытаюсь обновить свою ветку текущими коммитами из исходного репозитория:

$ git fetch <remote>
remote: Counting objects: 24, done.
remote: Compressing objects: 100% (20/20), done.
remote: Total 20 (delta 12), reused 0 (delta 0)
Unpacking objects: 100% (20/20), done.
From git://github.com/path_to/repo
  9b70165..22127d0  master     -> $/master
$ git rebase <remote>
fatal: Needed a single revision
invalid upstream <remote>

Это <remote>вместо моего удаленного имени и на самом деле не мое удаленное имя. Документация по этой ошибке кажется немного свободной.

jrlmx2
источник
2
Я получил эту ошибку по несвязанной причине - используя «git rebase --interactive c4e9c94 ^» из командной строки Windows. Он подсказал мне «Больше?», И независимо от того, как он ответил на приглашение, он сказал «фатально: нужна одна ревизия». Но когда я запускал ту же команду из bash, она работала нормально.
Ричард Бейер
В качестве дополнительного примечания, для меня в дополнение к вышестоящей ветке, перечисленной с «удаленным», я должен был выбрать конкретную ветку, на которую я хотел бы перебазировать. "git fetch <upstream> master". Извлечение только <upstream> с помощью «git fetch <upstream>» все равно дало бы мне эту ошибку.
Сладость

Ответы:

133

Вам необходимо указать имя ветви (или другой идентификатор фиксации), а не имя удаленного пользователя git rebase.

Например:

git rebase origin/master

не:

git rebase origin

Обратите внимание, что хотя originссылка должна указывать на origin/HEADссылку при использовании в качестве аргумента, где требуется ссылка на коммит, похоже, что не каждый репозиторий получает такую ​​ссылку, поэтому он может не работать (и в вашем случае не работает). Это платит, чтобы быть явным.

CB Bailey
источник
2
Последнее действительно должно работать - originв контексте ref интерпретируется как origin/HEAD. Я видел, как хранилища заканчивали тем, что не знали, что это origin/HEADтакое ...
Каскабель
1
@Jefromi: я боюсь, что не верю тебе, я только что попробовал git rebase originна тестовом репозитории (где originесть HEAD), и я получаю ошибку ОП. В документации для rebase не сказано, что удаленное имя действительно для <upstream>.
CB Bailey
1
@ Чарльз: Ну, это может быть ошибка? git rev-parse originработает, как и git rebase originв моем клоне git.git (в актуальном, ускоренном и истинном случае перебазирования, включая интерактивный).
Каскабель
@Jefromi: Можете ли вы git describeваши HEAD?
CB Bailey
@Charles: актуально, v1.7.4-rc3! Я не очень хочу сделать биссект в поисках этого ...
Каскабель
28

Проверьте правильность написания имени ветви . Я перебирал ветку истории (то есть branch_name) и забыл часть истории. (то есть story/branch_name), а затем git плюнул мне в эту ошибку, которая не имела особого смысла в этом контексте.

ChrisJF
источник
Именно это. Напечатано, featureNameкогда ветка фактически названаfeatures/featureName
pkamb
3
Также хорошая идея, чтобы искать простые опечатки более тщательно. Я случайно поменял две буквы при создании ветки, и эту опечатку было действительно трудно обнаружить.
Ольга
25

Я столкнулся с этим и понял, что я не получил вверх по течению, прежде чем пытаться перебазировать. Все что мне нужно былоgit fetch upstream

Марио Оливио Флорес
источник
10

Проблема в том, что вы разветвились от ветки ...., где вы пытаетесь сделать ребазинг. Вы не можете перейти на ветку, которая не содержит фиксацию, на которой ваша текущая ветка была изначально создана.

Я получил это, когда я сначала переместил локальную ветвь X в нажатую Y, а затем попытался перебазировать ветку (сначала созданную в X) в нажатую Y.

Решил для меня, перебрав на X.

У меня нет проблем с перебазированием в удаленные ветви (возможно, даже не проверенные), при условии, что моя текущая ветвь происходит от предка этой ветки.

Майтрейя
источник
3
Вы можете перейти на такую ​​ветку с помощью --onto. Все происходит от какого-то общего предка (для обычных репозиториев), так что это не проблема. Я получил эту ошибку от попытки сделать ребаз, fooкогда я еще не создал ветку для отслеживания origin/foo.
cdunn2001
0

Для удаленного origin:

$ echo "ref: refs/remotes/origin/master" > .git/refs/remotes/origin/HEAD
Яни
источник
0

git submodule deinit --all -f работал на меня.

Дипеш Панджаби
источник