Подтвердить что ты не робот

Что это означает, что сквош коммитов в git?

Что означает Squashing в значении git. Как выполнить сквош в Github?

Я новичок в git, и я попросил назначить ошибку newcomer в coala-анализаторе. Я исправил ошибку, и теперь меня попросили раздавить мои коммиты. Как мне это сделать?

4b9b3361

Ответ 1

Вы можете думать о Git как о продвинутой базе данных снимков вашего рабочего каталога (ов).

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

Раздавить коммит означает, с идиоматической точки зрения, перенести изменения, внесенные в указанный коммит, в его родителя, чтобы в итоге вы получили один коммит вместо двух (или более).
Если вы повторите этот процесс несколько раз, вы можете уменьшить n commit до одного.

Визуально, если вы начали свою работу с коммита с тегом Start, вам нужно это

Git commits squashing

Вы можете заметить, что новый коммит имеет немного более темный оттенок синего. Это намеренно.

В Git сжатие достигается с помощью Rebase особой формы, называемой Interactive Rebase.
Упрощая, когда вы перемещаете набор коммитов в ветку B, вы применяете все изменения, внесенные этими коммитами, как они были сделаны, начиная с B вместо их первоначального предка.

Визуальная подсказка

enter image description here

Еще раз обратите внимание на различные оттенки синего.

Интерактивная перебазировка позволяет вам выбрать, как коммиты должны быть перебазированы. Если вы выполните эту команду:

 git rebase -i branch

Вы получите файл со списком коммитов, которые будут перебазированы

 pick ae3...
 pick ef6...
 pick 1e0...
 pick 341...

Я не назвал коммиты, но эти четыре предназначены для коммитов от начала до головы

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

 pick ae3...
 squash ef6...
 squash 1e0...
 squash 341...

Если вы закроете редактор и не обнаружите конфликтов слияния, вы получите эту историю:

enter image description here

В вашем случае вы не хотите переходить в другую ветку, а скорее в предыдущую фиксацию.
Чтобы преобразовать историю, как показано в самом первом примере, вы должны выполнить что-то вроде

git rebase -i HEAD~4

измените "команды" на "раздавить" для всех коммитов, кроме первого, а затем закройте редактор.


Примечание об изменении истории

В Git коммиты никогда не редактируются. Их можно обрезать, сделать недоступными, клонировать, но не изменить.
Когда вы перебазируете, вы фактически создаете новые коммиты.
Старые ссылки больше не доступны ни для каких ссылок, поэтому они не показаны в истории, но они все еще там!

Вот что вы на самом деле получаете за ребаз:

enter image description here

Если вы уже где-то их подтолкнули, переписывание истории фактически сделает ветку!

Ответ 2

Команда rebase имеет несколько потрясающих опций, доступных в режиме --interactive (или -i), и одна из наиболее широко используемых - это возможность сдавливать коммиты. То, что это делает, это берет меньшие коммиты и объединяет их в более крупные, что может быть полезно, если вы заканчиваете работу дня или просто хотите упаковать изменения по-другому. Мы собираемся обсудить, как вы можете сделать это легко.

Предостережение: Делайте это только с коммитами, которые не были переданы во внешний репозиторий. Если другие основывают работу на коммитах, которые вы собираетесь удалить, может возникнуть множество конфликтов. Только не переписывайте свою историю, если она была передана другим.

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

enter image description here

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

$ git rebase -i HEAD~4

pick 01d1124 Adding license
pick 6340aaa Moving license into its own file
pick ebfd367 Jekyll has become self-aware.
pick 30e0ccb Changed the tagline in the binary, too.

# Rebase 60709da..30e0ccb onto 60709da
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Итак, здесь произошло несколько вещей. Прежде всего, я сказал Git, что хочу сделать ребаз, используя последние четыре коммита, откуда HEAD находится с HEAD ~ 4. Теперь Git поместил меня в редактор с приведенным выше текстом и небольшим объяснением того, что можно сделать. У вас есть много вариантов, доступных вам на этом экране, но сейчас вы просто собирались объединить все в один коммит. Таким образом, изменение первых четырех строк файла на это поможет:

pick 01d1124 Adding license
squash 6340aaa Moving license into its own file
squash ebfd367 Jekyll has become self-aware.
squash 30e0ccb Changed the tagline in the binary, too.

По сути это говорит Git объединить все четыре коммита в первый коммит в списке. Как только это будет сделано и сохранено, появится другой редактор со следующим:

# This is a combination of 4 commits.
# The first commit message is:
Adding license

# This is the 2nd commit message:

Moving license into its own file

# This is the 3rd commit message:

Jekyll has become self-aware.

# This is the 4th commit message:

Changed the tagline in the binary, too.

    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    # Explicit paths specified without -i nor -o; assuming --only paths...
    # Not currently on any branch.
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #   new file:   LICENSE
    #   modified:   README.textile
    #   modified:   Rakefile
    #   modified:   bin/jekyll
    #

Поскольку было объединено так много коммитов, Git позволяет вам изменять новое сообщение коммитов, основываясь на остальных коммитах, вовлеченных в процесс. Отредактируйте сообщение, как считаете нужным, затем сохраните и выйдите. Как только это будет сделано, ваши коммиты будут успешно раздавлены!

Created commit 0fc4eea: Creating license file, and making jekyll self-aware.
 4 files changed, 27 insertions(+), 30 deletions(-)
  create mode 100644 LICENSE
    Successfully rebased and updated refs/heads/master.

И если мы посмотрим на историю снова... enter image description here

Итак, пока это было относительно безболезненно. Если вы сталкиваетесь с конфликтами во время перебазирования, их обычно довольно легко разрешить, и Git проводит вас как можно больше. Основой этого является исправление рассматриваемого конфликта, git add файл, а затем git rebase --continue возобновит процесс. Конечно, выполнение git rebase --abort вернет вас в ваше предыдущее состояние, если вы захотите. Если по какой-либо причине вы потеряли коммит в ребазе, вы можете использовать reflog, чтобы вернуть его.

Подробности можно найти по этой ссылке.