Объединение нескольких транзакций в один

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

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

Сначала, рассмотрите эту плохую практику? Не было бы разумнее придерживаться одной фиксации на каждую ветку за толчок? В каких случаях было бы хорошо иметь несколько коммитов на ветке до нажатия?

Второй, как мне лучше всего выполнить перенос нескольких коммитов на ветку topical_xFeature в главную ветку для нажатия? Не стоит ли беспокоиться об этом и просто делать толкание, когда нажимают несколько коммитов, или это менее раздражает, чтобы каким-то образом объединить коммиты в один, а затем нажать? Опять же, как это сделать?

Ответ 1

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

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

Если вы хотите сжать несколько коммитов вместе, вы можете использовать git rebase -i. Если вы находитесь в ветке topical_xFeature, вы запустите git rebase -i master. Это откроет окно редактора с кучей коммитов, перечисленных в префиксе pick. Вы можете изменить все, кроме первого, на squash, которое сообщит Git, чтобы сохранить все эти изменения, но высунуть их в первый коммит. После того, как вы это сделали, проверьте master и объедините свою ветку функций:

git checkout topical_xFeature
git rebase -i master
git checkout master
git merge topical_xFeature

В качестве альтернативы, если вы просто хотите выкачать все в topical_xFeature в master, вы можете просто сделать следующее:

git checkout master
git merge --squash topical_xFeature
git commit

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

Ответ 2

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

Чтобы достичь этого, я предлагаю вам использовать концепцию " сквош ", предоставленную GIT.

Выполните следующие шаги.

1) мастер git rebase -i (вместо мастера вы также можете использовать определенный коммит)

откройте интерактивный редактор rebase, где он покажет все ваши коммиты. В основном, где вам нужно идентифицировать коммиты, которые вы хотите объединить в один коммит.

Представьте, что это ваши коммиты и что-то подобное показано в редакторе.

pick f7f3f6d changed my name a bit    
pick 310154e updated README formatting and added blame   
pick a5f4a0d added cat-file  

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

2) Измените 'pick' на 'squash' для последних совершенных изменений. что-то вроде показано ниже. При этом ваши последние 2 коммита будут объединены с первым.

pick f7f3f6d changed my name a bit         
squash 310154e updated README formatting and added blame   
squash a5f4a0d added cat-file

Вы также можете использовать короткую форму, если у вас есть много коммитов для объединения:

p f7f3f6d changed my name a bit         
s 310154e updated README formatting and added blame   
s a5f4a0d added cat-file

для редактирования используйте 'i', он включит редактор для вставки. Имейте в виду, что большинство (самых старых) коммитов не могут быть раздавлены, так как нет предыдущего коммита, с которым можно было бы объединиться Так что это должно быть выбрано или "р". Используйте "Esc" для выхода из режима вставки.

3) Теперь сохраните редактор с помощью следующей команды. : WQ

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

Надеюсь, что это поможет вам.

Ответ 3

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

Второй: a git merge --no-ff topical_xFeature будет записывать на master как единый текст для вашей темы, прежде чем нажать master.
(Таким образом, вы сохраняете topical_xFeature для дальнейших эволюций, которые вы можете записать на master как один новый коммит при следующем слиянии --no-ff.
Если избавиться от topical_xFeature является целью, то git merge --squash является правильной опцией, как описано в Брайан Кэмпбелл ответить.)

Ответ 4

Переключитесь на главную ветку и убедитесь, что вы в курсе.

git checkout master

git fetch это может быть необходимо (в зависимости от вашего git config), чтобы получать обновления на origin/master

git pull

Объединить ветвь объектов с основной веткой.

git merge feature_branch

Сбросьте основную ветвь в исходное состояние.

git reset origin/master

Git теперь считает все изменения неустановленными. Мы можем добавить эти изменения как один коммит. Добавление также добавит неотслеживаемые файлы.

git add --all

git commit

Ссылка: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit

Ответ 5

1) Сначала выберите, какой коммит вы хотите, чтобы все было после.

git reflog
5976f2b [email protected]{0}: commit: Fix conflicts
80e85a1 [email protected]{1}: commit: Add feature
b860ddb [email protected]{2}: commit: Add something

2) Сброс на выбранную вами голову (я выбрал HEAD @{2})

git reset b860ddb --soft

3) git status (просто чтобы быть уверенным)

4) Добавьте ваш новый коммит

git commit -m "Add new commit"

Примечание: [email protected]{0} & [email protected]{1} теперь объединены в 1 коммит, это можно сделать и для нескольких коммитов.

git reflog снова должен отобразить:

git reflog
5976f2b [email protected]{0}: commit: Add new commit
b860ddb [email protected]{1}: commit: Add something