Работа с несколькими головками Git локально и на сервере - PullRequest
3 голосов
/ 21 августа 2011

Я использую Linonde для размещения своих git-репозиториев, а также реальных файлов сайта.

git branch -r выглядит так:

company/master
company/stage
origin/HEAD -> origin/master
origin/master
prod/master

git branch выглядит так:

master
stage

Я думаю, что я просто пытаюсь, чтобы моя точка локального отделения касалась моей компании / руководителя.Когда я делаю git push company stage, мне кажется, что обновляет мою рабочую головку на сервере, но я пытаюсь заставить ее обновить главную головку, из которой мой сайт обслуживает свои файлы.Или мне нужно выяснить, как указать свой сайт руководителю компании / сцены.

Я попытался удалить свою ветку и создать ее с помощью

git branch stage company/master

, поскольку я думал, что начальная точка можетбыть тем, что мне нужно.

Положите, когда я пытаюсь нажать после этого, я получаю сообщение:

error: failed to push some refs to 'root@foo:~repos/project_name'
To Prevent you from losing history, non-fasst-forward updates were rejected
Merge the remote changes (e.g. 'git    pull') before pushing again.)

Я попробовал git pull, но он сказал, что все было в порядке, и я не могничего не вижу в справочной документации по ускоренной перемотке, касающейся моей ситуации.

1 Ответ

6 голосов
/ 21 августа 2011

Во-первых, стоит объяснить, что происходит, когда вы делаете:

git push company stage

Последний параметр - это действительно refspec , который определяет сопоставление между исходной ссылкой и пунктом назначения.ref - в простых случаях, с которыми вы, вероятно, имеете дело, эти "refs" - это имена ветвей.Если в refspec нет :, то предполагается, что вы хотите нажать на ветку с тем же именем.Итак, команда, которую вы запускаете, эквивалентна:

git push company stage:stage

Если вместо этого вы хотите обновить ветку master в репозитории company, то вам нужно выполнить:

git push company stage:master

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

git branch stage company/master

..., которая создает записи в вашей конфигурации git, которые связывают вашу локальную ветку stage светка master в хранилище company.¹ Это означает, что если вы находитесь в ветке stage, то выполнение git pull должно работать правильно, что в этом случае должно было бы обновить ветку удаленного отслеживания company/master и объединить ее с stage.

К сожалению (и сбивает с толку) эти параметры конфигурации (по умолчанию) не влияют на поведение git push, о котором я писал более подробно в другом месте .Вы не упоминаете форму команды git push, которую вы тогда использовали, но вы должны были выполнить:

git push company stage:master

... если вы хотите обновить ветку master в company хранилище с вашей локальной stage веткой.(Если вы просто попробуете git push company, это попытается протолкнуть каждую «совпадающую» ветвь между вашим локальным репозиторием и company, где «совпадение» означает «ветвь с тем же именем существует локально и удаленно». Вы можете изменить этоповедение, установив параметр конфигурации push.default на tracking.)


¹ В более ранних версиях git вам пришлось бы добавить параметр --track, но какое-то время это былопо умолчанию, где начальной точкой является ветвь удаленного отслеживания.

...