Как мне вытащить в пустой репозиторий?

У меня есть "основной" пустой репозиторий и "личный" пустой репозиторий. Я хочу обновить форму изменений с "основной" на "личную", поэтому я запускаю:

$ git pull
fatal: /home/gimenero/applib/git/libexec/git-core/git-pull cannot be used without a working tree.

Как мне вытащить внесенные изменения в "главное"?

2 ответа

Решение

git pull делает fetch с последующим merge, и вы не можете слить без рабочего дерева. (Там будет некуда разрешить конфликты слияния, если они возникнут.)

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

$ git fetch origin master:master

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

Обновить с помощью:

$ git fetch origin +refs/heads/*:refs/heads/* --prune

Что это делает?

Сначала в сторону: когда мы говорим о ветке с именем "xyz", git фактически обращается к ней как refs/heads/xyz, Но вы можете напечататьxyz"для краткости, потому что в противном случае это было бы безумно. (Кстати, теги refs/tags/xyz.) Пока обычный xyz является неоднозначным, поскольку это может быть ветвь / тег / первые N букв хеша коммита, refs/heads/xyz явно представляет ветку.

Так что пока вы можете набрать git fetch origin foo:bar схватить их foo ветвь по имени bar в вашем хранилище вы можете более явно набрать git fetch origin refs/heads/foo:refs/heads/bar сделать то же самое. (Хотя если foo был на самом деле тег, а не ветвь, последний потерпит неудачу, потому что их refs/heads/foo не существует Откровенность ftw.)

git fetch origin refs/heads/*:refs/heads/* означает, что все их ветви принадлежат нам. Команда запускается так, как будто * часть заменяется именем их ветви для каждой из их ветвей. т.е. git fetch origin refs/heads/abc:refs/heads/abc refs/heads/def:refs/heads/def ... (при условии, что у них есть ветви с именем abc а также def).

--prune опция означает любые ветки, которые у нас есть в нашем хранилище, которые соответствуют refs/heads/* но не существует в их хранилище удаляются.

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

Если сложить вместе, конечный результат состоит в том, что ветки в вашем хранилище выглядят точно так же, как и их.

Вот пример вывода:

 - [deleted]               (none)     -> bar
 * [new branch]            foo        -> foo
   4812558a5f..a6aeec6517  abc        -> abc
 + a1b2c3d4e5...1a2b3c4d5e def        -> def  (forced update)
  • Пример говорит нам, что у них есть филиалы foo, abc, def в то время как у нас был (был) один дополнительный: bar
  • Обратите внимание на удаление bar от --prune и принудительное обновление def разрешено + префикс.

Вот что происходит вместо этого, если + а также --prune были остановлены:

 * [new branch]            foo        -> foo
   4812558a5f..a6aeec6517  abc        -> abc
 ! [rejected]              def        -> def  (non-fast-forward)

Одна последняя вещь:

Сравните команду сверху со следующим:

$ git fetch origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* [--prune]

По сути, это то, что происходит, когда мы печатаем git fetch origin [--prune]!

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