2016-06-28 3 views
2

Я пытаюсь выяснить рабочий механизм git-rebase. Documentation содержит информацию о том, что делает git-rebase, но не комментирует, как это делается?git rebase реализация подробности

Я посмотрел в source code, разработал несколько тестовых случаев и до сих пор понимают следующее:
1. Git сохраняет состояние перебазироваться в .git/rebase-apply (с файлами, как патч, окончательный зафиксированной, имя головы и т.д.)
2. Git использует git-format-patch создать все необходимые файлы исправлений (которые находятся внутри перебазироваться применить)
3. Git использует git-am применить эти патчи один на один

Я думаю, что мне не хватает довольно много деталей. Где я могу найти детали реализации? Это просто сбрасывает патч и наивно применяет его?

+0

См. [Это] (http://stackoverflow.com/a/11566503/2949612) ответ. – pRaNaY

+0

@pRaNaY, этот ответ больше о том, что git rebase делает. Я ищу, как это происходит? –

+0

Почему бы вам не копаться в самом коде? :) – everton

ответ

3

Ваше резюме в основном завершено. Ребаза на самом деле относительно проста.

  1. Во-первых, рассчитанная работа. Это в основном git rev-list <upstream>..<branch>, чтобы идентифицировать все транзакции, которые необходимо переместить.
    1. Если вы делаете обычную (патч-основанную) переадресацию, тогда патчи для каждой из этих коммитов будут сгенерированы и сохранены в папке состояния переадресации (.git/rebase-apply).
    2. Если вы вызывали rebase с git rebase --merge, тогда фиксации сохраняются в другой папке состояния (.git/rebase-merge).
  2. Далее HEAD отсоединяется и устанавливается в onto фиксации (новая базовая отрасль, где вы будете применять эти изменения).
  3. Приложение выполняется до тех пор, пока фиксация не может быть применена.
    1. Если вы делаете исправление на основе патчей, то патчи применяются по порядку. Если патч не применим, Git попытается вместо этого выполнить cherry-pick рассматриваемое коммитирование. Это связано с тем, что cherry-pick способен записывать конфликты слияния в индекс и рабочий каталог.
    2. Если вы выполняете перезагрузку на основе слияния, тогда фиксация - cherry-pick ред.
  4. Если ошибка cherry-pick не удалась, перестановка остановок и вы (пользователь) должны разрешить любые конфликты и git add их индексу. Когда вы разрешите все конфликты, вы можете git rebase --continue.
  5. После того, как все конфликты были применены, исходная ветка обновляется, чтобы указать на окончательную, переустановленную фиксацию.