git: как переупорядочить (строго) последовательность коммитов - PullRequest
5 голосов
/ 06 августа 2011

Я строю ретроспективную историю проекта из zip-снимков.Я уже построил длинную ветвь последовательности коммитов из снимков, которые должны были быть переданы.Теперь я добавил в конце еще несколько «найденных» снимков, которые должны быть в разных местах «посередине» последовательности фиксации.

Я пытаюсь использовать git rebase -i <startCommit>, чтобы изменить порядокмерзкие снимки.Я просто поменяю порядок списка выбора.Это должен быть просто случай перезаписи объектов фиксации, но с сохранением базовых деревьев (поскольку моментальные снимки не изменились).

Похоже, что в этом случае rebase все еще пытается создать патчи и имеет множество конфликтов, а не выполняет простую перестановку.Есть ли более подходящая команда для этого конкретного случая?У меня нет слияний, а только одна ветка.Весь репо все еще очень локальный и приватный.

Ответы [ 3 ]

3 голосов
/ 06 августа 2011

не беспокойтесь о перебазировании. Сделайте новую ветку. Если X является sha1 или древовидным из коммитов для использования, то:

git checkout X -- .
git add -A
git commit -C X

Повторите для всех коммитов в нужном вам хронологическом порядке.

Пример, в котором мы меняем порядок последних 5 коммитов:

git checkout -b temp old_branch~5
git checkout old_branch -- .
git add -A
git commit -C old_branch
git checkout old_branch~1 -- .
git add -A
git commit -C old_branch~1
git checkout old_branch~2 -- .
git add -A
git commit -C old_branch~2
git checkout old_branch~3 -- .
git add -A
git commit -C old_branch~3
git checkout old_branch~4 -- .
git add -A
git commit -C old_branch~4

git push . HEAD:old_branch -f
git checkout old_branch
git branch -d temp

git log -5 # to see the new history

надеюсь, это поможет.

0 голосов
/ 06 августа 2011

Если ваша история выглядит так:

a->b->c->d->e->f

Где e и f должны находиться где-то между a и d

Вы все еще можете сделать rebase -i, но поместите edit в коммит до того места, где вы хотите вставить моментальный снимок. Когда git делает паузу для этого редактирования, поместите снимок в ваш рабочий каталог и добавьте / подтвердите его. Продолжайте перебазирование до следующего места, промойте, повторите.

В случае, если это необходимо сказать, вы также захотите удалить изначально неуместные коммиты, e и f, которые имеют дело с неуместными моментальными снимками.

0 голосов
/ 06 августа 2011

Я не могу помочь сделать перебазирование проще, но могу объяснить, почему это не «простая перестановка».В качестве примера возьмем один файл с одной строкой текста, добавленной к ревизии.На первом коммите это выглядит так:

Commit 1

На втором коммите, так как вы изначально вывели их из строя, это выглядит так:

Commit 1
Commit 2
Commit 3

На третьем коммите,который был вашим вторым снимком, он выглядит следующим образом:

Commit 1
Commit 2

Git имеет дело с патчами , поэтому для git серия коммитов выглядит следующим образом:

  • Добавьте файл со строкой «Commit 1»
  • Добавьте строки со словами «Commit 2» и «Commit 3» после строки, содержащей «Commit 1»
  • Удалите строку с надписью «Фиксация 3» после строки с надписью «Фиксация 2»

Когда вы переупорядочиваете ее, она выглядит следующим образом:

  • Добавитьфайл со строкой «Commit 1»
  • Удалите строку «Commit 3» после строки «Commit 2»
  • Добавьте строки «Commit 2» и «Фиксация 3 "после строки с надписью" Фиксация 1 "

Он переходит ко второму шагу, не видит строк с" Фиксацией 2 "для сравнения, не знает, что делать, поэтомутребуется ручное слияние.

Вы вручную разрешаете слияние, а затем на следующем шаге git видит две строки там, где он ожидал, и снова требует ручного слияния.

...