У меня проблемы с git. Моя установка выглядит следующим образом:
[репозиторий рабочей станции] -origin-> [чистый репозиторий сетевого диска] -origin-> [GitHub]
Я только что принял свой первый пул реквест на GitHub (Вот этот) и объединил его с мастером. Теперь я хочу вытащить его на свою рабочую станцию. Итак, я делаю git fetch
на сетевом диске, а затем git pull
на своей рабочей станции, но на моей рабочей станции git говорит «Уже обновлено» и отказывается объединять изменение (я проверил, его нет в моей рабочей области).
Вывод git branch -vv
на сетевом диске включает строку:
* master 0fe40e2 [origin/master: behind 2] Some small code improvements
Вывод git branch -vv
в репозитории рабочей станции включает строку:
* master 0fe40e2 [origin/master] Some small code improvements
Фактическая фиксация, на которую они должны указывать, — 3388641. Похоже, что в голом репозитории на сетевом диске ветка master каким-то образом находится позади origin/master. Я понятия не имею, как возникла эта ситуация и как ее исправить. Я не могу использовать git pull
или git reset
, так как это просто репо.
Кто-нибудь знает, как я могу определить, в чем проблема и как ее исправить?
Я не уверен, какова цель этого отдельного голого клона (голый клон — это тот, который, как вы говорите, находится на сетевом диске), но если это не клон зеркало — зеркала — это особый тип голого клона — у него есть свои особенности. собственные имена веток, независимые от всех других репозиториев Git. Поэтому вам нужно будет указать Обновить любую конкретную ветку, если и когда вы хотите, чтобы она подчинялась какому-то другому репозиторию Git.
I can't use
git pull
orgit reset
since it is a bare repo ...
Это правда, что вы не можете использовать git pull
, потому что это голый репозиторий, а git pull
означает запустите git fetch
, затем запустите вторую команду Git, а второй команде Git всегда требуется рабочее дерево. Однако это нет случай, когда вы не можете использовать git reset
. Чего вы не можете сделать, так это сделать смешанный или полный сброс:
$ git reset
fatal: mixed reset is not allowed in a bare repository
$ git reset --hard
fatal: this operation must be run in a work tree
Однако сброс --soft
разрешен:
$ git reset --soft
$
поэтому один из способов переместить локальный master
в соответствие origin/master
:
$ git reset --soft origin/master
Тем не менее, наиболее целесообразным будет либо полностью прекратить использование этого голого репозитория, либо использовать его зеркальный клон (см. сноску 1).
1Технически, даже у зеркального клона есть свои названия веток. Ключевое различие между голым клоном без зеркала и голым зеркальным клоном заключается в том, что у зеркального клона все имена его ветвей подчинены его источнику. В частности, конфигурация fetch
для зеркального клона:
[remote "origin"]
fetch = +refs/heads/*:refs/heads/*
а не стандартный:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
Стандартная настройка выборки означает, что git fetch
запуск в таком клоне обновляет все refs/remotes/origin/*
имена, чтобы они соответствовали refs/heads/*
именам источника. Нестандартная настройка зеркала означает, что git fetch
запуск в зеркальном клоне принудительно обновляет все refs/heads/*
имена, немедленно забывая (и тем самым теряя любые коммиты, доступные исключительно из) своих собственных имен ветвей в пользу использования вместо этого извлеченных имен. Вот что делает зеркало зеркалом: оно отбрасывает любые коммиты, которые мы являются эксклюзивными для его собственных веток, заменяя хэши коммитов имени своей ветки тем, что он видел на удаленном сервере.
1В приведенном выше описании предполагается стандартное удаленное имя origin
. Если вы использовали какое-то другое имя, все останется в силе, просто вместо origin
строковым литералом будет любое имя, которое вы использовали.
Хорошо, git reset --soft
сработало! Я нашел страницу, описывающую, как превратить голое репо в зеркальное репо, что я и сделал. Я еще не проверял это, но я верю, что это сработает. Большое спасибо!
Интересно. Казалось бы, это могло бы означать, что это никогда бы не сработало, и я просто никогда не замечал, потому что это первый раз, когда я действительно получаю что-то от GitHub. Голое репо существует как локальная резервная копия и централизованное хранилище для работы с кодом из разных мест. Это не зеркальный клон; Я постараюсь превратить его в один. Спасибо!