2016-11-25 1 views
1

Я пытаюсь объединить ветку с кучей коммитов (~ 20). Однако первая фиксация заключается в том, чтобы отменить полный код , и все последующие коммиты также содержат пробельные изменения, которые я не хочу. Я пытаюсь повторно применить все эти коммиты, но я не знаю, как сказать git игнорировать изменения пространства.Reapply совершает при игнорировании всех изменений пространства с помощью Git

Но я пробовал git format-patch -20 --ignore-all-space, а затем git apply *.patch на чистой ветке, но это, очевидно, не сработало, так как патчи индивидуально отформатированы с изменениями пространства их предков.

В основном я хотел бы иметь ту же историю, но без пробелов изменений:

 A - B - C - D 
    /  
P - Q   
    \  
     A'- B'- C'- D' (spaces trimmed) 

редактировать: Для того, чтобы выяснить, какие совершает содержат какой.

  1. A - reindenting весь файл с именем Foo (заменяющий tabs с spaces). Я хотел бы падение это.
  2. B - применение действительных изменений кода в foo. Я хотел бы держать это.
  3. C - применение действительных изменений кода и повторное использование другого файла бар. Я хотел бы сохранить только изменение коды (с сохранением пространства изменения для модифицированных линий)
  4. D - применение допустимых изменений коды в обув и бара, учитывая те факты, что они теперь используют spaces вместо tabs. Я хотел бы держать эти изменения тоже.
+0

Таким образом, 'A' является фиксацией того, что« означает переделение всего кода правильно »? Не могли бы вы прояснить это в вопросе? – sschuberth

+0

Кроме того, не могли бы вы пояснить, содержат ли коммиты пробел * и * код в той же * строке * или только в том же * файле *? – sschuberth

+0

Я редактировал вопрос; это помогает? – bagage

ответ

1

Перейти к D Позиция/отрасль. Затем удалите все пробелы, как вы хотите. Затем добавьте & еще раз.

$ git checkout <D-position-branch-name> 

Изменить то, что вы хотите (удалить все пробелы, как вы хотите)

$ git commit -am 'Remove spaces'  # add & commit your changes 
$ git push origin HEAD     # push your changes to remote 
1

Попробуйте это, имея Q проверил:

git merge -s ours A 
git merge -X ignore-space-change D 

Первый фактически не изменяет любой код Q, но просто «притворяется», что произошло слияние, создав «фиктивный» слияние. Это полезно для игнорирования A в последующем инкрементном слиянии.

Следующая команда слияния объединяет оставшиеся фиксации от D до B, но не A.

процитировать docs:

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

ignore-space-change рассматривает линии с указанным типом пробелов как неизменные ради трехстороннего слияния. Изменения пробелов, смешанные с другими изменениями в строке, не игнорируются. [...]

  • Если их версия только вводит пробельные изменения в линии, наша версия используется;
  • Если нашей версии вводит пробельные изменения, но их версия включает существенные изменения, используется их версия;
  • В противном случае слияние происходит обычным способом.
+0

Я действительно хочу, чтобы * drop * изменял отступ от A (и других). Я попробовал git checkout Q && git merge -Xignore-space-change A', но все изменения пространства тоже сливаются. – bagage

+0

Я вижу, наш отредактированный вопрос теперь делает это более ясным. Попробуйте мой обновленный ответ. – sschuberth

+0

Это странно. Хотя он работает для фиксации B и C, при объединении commit D все изменения пространства от A применяются, как если бы D требовал их. Но если я остановлюсь на фиксацию C, файл 'foo' выглядит разумно ... – bagage