Сворачивание промежуточных коммитов в более поздние коммиты, а не в более ранние

Предположим, у меня есть три коммита

A --> B' --> B

Фиксация B' представляет собой промежуточное состояние, когда работа не завершена и тесты не проходят. Возможно, я сделал коммит B', чтобы переключиться с работы на моей домашней машине на мою рабочую машину.

Допустим, я нахожусь в ветке темы, на которую кроме меня никто не смотрит. Но все три коммита находятся на удаленке, иначе я не смог бы использовать B' для передачи изменений с одной машины на другую.

Если я сделаю git rebase -i <commit-before-A> (или если A будет первой фиксацией, то git rebase i --root) и выберу fixup или squash фиксацию B', то изменения в B' будут свернуты в фиксацию A.

Но это не подходит. Я хочу, чтобы коммиты A и B представляли собой разумные контрольные точки в работе, где изменения не находятся в полузавершенном состоянии, которое никто не понял бы, кроме меня. Если я fixup коммит B', то останется коммит A с полусырыми изменениями, которые раньше были у B'. Я хочу, чтобы коммит B' был свернут в B, поскольку B' представляет собой промежуточную работу по направлению к коммиту B.

Возможные решения:

1а. Просто оставьте коммит B' и назовите его "фиктивный коммит", чтобы никто не обратил на него внимания. Это в моей тематической ветке (хотя она удалена), так что кого это волнует.

1б. Если я думаю, что люди потенциально могут посмотреть на мою текущую ветку темы и осудить меня за непрофессионализм, дайте B' свою собственную ветку, которая, я уверен, никого не волнует, а затем, как только B будет готова, закоммитить ее и объединить обратно в исходную ветку, затем удалите временную ветку. Так это выглядит

  BRANCH DELETED
  B' --> B''
 /         \
A ---------> B
 BRANCH REMAINING
  1. Избавьтесь от B', прежде чем я сделаю коммит B. Итак, если B' было сделано для переключения машин, как только я доберусь до другой машины, немедленно git reset --soft, затем, как только я закончу изменения, сделайте коммит B, затем git push --force на удаленный, затем, если и когда я вернусь к первому машина, используйте git pull --force. Прискорбно «переписывать историю» таким образом, и использование --force довольно часто кажется опасной привычкой.
  2. drop совершить B' вместо squash или fixup. Git, похоже, не очень разумно относится к этому и требует разрешения слияния, даже когда A --> B' --> B очевидно является быстрым изменением вперед. Опять же, вы переписываете историю, и --force потребуется несколько раз.
  3. Если две машины находятся в одной сети, вместо этого используйте общий доступ к файлам. Это кажется мне грубым и негибким.
  4. Сделайте один из них и живите с этим; это дело вкуса и всем не угодишь.

Имейте в виду, что цель этого вопроса не в том, чтобы начать спор о вкусах; это раскрыть плюсы и минусы, о которых я не думал, или представить мне варианты, о которых я не думал.

Похожие сообщения:

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте git rebase -i, чтобы раздавить B в B'. Используйте инструкцию squash, чтобы получить возможность отредактировать сообщение коммита.

После операции другие (и вы) увидят только новый коммит B", а B и B' скоро забудутся, и вам не придется переживать, что вы «обманули» и свернули B в B', а не наоборот.

Конечно, вам придется силой толкнуть ветку, но это не беда, как вы сказали, вы единственный, кто смотрит на нее. В этих условиях частые силовые толчки вовсе не плохая привычка.

Другие вопросы по теме