Вопрос по git – Как сохранить сообщение о коммите при редактировании коммитов через git rebase --interactive?

12

Я в настоящее время в разгарgit rebase --interactive сеанс, где я редактирую коммит. Я действую в соответствии с предложениемКак я могу разделить коммит Git, похороненный в истории? то есть я побежалgit reset HEAD^ и сделал мои модификации. Теперь я хочу продолжить ребаз, что требует от меня принятия изменений. Я хочу изменить свое старое сообщение о коммите, но проблема в том,git commit --amendМне дано сообщение о коммите коммитаbefore тот, который я на самом деле модифицирую - и я, конечно, не хочу объединять свои изменения в этот коммит.

Итак, как мне получить мое старое сообщение о коммите для коммита, над которым я сейчас работаю?

коммит, помеченный для редактирования, является потомком того, который вы хотите разделить CharlesB
ОК, не уверен, что вы хотите, но предлагаемое сообщение о фиксации установлено наHEAD^один. Это прекрасно имеет смысл для меня, так как это тот, который вы хотите разделить CharlesB
Я действительно уверен, что пометил правильный коммит для редактирования и сброса индекса с помощьюgit reset HEAD^ действительно не внесенные изменения, над которыми я хотел работать ... (я на самом деле не пытаюсь разделить этот коммит, а просто изменяю некоторые из изменений, которые он вносит.) Bernhard Reiter
@CharlesB Вы пробовали это в рабочем процессе, как описано, то есть послеgit rebase --interactive, git reset HEAD^некоторые модификации и добавление файлов обратно в индекс? Bernhard Reiter
git commit --amend должен отобразить сообщение коммита, который вы редактируете (я только что попробовал), здесь должно быть что-то не так CharlesB

Ваш Ответ

4   ответа
1

У меня есть другой ответ, который кажется более надежным, хотя и без документов.

$ git reset HEAD^
$ git add ...               # stage the first part of your split
$ git commit -m 'part one'
$ git commit -a -F $(git rev-parse --git-dir)/rebase-merge/message
Опять же, оригинальный постер не хочет разделять свой коммит, поэтому создание двух коммитов не является правильным решением.
3

Зачем следовать инструкциям по разделению коммитовесли вы этого не хотите?

Вы не сбросили доHEAD^, это применимо только при разделении коммитов. Просто отметьте коммит для редактирования вrebase -iвнесите свои изменения,commit --amend а такжеrebase --continue.

Не нужно догадываться,git log --graph --oneline проясняет, чтоhead^ есть даже во времяrebase -i, Но я согласен, просто изменить коммит проще.
Не могли бы вы на самом деле сделатьgit reset head^, но вместо того, чтобы использоватьgit commit --amend, просто используйтеgit commit, затемrebase --continue? Тот же самый результат, не так ли?
Мне трудно понять, как можно догадаться, чтоHEAD^ в середине интерактивной перебазировки? внесение изменений в коммит просто и понятно
15

В то время какРешение CharlesB верное и, вероятно, более простоепричина, по которой оригинальный постер видит сообщение о коммитеbefore фиксация, которую он хочет отредактировать, заключается в том, что он использует--amend флагgit commit, который модифицируетthe previous совершить.

Вместо того, чтобы использовать--amend чтобы зафиксировать ваши изменения, просто используйтеgit commit без флага, который не коснется предыдущего коммита. Вы также можете передать опцию для повторного использования сообщения о коммите из коммита, который вы сбросили с помощьюgit reset head^:

git commit [email protected]{1}

# Or use -C, which is the same thing, but shorter:
git commit -C [email protected]{1}

[email protected]{1} указывает на коммит, на котором вы были доgit reset head^, Вы также можете просто передать sha id для этого коммита напрямую.

Отgit commit docs:

-C <commit>
--reuse-message=<commit>

Take an existing commit object, and reuse the log message and the authorship information (including the timestamp) when creating the commit.

Конечно, как я уже сказал, решение CharlesB проще, так как если вы не сделаете первыйgit reset head^Вы можете просто внести изменения и изменить коммит, который вы пытаетесь изменить напрямую, и вы автоматически получите предыдущее сообщение о коммите, когда сделаете это.git commit --amendдля этого вам не нужно передавать коммит.

@milkypostman это на самом деле зависит от вашей ОС и среды оболочки, msysgit и OS X, кажется, в порядке с заголовком нижнего регистра, но среды Unix, вероятно, будут принимать только верхний регистрHEAD.
@ user456814 Я подозреваюhead работает, если ваша файловая система нечувствительна к регистру; это, вероятно, относится к.git/HEAD файл в вашем репо. Как я уже упоминал выше, если ваша версия git не совсем свежая, вы можете использовать@ вместоhead или жеHEAD.
делает нижний регистрhead на самом деле работать здесь? мне пришлось использовать полностью заглавную версию.
HEAD можно заменить@ во всех версиях git за последние несколько лет, например[email protected]{1} становится@{1}, HEAD~ становится@~, Сохраняет некоторые набрав.
0

Я адаптировал несколько примеров вГИТ-фиксация (1) а такжеГИТ-сброс (1):

$ git reset HEAD^
$ git add ...                 # stage the first part of your split
$ git commit -m 'part one'
$ git commit -a -c ORIG_HEAD  # start with the earlier commit message

Если вы беспокоитесь о том, чтобы сделать что-то, что может изменитьсяORIG_HEADВы могли бы вместо этого сделать:

$ SAVED=$(git rev-parse HEAD)
$ git reset HEAD^
...
$ git commit -a -c $SAVED   # start with the earlier commit message
Кроме того, в вашем ответеORIG_HEAD указывает наthe first commit что оригинальный плакат был включен, прежде чем он начал перебазировать. Если он редактирует коммит, который является предкомORIG_HEAD, затемORIG_HEAD will not contain the original message для предка, в этом случае эта часть вашего решения будет неверным.
Я давно хотел еще раз взглянуть на это. Я не уверен, что все, что я упомянул вам в моих комментариях, было правильным, поэтому ваш ответ, возможно, был просто в порядке.
Часть вашего ответа, которая используетcommit без--amend флаг правильный. Однако, как гласит оригинальный плакатthis commentон не пытается разделить свой коммит, поэтому создание двух отдельных коммитов не является правильным решением.
Я ответил на вопрос так, как он написан, что я считаю справедливым. Оригинальный постер может редактировать его бесплатно. :-) И спасибо за исправление--ORIG_HEAD предполагаетgit reset HEAD^ уже случилось, что я не написал. Исправлено сейчас.

Похожие вопросы