У меня есть ветка, master
которая отслеживает удаленную ветку origin/master
.
Я хочу переименовать их master-old
как локально, так и удаленно. Это возможно?
Что произойдет после переименования удаленной ветви для других пользователей, которые отслеживали origin/master
(и которые всегда обновляли свою локальную master
ветку через git pull
)?
Будет ли они git pull
все еще работать, или это выдаст ошибку, которую он больше не сможет найти origin/master
?
Затем, в дальнейшем, я хочу создать новую master
ветку (как локальную, так и удаленную). Опять же, после того, как я это сделал, что теперь будет, если это сделают другие пользователи git pull
?
Я думаю, что все это приведет к большим неприятностям. Есть ли чистый способ получить то, что я хочу? Или я должен просто оставить все master
как есть, создать новую ветку master-new
и работать дальше?
источник
git push -f
влияет на способностьpull
из любой удаленной ветви отслеживания.master-old
которая указывает на тот же коммит, что и предыдущаяmaster
ветка. Затем вы можете перезаписатьmaster
ветвь с новыми изменениями, делаяmerge
сours
стратегией. Выполнение слияния работает, когда пульт не допускает внесения изменений без ускоренной передачи. Это также означает, что у других пользователей не будет принудительных обновлений.master
только особенный, пока это единственная существующая ветка. Как только у вас есть более одного, все ветви находятся в равных условиях.Ответы:
Самым близким к переименованию является удаление, а затем повторное создание на пульте. Например:
Однако это имеет много предостережений. Во-первых, ни одна из существующих проверок не узнает о переименовании - git не пытается отслеживать переименования веток. Если нового
master
еще не существует, git pull выдает ошибку. Если новыйmaster
был создан. тяга будет пытаться слитьmaster
иmaster-old
. Так что, как правило, это плохая идея, если у вас нет сотрудничества со всеми, кто ранее проверял хранилище.Примечание. Более новые версии git не позволяют удаленно удалять основную ветку по умолчанию. Вы можете переопределить это, установив
receive.denyDeleteCurrent
значение конфигурации вwarn
илиignore
в удаленном хранилище. В противном случае, если вы готовы сразу же создать нового мастера, пропуститеgit push remote :master
шаг и перейдите--force
к немуgit push remote master
. Обратите внимание, что если вы не можете изменить конфигурацию пульта, вы не сможете полностью удалить основную ветку!Это предупреждение относится только к текущей ветви (обычно
master
ветви); любая другая ветка может быть удалена и воссоздана, как указано выше.источник
new-branch-name
иold-branch-name
вместоmaster
/master-old
, таким образом , это общая проблема.Предполагая, что вы в данный момент
master
:master-old
ветку вorigin
хранилище, основываясь наmaster
коммите в локальном хранилище.origin/master-old
ветки (которая будет автоматически настроена как отслеживающая ветвь).master
коммиту, на который вы хотите указать.master
вorigin
хранилище, чтобы отразить ваш новый локальныйmaster
.(Если вы делаете это любым другим способом, вам потребуется по крайней мере еще один шаг, чтобы убедиться, что
master-old
он правильно настроен для отслеживанияorigin/master-old
. Ни одно из других решений, опубликованных на момент написания этой статьи, не включало это.)источник
master
другой ветке. Хотя вопрос был плохо назван, он спрашивает о более сложной задаче, чем просто переименование ветви.master
они могли бы просто сделать так,git fetch && git reset --hard origin/master
чтобы их местностьmaster
была такой же, как и у тойorigin
. Я задокументировал это, а также более сложный случай, когда у вас есть локальные коммиты,master
которые вы хотите сохранить, в stackoverflow.com/q/4084868С Git v1.7, я думаю, это немного изменилось. Обновление ссылки отслеживания вашей локальной ветки на новый пульт теперь очень просто.
источник
--set-upstream
заключается в следующем: как только ваша ветка переименована локально и удалена в источнике, просто выполните:git push -u --all
new_branch
и затем в конечном итоге удалить пультmaster
со 2-й строкой.git push origin --delete old_branch
чуть более читабельно.Возможно, вам придется вручную переключиться на
new-branch-name
перед удалениемold-branch-name
источник
git branch -d old-branch-name
для удаления локальной старой ветки.git push remote-name new-branch-name :old-branch-name
.Есть много способов переименовать ветку, но я собираюсь сосредоточиться на более крупной проблеме: «как разрешить клиентам ускоренную перемотку вперед и не нужно связываться с их филиалами локально» .
Сначала быстрая картинка:
Это действительно легко сделать; но не злоупотребляйте этим. Вся идея зависит от коммитов слияния; поскольку они допускают перемотку вперед и связывают истории одной ветви с другой.
переименование филиала:
создание новой "основной" ветки:
создание коммита слияния, чтобы иметь историю родитель-потомок:
и вуаля.
Это работает, потому что создание
merge
коммита позволяет быстро пересылать ветку к новой ревизии.используя разумное сообщение коммита слияния:
источник
git merge -s ours master-old
является важной частью, которую пропускают другие ответы. Кроме того, «легко сделать» не означает «легко понять или выяснить», что, по-видимому, имеет место для большинства мерзавцев, но я отвлекся.Я предполагаю, что вы все еще спрашиваете о той же ситуации, что и в предыдущем вопросе . То есть master-new не будет содержать master-old в своей истории. * Если вы называете master-new «master», у вас будет фактически переписанная история. Неважно, как вы попадаете в состояние, в котором мастер не является потомком предыдущей позиции мастера, просто то, что он находится в этом состоянии.
Другие пользователи, пытающиеся получить данные, пока мастер не существует, просто потерпят неудачу в своих попытках (нет такой ссылки на пульте дистанционного управления), и как только они снова появятся в новом месте, их попытки будут пытаться объединить своего мастера с новым удаленным мастером, точно так же, как если бы вы объединили master-old и master-new в своем хранилище. Учитывая то, что вы пытаетесь сделать здесь, слияние может привести к конфликтам. (Если бы они были решены, а результат был перенесен обратно в хранилище, вы оказались бы в еще худшем состоянии - обе версии истории были там.)
Чтобы ответить на ваш вопрос просто: вы должны признать, что иногда в вашей истории будут ошибки. Это нормально. С кем не бывает. В репозитории git.git есть отмененные коммиты. Важно то, что как только мы публикуем историю, это то, что каждый может доверять.
* Если бы это было так, это было бы равносильно внесению некоторых изменений в мастер, а затем созданию новой ветви, где она была раньше. Нет проблем.
источник
Выбранный ответ не удалось , когда я попробовал. Он выдает ошибку:
refusing to delete the current branch: refs/heads/master
. Я думаю, я выложу, что работает для меня:Хитрость заключается в том, чтобы оформить заказ на заполнитель прямо перед отправкой его в удаленный репозиторий. Остальное не требует пояснений, удаление ветки master и ее отправка в удаленный репозиторий должны сработать. Извлеченный из здесь .
источник
Хорошо. Мои 2 цента. Как насчет входа на сервер, перехода в каталог git и переименования ветки в пустом хранилище. Это не имеет всех проблем, связанных с повторной загрузкой той же ветки. Фактически, «клиенты» автоматически распознают измененное имя и изменяют свою удаленную ссылку. После этого (или до) вы также можете изменить локальное имя филиала.
источник
Что о:
источник
Это самый простой и «читаемый» способ, который я знаю:
'Переместить' локальную ветку, используя -m
Нажмите «перемещенную» ветку на пульт, установите «upstream» с помощью -u
(настройка 'upstream', по сути, 'соединяет' вашу локальную ветку с удаленным, так что такие вещи, как fetch, pull и push будут работать)
Удалить старую ветку с пульта
(ваше местное отделение уже ушло, потому что вы «переместили» его на первом этапе)
источник
Хорошо , переименовать ветку как локально, так и на удалённом довольно легко! ...
Если вы на ветке, вы легко можете сделать:
git branch -m <branch>
или, если нет, вам нужно сделать:
git branch -m <your_old_branch> <your_new_branch>
Затем отправьте удаление на пульт, как показано ниже:
git push origin <your_old_branch>
Теперь вы сделали, если вы получаете ошибку апстрима, когда пытаетесь нажать, просто выполните:
git push --set-upstream origin <your_new_branch>
Я также создаю изображение ниже, чтобы показать шаги в реальной командной строке, просто следуйте инструкциям, и вам будет хорошо:
источник
Вы можете сделать следующее:
Но форсирование - плохая идея, если другие люди делятся этим хранилищем. Принудительный толчок приведет к конфликту их истории изменений с новой.
источник
Для выполнения этой работы в сценарии оболочки может быть сохранено следующее:
Например:
Обратите внимание, что здесь удаленное имя по умолчанию «origin» задано жестко, вы можете расширить сценарий, чтобы сделать его настраиваемым!
Затем этот сценарий можно использовать с псевдонимами bash, псевдонимами git или, например, в пользовательских действиях на sourcetree.
источник
Я считаю , что ключ является осознанием того, что вы выполняете двойное переименование:
master
к ,master-old
а такжеmaster-new
вmaster
.Из всех других ответов я синтезировал это:
где мы сначала должны определить
doublerename
функцию Bash:Это похоже на изменение истории
git rebase
в том смысле, что содержимое ветви совершенно иное, но отличается тем, что клиенты все еще могут безопасно переходить впередgit pull master
.источник
источник