Легкий способ получить Git squash?

Я часто так делаю:

git add -u
git commit

... обнаружите ошибку, исправьте ...

git add -u
git commit -m "Fix typo"

Есть ли простой способ превратить вторую фиксацию в первую? Иногда я могу сделать это с помощью git rebase -i, но иногда я просто получаю сообщение о том, что я обновлен.

Заметьте, я действительно говорю только о ситуациях, когда я не нажал на первую фиксацию. В основном я хочу использовать первое сообщение журнала, но с комбинированным эффектом двух коммитов. Могу ли я использовать git commit --amend для таких вещей?

Этот связанный с этим вопрос связан с этим: git: squash / fixup previous commit

Однако лучший ответ - годичной давности, и мне интересно, улучшилось ли положение?


person Steve Bennett    schedule 27.03.2012    source источник


Ответы (3)


Это именно то, для чего нужен git commit --amend. Учитывая ваш пример, все, что вам нужно сделать, это добавить флаг --amend во вторую фиксацию:

git add -u
git commit

... обнаружите ошибку, исправьте ...

git add -u
git commit --amend

Вы также можете сделать это визуально в git gui (есть переключатель для переключения между «новой фиксацией» и «исправлением последней фиксации»)

person dbr    schedule 27.03.2012
comment
Интересно - про git gui не знал. Интересно, почему там и то, и gitk. (Конкуренция за уродливый приз?: P) - person Steve Bennett; 27.03.2012
comment
У этих двух разные цели: git gui - для фиксации, а gitk - для просмотра и управления ветвями. Обратите внимание, что вы можете начать git gui с gitk и наоборот. - person François; 27.03.2012

Лучшее, что я нашел, - это статья, в которой рассказывается о функции автоквоша, представленной в git 1.7.

http://technosorcery.net/blog/2010/02/07/fun-with-the-upcoming-1-7-release-of-git-rebase---interactive---autosquash/

person Waynn Lue    schedule 27.03.2012

Да, вы можете просто изменить предыдущую фиксацию.

git add typointhisfile
git commit -vm

ИЛИ, если вы уже создали 2 коммита - вы можете сделать их одним с помощью:

git rebase -i HEAD~2

Просто вдавите один из них в другой.

Вам лучше (ИМО), в первую очередь, предотвратить проблему. И для этого я предлагаю всегда делать подробные коммиты:

git commit -v

Перед написанием сообщения о фиксации просмотрите список изменений, которые вы собираетесь зафиксировать, и просто закройте редактор, если вы видите что-то, что вам нужно исправить. Закрытие без ввода сообщения о фиксации прервет фиксацию.

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

person AD7six    schedule 27.03.2012
comment
Ага. На самом деле я провожу множество визуальных проверок (в частности, git diff --cached). Все еще легко пропустить что-то. И, конечно же, вы должны часто совершать коммиты. Так что нет смысла откладывать коммит, пока все не станет идеально ... - person Steve Bennett; 27.03.2012
comment
часто совершать и совершать ошибки - это 2 разные вещи @SteveBennett - person AD7six; 27.03.2012