Git Squash несколько коммитов против сброса в базовый коммит - PullRequest
0 голосов
/ 08 ноября 2019

Предположим, у меня есть базовый коммит B1 и поверх него я создаю локальные коммиты, скажем, C1, C2, C3. Есть два способа вставить последние изменения (C1, C2, C3) в git: -

  1. Чтобы сжать C1, C2, C3 в один коммит и выдвинуть его как один коммит.
  2. Для сброса на старую базу B1 (не сложно) и создания нового коммита C4, в который будут включены все коммиты C1, C2, C3.

Я хочу знать, какой путьлучше, а чем хуже и почему?

1 Ответ

0 голосов
/ 08 ноября 2019

Я бы предположил, что под squash вы имеете в виду rebase n, а затем их раздавите.

Итак, как я это вижу, здесьэто то, что предлагают различные подходы.

1. Использование reset

Когда вы используете сброс, вы перемещаете то, на что указывает HEAD.

Сброс текущего HEAD в указанное состояние.

Первое, что сделает сброс, это переместит то, на что указывает HEAD. Это не то же самое, что изменение самого HEAD (что делает checkout);reset перемещает ветку, на которую указывает HEAD. Это означает, что если для HEAD установлена ​​основная ветвь (т. Е. Вы в настоящее время находитесь в основной ветке), запуск git reset 9e5e6a4 начнется с установки мастер-точки на 9e5e6a4.

С учетом трех параметров, которые вы можете передать команде --soft --hard --mixed, вы можете полностью потерять работу или внести изменения в состояние "Changes to be committed".

Преимущество этого подхода в том, что он прост и быстр. Вы указываете git, куда хотите указать HEAD, а остальные изменения (в данном случае все 3 фиксации) будут объединены в одно большое изменение. Затем совершите и нажмите. Довольно просто.

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

2. Использование rebase

ПРИМЕЧАНИЕ: Здесь я говорю об интерактивном rebase, опять же с идеей правильной фиксации коммитов.

Когда вы rebase интерактивно в git, вам предоставляется список всех коммитов, которые вы указали для rebase. Они упорядочены, отформатированы, и под ними у вас есть набор команд, которые вы можете указать для каждого коммита. Поскольку мы заинтересованы в сдавливании, мы можем выбрать наш коммит для сквоша, а остальное мы можем пометить squash.

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

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

Недостатком этого подхода является то, что может быть сложнее использовать интерактивное меню git и что для выполнения squash может потребоваться немного больше времени.


Лично я считаю, что обе стратегии работают, но он чувствует , как rebase -ing, больше подходит для фиксации коммитов. Это зависит только от того, в какой ситуации вы находитесь. Если вы думаете, что вам лучше сбросить и повторно зафиксировать, тогда сделайте это. Но я думаю, что использование интерактивного rebase может избавить вас от путаницы в вашей истории.


Редактировать Я не видел, чтобы комментарии правильно указывали на то, что сжатие не единственный способ отправить коммит на ваш пульт. Может быть, это самый простой и легкий способ:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...