Перемещение головы мастера в ветку

У меня есть несколько ветвей функций и основная ветка. Feature2 сделано. Обычно я бы сделал ребаз (работающий с удаленным репозиторием SVN и хотел бы сохранить историю, чтобы не было регулярного слияния) и ff-merge. Но так как мастер не изменился, так как я разветвился, я хотел бы переместить голову мастера (вE) чтобыG, С помощьюgit branch -f master G не приводит к каким-либо видимым изменениям, я предположил, что это потому, чтоG находится в другой ветке.

Безопасно ли использоватьgit update-ref -f master G здесь вместо этого? Должен ли я придерживаться rebase / ff-merge? Что-то еще лучше?

feature1      C-D  
             /
master    A-B-E            
               \                      
feature2        F-G  

Спасибо.

 GoZoner25 мая 2012 г., 18:07
Функция ветвления2 уже имеет «прямой график»; - просто переименуйте feature2 в master (или переместите master в feature2)!
 kostja25 мая 2012 г., 20:41
@ GoZoner Просто небольшая разница в одну строку и две строки ввода. Следуя первому достоинству программирования;)
 ellotheth26 мая 2012 г., 00:30
Конечно, теперь, когда мы все опубликовали, как восемнадцать способов сделать то же самое. ;п
 kostja25 мая 2012 г., 16:49
ааа, очевидность этого! график выглядит точно так же, как после перебазирования. Интересно, почему я когда-либо думал о чем-то еще Хотите репост как ответ?
 ellotheth25 мая 2012 г., 15:52
Что не так с обычным ускоренным слияниемG вmaster? Нет необходимости перебазировать. Вы сохраняете историю, и вы получаете прямой график (A-B-E-F-G).

Ответы на вопрос(5)

Решение Вопроса

не нужно перебазировать:

    feature1      C-D  
                 /
    master    A-B-E            
                   \                      
    feature2        F-G

git checkout master
git merge feature2

    feature1              C-D  
                         /
    master, feature2  A-B-E-F-G

достаточно перезагрузки. Предполагается, что мастер проверен:

git reset --hard feature2
 25 мая 2012 г., 15:39
Сброс функционально эквивалентен ускоренному слиянию в этом случае.
 18 апр. 2016 г., 19:52
после пяти минут поиска ответа, я пытаюсь это, и это работает. простой и ожидаемый в отражении. Спасибо!
 kostja25 мая 2012 г., 17:20
Работает как рекламируется, спасибо Магнус.

как «прочитай меня!» тег висел на коммите. Это просто условно, что git подхватывает его и время от времени вешает на другой коммит для вас.

Using git branch -f master G does not result in any visible changes

Что значитgit log --decorate --oneline --all сказать?git show master?

 kostja25 мая 2012 г., 17:33
Мой плохой, я ввел неправильный SHA дляgit branch master SHA, Это сработало.

заботитесь ни о функции 2 («выполнено»), ни о существующем мастере (в «Е»), вам просто необходимо следующее.

git branch -d master
git branch -m feature2 master

Просто лучше?

Помните, что есть две ключевые концепции:

The Git commit graph, and The Git references

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

Так что, в вашем случае, нет необходимости вносить изменения в структуру, только изменение ссылок.

Однострочная версия:

git branch -f master feature2

который поддерживает ветку feature2 (в отличие от предыдущего двухслойного, у которого ось feature2).

 kostja25 мая 2012 г., 17:35
Спасибо, GoZoner. Хорошая альтернатива, о которой я не задумывался. Но я полагаю, что я придерживаюсь ff-merge в моем случае.
 20 мар. 2017 г., 16:28
Перемещая «мастер» Вы создали несоответствие со всеми пультами. Исправлениеgit push <remote> master --force но «- сила» Аргумент должен заставить вас опасаться его влияния на других пользователей<remote>
 20 мар. 2017 г., 16:23
кажется, работает локально. Но как мне перенести изменения на удаленный сервер? Жалуется на слияние без ускоренной перемотки
 25 мая 2012 г., 18:06
Смотрите добавленные детали в редактировании.

было бы лучше выполнить не быстрое слияние функции 2 с основным, используяgit merge --no-ff feature2 если вы проверили на мастер ветке. Вы должны получить следующее

feature1      C-D  
             /
master    A-B-E-----H          
               \   /                   
feature2        F-G 
 kostja25 мая 2012 г., 13:28
Я хотел бы избежать регулярного слияния с мастером, где это возможно, чтобы сохранить историю, - сказал я в этом вопросе. И почему вы думаете, что no-ff-merge лучше подходит, чем ref move?

Ваш ответ на вопрос