2012-02-17 10 views
2

Я только что сделал следующее с Git, но я не уверен, что это правильный способ делать вещи. У меня есть файл, который имеет некоторые вещи. Затем есть ветка, которая добавляет дополнительный материал в этот файл (расширяет его, это плагин, который мы продаем отдельно). Скажем branch1 и branch2 есть файл со следующим содержанием:Правильно ли следующая стратегия Git-фиксации?

----------- 
branch1 
----------- 
123 

----------- 
branch2 
----------- 
123 
qwe 
----------- 

Тогда я сделал некоторую работу над главной особенностью в branch1 и сделал обязательство этой отрасли. После этого я объединил branch1 в branch2, чтобы повторно применить эту новую функцию к версии этого файла. Теперь файлы

----------- 
branch1 
----------- 
1234 

----------- 
branch2 
----------- 
1234 
qwe 
----------- 

Но код не полностью работает, и теперь мне нужно, чтобы перейти к branch2 и сделать некоторые изменения в код, который расширяет файл там (изменить «QWE» на «Qwer»). Однако во время работы я также обнаружил некоторые ошибки в базовом коде («1234») и исправил их (изменив «1234» на «12345»). Теперь мой рабочий каталог с ГОЛОВОЙ, находясь в branch2 имеет следующее

----------- 
branch2 (working directory) 
----------- 
12345 
qwer 
----------- 

Теперь мне нужно совершить это, результат я стремлюсь это

----------- 
branch1 
----------- 
12345 

----------- 
branch2 
----------- 
12345 
qwer 
----------- 

Я боюсь, что если я просто совершить это branch2, а затем будет отдельно переназначить изменение 1234-> 12345 на ветку1 и зафиксировать это тоже, это даст результаты, которые я ищу, но Git признает это как два отдельных и полностью независимых фиксации, и когда я пройду через аналогичные процесс в будущем (например, 12345-> 123456 в ветке1, а затем branch1-> branch2 merge), я получу конфликт в этом месте. Поэтому мое решение состоит в том, чтобы использовать интерактивную постановку, чтобы совершить только qwe-> qwer change to branch2. Затем запишите оставшиеся изменения (в противном случае он не позволит переключиться на ветвь 1), переключитесь на другую ветвь, примените stash, скопируйте 1234-> 12345 в ветвь 1 и, наконец, слейте ветку1-> branch2.

Это сделало трюк, так как я относительно новичок в Git. Я не очень уверен, что я использую вещи правильно и наилучшим образом. Пожалуйста, дайте мне знать, если это имеет смысл, и если это не поможет мне лучше сказать.

ответ

1

Ваш подход кажется мне разумным. Я хотел бы сделать это по-другому, однако:

  1. Как только я вижу ошибки в базовом коде, копить и переключиться на branch1, и зафиксировать их там. Тест, полировка, фиксация.

  2. Выбросить старое слияние ветки 1 в ветвь2 и переделать его с помощью исправлений с шага 1 (я понимаю, что для ручных слияний git-rerere может уменьшить дублируемую работу, но я никогда не использовал ее), или просто снова слить и жить с немного более грязной историей.

Это гарантирует, что «ошибка исправления», на самом деле, подходящей для branch1 и не тонко разбитого за пределами кода branch2, и что они одинаковы в обеих ветвях.

С другой стороны, ответ «не делай этого»: это плохая архитектура программного обеспечения для «плагина», требующего изменения основного программного кода; что делает его действительно не плагин.Если вы исправите это, то основная программа и плагин станут независимыми деревьями (насколько это касается использования Git), и не требуется слияния (хотя обновления для совместимости, как и в вашем qwe → qwer, по-прежнему необходимы).

1

Вы можете использовать интерактивную надстройку (мерзавец добавить -p) на этапе изменения 'Qwer' и зафиксировать ее branch2, но вместо использования:

git stash 
git checkout branch1 
git stash pop 

вас может:

git checkout -m branch1 

который переносит изменения в рабочем дерево для branch1 и экономит вам несколько мерзавца команды