Какой мой предыдущий коммит при запуске интерактивной перебазировки? - PullRequest
0 голосов
/ 02 мая 2020

Когда я запускаю что-то вроде git rebase -i --rebase-merges eeb1425e0, мой список коммитов отображается вверх ногами, т. Е. Первый коммит является последним, а последний коммит первым:

pick A Penultimate commit
pick B Penult commmit
pick C Latest commit

# Rebase eeb1425e..5a3f045b onto eeb1425e (288 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Затем, когда сква * Опция 1029 * говорит squash = use commit, but meld into previous commit, а я пу sh squash следующим образом:

pick A Penultimate commit
squash B Penult commmit
pick C Latest commit

Предыдущий коммит B равен A или C? Будет ли B объединен / сжат с A или C?

Относится к:

  1. Как мне объединить два коммита в один, если я уже начался rebase?
  2. Что именно делает git "rebase --preserve-merges" (и почему?)

1 Ответ

1 голос
/ 02 мая 2020

Порядок фиксации действительно противоположен тому, что вы обычно видите с git log, поэтому для:

pick A Penultimate commit
pick B Penult commmit
pick C Latest commit

, если вы измените вторую строку на squash, Git будет:

  • вишневый коммит A до начинать создание нового коммита, но пока не делает его;
  • squa sh коммит B до того, как сделать новый коммит; и
  • вишневый коммит C для создания второго нового коммита;

, дающий вам то, что мне нравится рисовать, в виде:

          A--B--C   [abandoned]
         /
...--o--o--AB--C'   <-- branch-name

Здесь цепочка A-B-C - это три исходных коммита, последний из которых нарисован справа (а не сверху или снизу), а новая цепочка AB-C' - это два новых коммита, опять же, с последним, нарисованным на правильно. Ваше имя ветви использовалось для идентификации коммита C, а теперь идентифицирует новую копию C'.


Примечание: слово для третьего от последнего - antepenultimate . «Предпоследний» буквально означает «второй из последних» . Если есть четвертый от последнего, который вам нужно идентифицировать, это preantepenultimate . Похоже, что не существует английского языка - «пятый из последних». Следующие ссылки приводят здесь к propreantepenultimate , но, например, смотрите статус в словаре Коллинза .

Еще одно замечание: интерактивная перебазировка желательна сделать и затем отменить фиксацию, поэтому приведенное выше описание («squa sh перед тем, как фактически делать коммит») является просто кратким обозначением того, что вы увидите при просмотре результатов, а не полным описанием основной механизм. Фактический набор коммитов может включать дополнительные заброшенные временные коммиты. Git со временем все очистит самостоятельно.

...