Снимок последнего коммита rebase и слияния совпадают? - PullRequest
0 голосов
/ 08 октября 2018

Я новичок в Git.Я читаю книгу на [https://git -scm.com / book / en / v2] , и теперь я нахожусь в главе "3.6 Перебазирование".

Эта глава имеетточка:

Обратите внимание, что моментальный снимок, на который указывает последний коммит, с которым вы закончите, будь то последний из переназначенных коммитов для перебазирования или финальный коммит слияния после слияния, одинаковСнимок - это только история, которая отличается.

Я думаю, что это не правильно во всех случаях.Давайте рассмотрим случай ниже.

Предположим, что мы находимся в коммите C0 на 2 ветвях master и test.И у нас есть пустой foo текстовый файл.

Далее мы извлекаем master, записываем текст "line 1" в foo и делаем коммит C1.Затем мы проверяем test, также пишем текст "line 1" до foo, делаем коммит C2.После этого мы удаляем текст "line 1" из foo, делаем коммит C3.

История теперь:

C0---C1 master
 \
  C2---C3 test-HEAD

Теперь у нас есть 2 случая для перемещения:

  1. Используйте объединение от git merge master: Git примет объединенный результат до C4.Содержимое foo сейчас равно "line 1".История теперь:

    C0---C1 master
    |      \
    C2--C3--C4 test
    
  2. Использовать перебазирование на git rebase master: последний коммит после перебазировки равен C3'.Содержимое foo теперь пусто.История теперь:

    C0---C1 master
          \
           C2'---C3' test
    

Как видите, моментальный снимок помечен C4 и C3' не совпадают, потому что содержимое foo в C4отличается от foo в C3'.Поэтому я думаю, что приведенное выше предложение в данном случае неверно.

У меня что-то не так?Спасибо.

P / s: Я не очень хорошо говорю по-английски, поэтому, пожалуйста, прости меня, если что-то не так в моем письме.

1 Ответ

0 голосов
/ 08 октября 2018

Использовать перебазирование мастером git rebase: последний коммит после перебазировки - C3 '.Содержимое foo теперь пусто.

Нет.C2 'пытается добавить "line1" в файл, но он уже содержит эту строку, поэтому вы получите конфликт.В зависимости от того, как вы разрешите конфликт, результат может отличаться.Если вы решите сохранить обе строки "line1" (ту, что в C1, и ту, которую вы добавляете в C2), то C3 'удалит одну из этих строк (опять же, вы получите конфликт, и это зависит от того, каквы решите это), и вы получите «line1» в качестве содержимого.

Я думаю, что ваша ошибка в том, что C3 и C3 'соответствуют одному и тому же снимку.Они не соответствуют: они соответствуют одному и тому же патчу, то есть одинаковому различию в отношении своих родителей.

Итог: rebase может создать больше конфликтов, чем merge, особенно в тех случаях, когда историяидет в одну сторону и отменяет это позже.Если у вас нет конфликтов, конечный результат rebase и merge должен совпадать.

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