git rebase 'magic', необходимый для сохранения истории коммитов - PullRequest
0 голосов
/ 08 июля 2011

Как мне получить:

master: A - B - C - D -------------- F - G - H
                     \             /  \
feature:               A' - B' - C'     D' - F' - G'

до:

master: A - B - C - D -------------- F - G - H
                     \             /          \
feature:               A' - B' - C'            D' - F' - G'

? В основном удаляя историю A'-C'-F, делая ребаз D'-G 'с F на H, затем добавляя его обратно. Это было бы ТАК ПОЛЕЗНО.

Вот более подробная информация о том, почему я этого хочу. Я использую ветку функций, когда я работаю. Мой рабочий процесс:

master: A - B - C - D
             \    
feature:      A' - B' - C'

Когда я закончу свою функцию, я делаю git rebase master, затем либо git rebase -i master, либо от мастера git merge --squash feature, а затем отправляю его мастеру как один хороший коммит.

Я получаю:

master: A - B - C - D - F
                     \    
feature:              A' - B' - C'

Где F - это просто A ', B' и C ', сжатые вместе. Все хорошо. Но затем я хочу продолжить работу над той же веткой функций. Я не понял, как это сделать. Я мог бы сделать:

feature2:                  D' - E' - F'
                         / 
master: A - B - C - D - F
                     \    
feature(archive):      A' - B' - C'

Что раздражает. Выполнение слияния --squash с последующим слиянием мастера и функции даст:

master: A - B - C - D -------------- F - G - H
                     \             /  \
feature:               A' - B' - C'     D' - F' - G'

Помогите мне добраться до этого:

master: A - B - C - D -------------- F - G - H
                     \             /          \
feature:               A' - B' - C'            D' - F' - G'

Итак, я мог бы подтолкнуть к мастеру, как:

master: A - B - C - D -------------- F - G - H ------------ I
                     \             /          \            /
feature:               A' - B' - C'            D' - F' - G'

и повторите цикл.

Последняя цифра, для комментария.

master: A - B - C - D -------------- merge - F - G - H
                     \              /    \
feature:               A' - B' - C' ---- merge - D' - F' - G'`

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Я думаю, ты слишком много думаешь. Ваш первый пример легко сделать, просто набрав git rebase master в ветви функций. Бит A' B' C' является общей историей, поэтому rebase игнорирует его.

Проблема может заключаться в том, что вы раздавливаете, чтобы создать F. Если вы хотите сохранить A' - B' - C' в истории, не давите - просто git merge. Если вы хотите избавиться от промежуточных коммитов, хорошо, продолжайте и давите, но затем вы должны выбросить эти коммиты и git reset --hard master в ветви функций, чтобы вернуться к истории, которую можно объединить с мастером. 1009 *

1 голос
/ 08 июля 2011

Комментарии OP Mihai :

Есть ли способ сделать так, чтобы это было в обоих направлениях?Для мастера было бы здорово иметь стабильные и логичные коммиты, но иметь возможность сохранять детали для себя.

Почему да, в теории есть (Хотя Блэр Холлоуэй уже дала убедительную причину не делать этого;)).
Вы должны помнить, что Git никогда не изменится /стереть / переопределить историю коммитов.Это только делает новые единицы.

Так что если:

  • вместо того, чтобы перебазировать / объединить, раздавив ветвь feature, вы перебазируете или сливаете feature-tmp ветвь (которую вы создаете там, где feature), вы все равно будете иметь ветку feature на месте!
    (потому что features HEAD будет по-прежнему ссылаться на эти "старые" коммиты до иребаз или сквош)
  • тогда вы бы git checkout feature (который все еще там) и git merge -s ours master обратно к feature (таким образом, и последующее слияние или перебазирование будет учитывать только фиксации объектов с после это первый ребаз или слияние)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...