2015-10-05 4 views
1

Недавно у меня был большой успех, решая репозиторий локального репозитория при изменении сообщений фиксации, после чего только сообщения фиксации были изменены, но сама история не имеет.git rebase interactive уже нажал Commits

Теперь у меня есть свои репозитории - удаленно и локально. Я сделал несколько коммитов на нескольких филиалах и уже подтолкнул их. По некоторым причинам мне нужно изменить некоторые коммиты фиксации по нескольким ветвям и попытаться использовать rebase-интерактив, как раньше. Но коммиты появились в конце текущей проверенной ветки.

(я знаю, как и у меня было сбросить свои репозиториев в состояние до перебазирования.)

Через некоторое чтение я понял, что проблема заключается в коммиты толкнули уже который не был факт в моей информации локального только репозиторий.

Я попытался переустановить удаленный репозиторий, но он голый - так что это не сработало.

Я знаю, что его не рекомендуется. Но для учебных целей мне очень нравится знать, как изменять несколько сообщений фиксации, не приводя к дублированию коммитов в конце моего филиала/репозитория.

(мне не нравится решение работать, чтобы скопировать и изменить свое локальное хранилище на голой один, как мой новый удаленный репозиторий, который позволит решить мою проблему.)

Я надеюсь, что я сделал сам достаточно ясно. Благодарю.

ответ

1

Изменение сообщения фиксации приводит к изменению значения хеш-функции фиксации, и это означает, что все последующие коммиты также должны изменить свои хэши (поскольку родитель включен в хэш-вычисление, так как само сообщение тоже).

Именно поэтому перезагрузка обычно разрешается только в локальных ветвях. Многие или говорят, что большинство удаленных репозиториев git позволяют переписывать перенесенную историю, поскольку кто-то уже мог ее загрузить, а затем работал над устаревшей историей/веткой/фиксацией.

Strategy for preventing or catching git history rewrite

Однако, если ваш сервер не позволяет историю переписывает (например, если вы только один работает на ней), вы можете подтолкнуть их с --force.

В качестве примечания смотрите здесь https://stackoverflow.com/a/5668050/1756183

Edit перебазироваться с несколькими филиалами:

C1 <- C2 <- C3 (branch1) 

перебазирования детей приводит С1 в

C1 <- CR2 <- CR2 (branch1) 

Но если у вас есть:

 /C4 <- C5 (branch2) 
C1 <- C2 <- C3 (branch1) 

перебазирования, скорее всего, приведет к:

/C2 <- C4 <- C5 (branch2) 
C1 <- CR2 <- CR3 (branch1) 

причина заключается в том, что C2 по-прежнему является родителем C4, «фиксированным» совершает CR2 только связанные с переписанным отделением branch1. Если вы хотите «забыть» C2, вам нужно переустановить C4 поверх CR2 (вам придется играть с rebase --onto). После этого C2 не рассматривается как чей-либо родитель или ни одна ветка и не будет отображаться в истории (хотя он все еще там до сбора мусора).

+0

Я проверил его, и у меня нет такого набора git-config на моем сервере. С другой стороны, я уже использовал: 'git rebase --interactive SHA', маркер нацеливается на' reword', 'git push -force'. Но проблема все еще существует. Я уже использовал ответ http://stackoverflow.com/a/5668050/1756183, но та же проблема. В вашей первой ссылке я нашел 'receive.denyDeletes', которая приводит меня к идее удалить удаленные ветви, перезагрузить мою локальную историю и нажать ее тогда. Ни в коем случае ... проблема остается. – codekandis

+0

Проблема может заключаться в том, что мой текущий проект имеет несколько ветвей, когда мой первый не сделал этого. – codekandis

+0

Добавил дополнительную информацию к сообщению - это должно объяснить эффекты, которые вы видите. – dag

Смежные вопросы