В git редактирование исторического предварительного извлечения после извлечения вызывает отклонение от источника - PullRequest
4 голосов
/ 20 ноября 2010

В следующем сценарии:

  1. Сделать коммиты A, B, C
  2. Pull, получение коммитов D, E
  3. Сделать больше коммитов F, G, H, ...
  4. Поймите, что вам нужно настроить B
  5. твик B с использованием git rebase -i и git commit --amend

Теперь git status говорит:

Your branch and 'origin/master' have diverged.

Как мне это исправить?

Примечание : я не толкал; это не имеет ничего общего с нажатием.

Примечание : Простое повторное нажатие не решает проблему; он просто объединяет коммиты D, E поверх того, что у меня уже есть (несмотря на то, что D, E уже было в истории), что также имеет побочный эффект, приводя к лишним конфликтам.

Чтобы уточнить, один ответ ниже предполагает, что история теперь такова:

- A - B' - C' - F' - G' - H' (master)
\
 D - E (origin/master)

Это не совсем правильно - это на самом деле:

- A - B' - C' - D(?) - E(?) - F' - G' - H' (master)
\
 D - E (origin/master)

Следовательно, моя проблема. Я бы хотел, чтобы это было:

- A - B' - C' - F' - G' - H' (master)
\         /
 D - E (origin/master)

Ответы [ 2 ]

1 голос
/ 20 ноября 2010

Я предполагаю, что вы не использовали опцию -p для git rebase, а это значит, что сделанное вами объединение коммитов D и E было уничтожено. Если это все, что случилось, это просто: просто потяните снова. Если это то, что произошло, ваша история будет выглядеть так:

- A - B' - C' - F' - G' - H' (master)
\
 D - E (origin/master)

Это ваше расхождение!

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

- A - B' - C' - X' - F' - G' - H' (master)
\              /
 D - E -------- - Z (origin/master)

и поэтому решение, опять же, будет тянуть.

Если, однако, вы выдвинули что-то, содержащее исходный коммит B, то вам не следовало бы перебазировать. Это всегда вызывает расхождение, и это не забавный вид. Ваша история будет выглядеть так:

    B' - C' - F' - G' - H' (master)
   /
- A - B - C - X - F - G - H (origin/master)
\            /
 D - E ------

Фундаментальный дизайн git заключается в том, что SHA1 коммита зависит от SHA1 его родителя и, следовательно, от всей цепочки предков. Вот почему после перебазирования я поставил «прайм» на все. Даже если вы не изменили содержимое C, коммит будет изменен. (Другая возможность, что вы сохранили слияние и выдвинули, должна быть выведена как комбинация двух последних картинок.)

0 голосов
/ 20 ноября 2010

Примечание: я не приму свой собственный ответ некоторое время, потому что мне искренне любопытны другие (лучшие) подходы.1004 *

...