Почему это не коммит и из него нельзя создать ветку?

Мне нужно работать со сложной конфигурацией репозиториев. У меня 5 из них:

  1. Удаленный центральный репозиторий на машине 1.
  2. Мой локальный репозиторий на моем ноутбуке (машина 2).
  3. Пустой репозиторий на машине 3.
  4. Хранилище на машине 3.
  5. Репозиторий на машине 4, где мы делаем обзор кода.

Итак, я понимаю, что это работает так:

  1. На моем ноутбуке (машина 2) я клонирую / извлекаю из центрального хранилища, расположенного на машине 1.
  2. Я проталкиваю локальный репо на машину 3 (используя пустой репозиторий в качестве "промежуточного").

Теперь я сделал некоторые изменения на машине 3 и хочу перенести эти изменения на машину 4. Вот инструкции, которым я должен следовать:

  1. На машине 3 делай всю работу в своей тестовой ветке, коммит.
  2. Push к вашему репо на машине 3: git push origin test-branch
  3. На вашем ноутбуке: получить новые коммиты из репозитория machine-3: git fetch machine3
  4. Проверьте свою ветку с машины 3: git checkout -b test-branch machine-3 / test-branch
  5. Fetch фиксирует из machine-4: git fetch origin
  6. git rebase origin / master
  7. git push origin HEAD: refs / for / master

У меня проблемы с шагом 4. Я получаю следующую ошибку:

fatal: 'machine3/test-branch' is not a commit and a branch 'test-branch' cannot be created from it

ADDED

Когда я выполню

git rev-parse machine3/test-branch

На моем ноутбуке (машина 2) я получаю:

machine3/test-branch
fatal: ambiguous argument 'machine3/test-branch': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

18 ответов

Для тех, кто нашел это в поисках ответа на fatal: 'origin/branch' is not a commit and a branch 'branch' cannot be created from itВы также можете попробовать git fetch первый.

Если вы бежите git checkout -b local-branch-name origin/different-branch-name без fetchВо-первых, вы столкнетесь с этой ошибкой.

У нас была такая ошибка:

      fatal: 'origin/newbranch' is not a commit and a branch 'newbranch' cannot be created from it

потому что мы сделали минималистичный клон, используя:

      git  clone  --depth 1  --branch 'oldbranch'  --single-branch  'git@github.com:user/repo.git'

Для нас минималистичное исправление было:

      git  remote  set-branches  --add  'origin'  'newbranch'
git  fetch  'origin'
git  checkout  --track  'origin/newbranch'

Предположим, что удаленное устройство называется origin, а удаленная ветвь - newbranch.

Мне удалось исправить это с помощью этих настроек, просто обновите конфигурацию с помощью этой команды

git config -e --global

и добавьте этот конфиг.

[remote "origin"]
    url = https://git.example.com/example.git (you can omit this URL)
    fetch = +refs/heads/*:refs/remotes/origin/*

и тогда вы можете git fetch --all

Я обнаружил, что этот вопрос устраняет более простую проблему: я получил ту же ошибку, пытаясь создать ветвь lobal с удаленного компьютера. Я решил это, создав ветвь из хеша коммита:

      git ls-remote origin remote-branch
returned
<hash>  refs/heads/remote-branch

git checkout -b local-branch <hash>

Если вы проверяете ветку по тегу (например, git checkout -b XXXX v0.1.1), можешь попробовать git fetch --tags первый.

Вопрос сложный / замысловатый, ответ простой. Произошло несоответствие между псевдонимом и машиной3. Псевдоним для удаленного, который был использован, не был для machine3. У machine3 был другой псевдоним.

У нас была эта точная ошибка на машине Windows, на которой запущен gitbash в папке, синхронизированной с диском Google.

Это было вызвано включенной функцией «Включить экспериментальный встроенный монитор файловой системы».

После удаления и переустановки gitbash с отключенной функцией это было исправлено.

Я только что столкнулся с этим, когда использовал инструмент «копировать» на GitHub рядом с названием ветки PR коллеги. Его ветвь была названа какcoworker/ticket-numberиgit checkout --track coworker/ticket-numberвот что получилось из пасты.

Когда я вернулся к своему обычному рабочему процессу, используяgit branch -r | grep ticket-numberЯ обнаружил, что фактическое имя ветки, которое мне нужно было использовать, былоorigin/coworker/ticket-number.

Я использую другой подход. Я изменил свою локальную конфигурацию флаттера, используя flutter % git config -e --localвместо изменения глобальной конфигурации. (Примечание: это нужно сделать в домашнем каталоге SDK flutter)

Запуск этого открывает файл

      [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[remote "origin"]
        url = https://github.com/flutter/flutter.git
        fetch = +refs/heads/stable:refs/remotes/origin/stable
[branch "stable"]
        remote = origin
        merge = refs/heads/stable

Изменить stable путь под [remote origin] к * (или в нужную ветку, в этом случае dev), чтобы передать вам этот файл.

      [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[remote "origin"]
        url = https://github.com/flutter/flutter.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "stable"]
        remote = origin
        merge = refs/heads/stable

Сохрани это. После этого вы сможете запустить flutter channel dev.

По этому вопросу:

      fatal: 'machine3/test-branch' is not a commit and a branch 'test-branch' cannot be created from it

Для меня я должен был сначала проверить, затем он работал нормально и создал новую ветку из test-branch.

Для тех, кто нашел это в поисках ответа наfatal: 'origin/remote-branch-name' is not a commit and a branch 'local-branch-name' cannot be created from it, еще одна возможность, которую мы только что обнаружили, заключается в том, что удаленная ветка уже была объединена :embarrassed:

Мои проблемы заключались в том, что у меня был пробел в имени моей новой ветки

Проблема:

git checkout -b my-new-branch name

вместо

git checkout -b my-new-branch-name

У меня была проблема, когда яgit checkout name-branchи он был создан, но когда я проверяю ветку с помощьюgit branch ничего не происходит после нескольких часов попыток выяснить, я пытался запустить командуgit push GitHub-URL name-branchи он подталкивает фиксацию непосредственно к ветке, надеюсь, это поможет

Проверьте свою конфигурацию git в папке .git и подтвердите это содержимое.

      [core]
    repositoryformatversion = 0
    fileMode = false
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/ABC/project0001.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
    remote = origin
    merge = refs/heads/main
[pull]
    ff = no
[branch "develop"]
    remote = origin
    merge = refs/heads/develop

[remote "origin"]<-- этот раздел

Филиал не существует в указанном удаленном источнике. Перепроверьте: возможно, вы пытаетесь сорвать апельсины с виноградного дерева.

Я столкнулся с той же ошибкой, и исправить ее было так же просто, как создать ветку в два этапа:

  1. git checkout существующую ветку, из которой я хочу создать новую ветку. например, git checkout dev. Это приведет вас к ветке разработки.
  2. создайте новую ветку из ветки dev, находясь в ветке dev, например, git checkout -b <new_feature_branch> dev

Я использовал рабочий процесс git в коде Visual Studio, как показано на диаграмме ниже, чтобы решить мою проблему:

Решение от J.D. Mallen включает в себя

Начиная с VSCode 1.53 (январь 2021 г.) у вас будут ( выпуск 110811 и PR 111090):

Изменение autofetch в строковую конфигурацию, в которой есть " current", "" а также " off".

Это позволяет пользователям получать данные со всех пультов, а не только со своих origin.
Для разработчиков, работающих над вилкой, это должно сделать работу расширений более интуитивно понятной.

Итак, если вы установите параметр VSCode git.autofetch к " all", вам даже не нужно будет вводить git fetch --all.

Другие вопросы по тегам