Как я могу объединить мои "готовые" изменения в другую ветку без фиксации "не готовых" изменений? - PullRequest
1 голос
/ 29 октября 2009

У меня есть две ветви: master и development. Ветка development содержит несколько завершенных новых функций и пару незавершенных модификаций - однако, пока ничего не зафиксировано. Мастер не изменился с момента создания ветки dev.

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

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

Мой инстинкт инстинкта заключается в том, что я должен вручную добавить все связанные файлы из готового набора функций в очередь git, передать их в dev, а затем переключить ветви на master и выполнить слияние.

Но спасет ли это мою работу с незафиксированными функциями в ветке dev? Или это одна из тех ситуаций, которая требует кражи? Если да, то каков правильный порядок действий?

Ответы [ 3 ]

5 голосов
/ 29 октября 2009

Я думаю, что самым простым решением, без каких-либо хитростей, было бы:

  1. Используйте git add <file> для всех файлов, которые содержат изменения о готовой (готовой) функции.
    Sidenote: даже если ваши изменения смешаны, вы сможете использовать git add --interactive, чтобы выбрать, какие части изменений вы хотите иметь в следующем коммите.

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

    $ git stash --keep-index
    $ run tests
    $ git stash pop
    
  3. Сделать коммит из изменений, подготовленных в индексе (которые содержат изменения, которые готовы)

    $ git commit
    

    (лично я использую git commit -s для автоматического выхода, но это зависит от практики, используемой вашим проектом)

  4. Спрятать изменения, которые еще не готовы

    $ git stash save
    
  5. Извлечь ветку 'master' и объединить ее с веткой 'dev' (это должно привести к ускоренной перемотке вперед):

    $ git checkout master
    $ git merge dev
    
  6. Вернитесь в ветку 'dev' и отмените изменения

    $ git checkout dev
    $ git stash pop
    

Вы могли бы сделать это без использования git stash, полагаясь на тот факт, что ветвь 'master' должна выполнять быструю перемотку вперед, и напрямую манипулировать веткой 'master' с помощью команды git update-ref. Я не рекомендовал бы это, все же.

1 голос
/ 29 октября 2009

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

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

Затем от мастера просто выполните git merge last-complete-commit-id и на этом все.

РЕДАКТИРОВАТЬ: с помощью rebase -i вы можете изменить порядок коммитов в интерактивном режиме, поэтому, если они независимы, у вас не должно возникнуть проблем, просто git rebase -i HEAD ~ 5 (для 5 коммитов) и измените порядок линии.
Это, конечно, не сработает, если ваши коммиты не являются независимыми и должны быть один за другим

0 голосов
/ 29 октября 2009

Посмотрите на тайник и несколько примеров, как его использовать здесь . Лично я бы просто зафиксировал грязную ветку и затем слил с предыдущей версией. Фиксация в git обходится дешево, цель состоит в том, чтобы часто делать коммиты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...