2014-09-18 2 views
1

Итак, я думаю, что у меня есть простая вещь, которую я хочу сделать. У меня 2 филиала. В «master» я хочу объединить «функцию» ветки, но мне не нужно последнее изменение от «функции».Git Merge previous commit

В настоящее время

--M0--M1--M2 
    \ 
     F0--F1--F2 

Хочет:

--M0--M1--M2--M3 
    \  /
     F0--F1--F2 

К сожалению, я не знаю, как на диаграмму, но мой хозяин голова (M2) должна получить все изменения до F1 и, по сути, это должны быть эквивалентны:

--M0--M1--M2--M3 
       \ 
       F1--F2 

так Как это сделать слияние, так что хозяин филиал не подхватывает лат est F2 совершить?

EDIT: Справочная информация по проблеме.

У меня есть ветвь мастера и начата ветвь функции. Затем я внес изменения (A) в ветви функции, которая должна была находиться в главной ветви. Затем я произвел изменение (B) в ветви признака (которое там есть). Мне бы хотелось, чтобы изменения (A) были в главном, ветвь функций для ветви оттуда и изменили (B), чтобы остаться в ветви функции.

В будущем ветвь функции может забрать изменения от ведущего устройства. Затем, когда функция будет выполнена, она будет сливаться обратно в мастер и эта ветка может быть удалена.

+0

Вы всегда можете ссылаться на данное сообщение непосредственно через его SHA-1 ключ, который вы должны увидеть в журнале. Альтернативно вы можете сделать относительную ссылку, например, как 'F2 ^' или 'F2 ~ 1'. –

+1

Ответ Zeeker охватывает вопрос, который вы задали. Однако вы не упомянули, планируете ли вы продолжить разработку «функции», и если вы когда-либо планируете снова объединить «функцию» в «мастер», что потребует немного более активного ответа. –

+0

@AndrewC хорошая вещь. Мэтт, просто скажите, не отвечает ли мой ответ на ваш сценарий. Я с удовольствием отредактирую свой ответ, чтобы предоставить все, что вам нужно. –

ответ

1

Предположим, что у вас есть история фиксации - как вы указали в своем примере - со следующими ссылками на ветку.

--M0--M1--M2 <- master 
    \ 
    F0--F1--F2 <- feature 

Некоторые предпосылки

В мерзавца не сливаются ветви, а совершает. Каждая фиксация имеет ссылку на ее фиксацию родителя, и именно так создается ваша история. Филиалы - это просто ссылка на конкретную фиксацию.

Merge commits определяются как коммиты, которые имеют более одного родительского обязательства.

Ссылка фиксации

Это означает, что вы просто должны предоставить ссылку на коммита вы хотите объединить. Таким образом, команда слияния будет выглядеть так:

# Make sure you are on the master branch when executing the command 
git merge <reference-on-F1> 

Существует два простых способа ссылки на фиксацию.

  1. Вы можете сделать прямую ссылку через это SHA-1 хэш. Этот хеш печатается в коротком формате в вашем журнале. (git merge abc123))

  2. Вы можете сделать относительную ссылку от другой фиксации, например, из ссылки на ветку. Существуют два основных синтаксиса для создания относительных ссылок. Операторы ^ и ~.
    В то время как оператор ^ непосредственно обращается к следующему родителю, ~ может обращаться к родительскому фиксатору, который лежит дальше позади (в то время как master~3 эквивалентен master^^^).
    В вашем случае это приведет к git merge feature^.

Если вы хотите узнать больше о ссылках GIT, чем взглянуть на Git Revision Selection chapter из gitpro книги.

Редактировать Как правильно заметил Андрей, я не говорил о «аргументе» ^. Я оставил это намеренно, так как это не имеет решающего значения для вопроса. Если вас все еще интересует, вы можете найти все по ссылке, которую я предоставил.

+0

Информация хороша, кроме описания синтаксиса ^. Это используется для указания родительского номера в транзакции слиянием. Для частного случая «первый родитель» он идентичен синтаксису. –

+0

@AndrewC Я знаю, но я хотел сохранить его простым, так как эта информация не имеет решающего значения в этом случае. Но ты не заметил ничего хорошего. –

+0

Точно то, что мне нужно было знать. Спасибо за всю информацию здесь, все еще изучая детали ветвления и слияния, и это помогает! – Matt