2013-05-12 4 views
-1

Я получаю конфликты слияния, когда раздавливание совершает и последнее совершение заканчивается РАЗНОЕ, чем это было до сквоша. Почему окончательное изменение результата, когда я запускаюgit squash и сохранить последнюю фиксацию точно

git rebase -i someothercommit

затем сквош нежелательных промежуточных фиксаций оставив только первый ?? Я не понимаю, как могут возникать конфликты слияния, учитывая, что каждая фиксация находится в последовательности. Некоторые подробности ниже:

Для моей работы я несколько филиалов мастера 0somefeature 1anotherfeature 2lastfeature

обычно 0feature базируется мастер, 1 базируются 0 и т.д., когда я внести изменения в мастер Я слиться мастер в 0feature, затем 0feature в 1newfeature и т.д.

это то, что я бежал:

$ git log --online -5 
990cfb1 combine dump, add prog, combine validate 
41013a9 Merge branch '5flash_addr' into 6flash_bankcheck 
6f5e8f1 nothing interesting 
7b8140d nothing interesting 
2347714 implementation of dump and program 

$ git rebase -i 2347714 

, тогда я сквошу все коммиты, за исключением 990cfb1, в итоге конфликты слияния и мой новый коммит теперь отличается от того, что было до слияния !!

Спасибо!

ответ

1

Слово «удалить» неверно в вашем заявлении «тогда я удалю все коммиты, за исключением 990cfb1». Вам нужно использовать squash.

При запуске $ git rebase -i 2347714, вы увидите текстовый редактор выскочит, показывая ваши все сообщения, как это:

pick 990cfb1 combine dump, add prog, combine validate 
pick 41013a9 Merge branch '5flash_addr' into 6flash_bankcheck 
pick 6f5e8f1 nothing interesting 
pick 7b8140d nothing interesting 
pick 2347714 implementation of dump and program 

В этот момент, я бы сказал, что НЕ ТРОГАТЬ первый (990cfb1!). Затем для остальных замените «pick» на «squash» или «s» в качестве псевдонима.

Теперь сохраните файл и выйдите из редактора.

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

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

Теперь сохраните и оставьте. Git сделает следующее автоматически. Готово!

Примечание стороны

Вы можете иметь проблемы после вышеописанного процесса, потому что ваш «перебазироваться» уже бежать, но привал для некоторой ошибки.

Вам нужно:

  1. сделать физическую копию всего проекта мерзавца где-нибудь еще в первый !!!
  2. Затем запустите git rebase --abort
  3. Начните с чистого состояния в соответствии с процессом выше.
+0

я был на самом деле удаление строки в интерактивном окне .. «Если вы удалите строку здесь, ЧТО КОМИТЕТ БУДЕТ ПОТЕРЯТ». – swinman

+0

Спасибо вам за примечание - мне жаль, что я не сделал этого на ходу, прежде чем я сделал это сообщение! – swinman

+0

Мне все еще интересно узнать, почему у меня так много ошибок и нужно вручную выбрать, с какой фиксацией идти? Есть ли способ сказать, всегда выбирайте из последней фиксации или слияния? В качестве альтернативы есть что-то о том, как я использую git, что не так? – swinman

0

Теперь я стал намного лучше делать это ..основная проблема заключалась в слиянии «старой» ветви в новую, которую я делал несколько раз, затем переустанавливая шаги слияния и раздавливая все коммиты. Должна быть проблема с изменением хеша, или коммиты будут раздавлены из строя.

Лучшей практикой было бы перевести новую ветку на дополнительную фиксацию на старой ветке, чтобы история фиксации была линейной (вместо слияния H в G).

   0feature 1feature 
       |   | 
       v   | 
A -- B -- C -- D -- H  | 
       \   v 
        E -- F -- G 

Другими словами, с помощью данной схемы, если я сделать дополнительный совершить Н на D (который будет перемещать указатель 0feature Н), а затем объединить 0feature в 1feature (и делать это несколько раз), то попробуйте для rebase/sqash всей истории между 0feature & 1feature Я бы в конечном итоге с проблемами. Вместо git checkout G; git merge H я должен был использовать git rebase --onto H D G для каждой небольшой очистки. Я делаю второй из этих вариантов с момента создания оригинала, и с тех пор все было в порядке.

Кроме того, если бы это было мое обязательство журнала:

990cfb1 combine dump, add prog, combine validate 
41013a9 Merge branch '5flash_addr' into 6flash_bankcheck 
6f5e8f1 nothing interesting 
7b8140d nothing interesting 
2347714 implementation of dump and program 

и я перебазироваться прочь 2347714, вариант перебазироваться должен выглядеть следующим образом:

pick 7b8140d nothing interesting 
s 6f5e8f1 nothing interesting 
s 41013a9 Merge branch '5flash_addr' into 6flash_bankcheck 
s 990cfb1 combine dump, add prog, combine validate