Как я могу объединить два коммита в один коммит?

99

У меня есть ветка firstproject с 2 коммитами. Я хочу избавиться от этих коммитов и сделать их единым коммитом.

Команда git merge --squashзвучит многообещающе, но когда я запускаю git merge --squashсвой терминал, просто отображаются параметры для команды. Какая правильная команда?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'
Дон П
источник
Я не думаю, что это правильная команда. Кроме того, я сомневаюсь, что вы вообще можете изменять такие коммиты.
BSull
Нет, вы можете изменить несколько коммитов в одну: git-scm.com/book/en/Git-Tools-Rewriting-History, мой вопрос касается только конкретной команды для этого.
Don P
@BSull Вы можете изменять коммиты любым способом. Их можно полностью редактировать буквально в любое время. Если вы делитесь кодом с другими, это приведет к переписыванию вашей истории, и вы эффективно будете работать с другой веткой, чем все остальные.
meagar
Это никогда не должно было быть обманутым. Фактически, этот другой должен был быть закрыт как слишком широкий. Другой вопрос, который помечен как обман, является излишне сложным, поскольку включает отказ от предыдущей перезагрузки.
Эван Кэрролл

Ответы:

134

Вы хотите git rebase -iвыполнить интерактивную перебазировку .

Если вы в настоящее время находитесь на своей «фиксации 1», а фиксация, которую вы хотите объединить, «фиксация 2» - это предыдущая фиксация, вы можете запустить ее git rebase -i HEAD~2, в результате чего появится редактор, в котором будут перечислены все фиксации, по которым выполняется перебазирование. Вы должны увидеть две строки, начинающиеся с «выбрать». Чтобы продолжить раздавливание, измените первое слово второй строки с «выбрать» на «сквош». Затем сохраните файл и выйдите. Git превратит вашу первую фиксацию в вашу вторую последнюю.

Обратите внимание, что этот процесс перезаписывает историю вашей ветки. Если вы куда-то проталкиваете свой код, вам придется, git push -fи всем, кто делится вашим кодом, придется перепрыгнуть через некоторые препятствия, чтобы вывести ваши изменения.

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

Meagar
источник
2
Как это сделать Then write your file, and quit? Я использую терминал Android Studio, саму консоль git или даже открываю консоль git с помощью программного обеспечения SourceTree. Но как сохранить и выйти?
Доктор Джеки
1
Как объединить 2 коммита, которые не являются последними двумя коммитами в ветке?
Weishi Zeng
1
@meagar, я думаю, это имеет смысл ... если вы проверите эту проблему (дубликат этого), раздавление «направления» имело большое значение и было корнем всей проблемы (см. первый комментарий с примерно 200 голосами за « раздавливание не в ту сторону ') - stackoverflow.com/a/2568581/43453
PandaWood
1
@PandaWood Ты неправильно понял ответ. Первый способ был просто неправильным , не отличался . Вы можете сжать только назад, нет смысла думать о том, чтобы сдавливать старый коммит в новый, но если бы вы могли, это была бы та же операция.
meagar
1
Я так понял до "поменять первое слово второй строки" - вторая строка чего?
Эндрю Торр
70

Ленивая простая версия для таких забывчивых, как я:

git rebase -i HEAD~3 или сколько коммитов вместо 3.

Поверните это

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

в это

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

и выполните какое-то действие, в которое вы нажмете, escзатем, enterчтобы сохранить изменения. [1]

Когда появится следующий экран, избавьтесь от этих # строк мусора [2] и создайте новое сообщение фиксации или что-то в этом роде и выполните то же escape enterдействие. [1]

Ого, у вас меньше коммитов. Или вы просто все сломали.


[1] - или что угодно, что работает с вашей конфигурацией git. Это просто последовательность, которая эффективна с учетом моих настроек.

[2] - вы увидите кое-что вроде того, # this is your n'th commitчто несколько раз, с вашими исходными коммитами прямо под этим сообщением. Вы хотите удалить эти строки и создать сообщение фиксации, чтобы отразить намерения n коммитов, которые вы объединяете в 1.

Стаху
источник
Очень лаконичное решение - спасибо. Возможно, будет полезно обрисовать, что sздесь используется для обозначения сквоша. Чтобы использовать фиксацию, но слиться с предыдущей фиксацией
UrbanConor
Если вы только что сделали 2коммит и хотите объединить один и тот же 2коммит, вам нужно будет запустить git reset --soft HEAD~и git commit --amend.
scrutari
22
  1. Проверьте свою ветку и подсчитайте количество всех ваших коммитов.
  2. Откройте git bash и напишите: git rebase -i HEAD~<quantity of your commits>(т.е. git rebase -i HEAD~5)
  3. В открытом txtфайле измените pickключевое слово на squashдля всех коммитов, кроме первого коммита (который находится вверху). Для rewordначала измените его на (что означает, что вы предоставите новый комментарий для этого коммита на следующем шаге) и нажмите СОХРАНИТЬ! Если в vim, нажмите, escзатем сохраните ввод wq!и нажмите Enter.
  4. Оставьте комментарий.
  5. Откройте Git и сделайте «Получить все», чтобы увидеть новые изменения.

Выполнено

пользователь5820972
источник
Первый говорит мне, как использовать в vim. Большое спасибо
Хо Луонг,