Как мне вытащить в пустой репозиторий?
У меня есть "основной" пустой репозиторий и "личный" пустой репозиторий. Я хочу обновить форму изменений с "основной" на "личную", поэтому я запускаю:
$ 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]
!