Объединение Нескольких Коммитов В Один Перед Нажатием
этот вопрос относится не только к тому, как выполнить эту задачу, но является ли это хорошей или плохой практикой с Git.
считайте, что локально я делаю большую часть работы над главной веткой, но я создал актуальную ветку, которую я буду называть "topical_xFeature". В процессе работы над " topical_xFeature "и переключения туда и обратно, чтобы выполнить другую работу над главной ветвью, оказывается, что я сделал более одного коммита на ветке" topical_xFeature", но между каждым совершите, я не сделал никакого толчка.
первый, вы считаете это плохой практикой? Не будет ли разумнее придерживаться одного коммита на ветку за толчок? В каких случаях было бы хорошо иметь несколько коммитов на ветке до того, как будет сделан толчок?
второй, как мне лучше всего выполнить приведение нескольких коммитов на ветке topical_xFeature в главную ветвь для толчка? Это неприятность, чтобы не беспокоиться об этом и просто сделать пуш, где несколько коммитов подталкиваются, или это менее раздражает, чтобы каким-то образом объединить коммиты в один, а затем нажать? Опять же, как это сделать?
4 ответа:
для вашего первого вопроса, нет, нет ничего плохого в том, чтобы нажать несколько коммитов сразу. Много раз вы можете разбить свою работу на несколько небольших логических коммитов, но только поднимите их, как только почувствуете, что вся серия готова. Или вы можете сделать несколько коммитов локально при отключении, и вы нажимаете их все, как только вы снова подключены. Нет причин ограничивать себя одним коммитом за толчок.
Я вообще считаю, что это хорошая идея, чтобы сохранить каждый фиксирует одно, логическое, последовательное изменение, которое включает все, что ему нужно для работы (поэтому он не оставляет ваш код в сломанном состоянии). Если у вас есть два коммита, но они приведут к тому, что код будет нарушен, если вы примените только первый, может быть хорошей идеей раздавить второй коммит в первый. Но если у вас есть два коммита, где каждый делает разумное изменение, толкая их как отдельные коммиты, все в порядке.
если вы хотите раздавить несколько коммитов вместе, вы можете использовать
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
что вы выберете зависит от вас. Как правило, я бы не беспокоился о том, чтобы иметь несколько меньших коммитов, но иногда вы не хотите беспокоиться о дополнительных незначительных коммитах, поэтому вы просто раздавите их в один.
Это способ, которым я обычно следую, чтобы объединить несколько коммитов в один коммит, прежде чем я нажму код.
чтобы достичь этого, я предлагаю вам использовать 'сквош' концепция, предоставленная 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
важно отметить, что эти изменения перечислены в обратном порядке, чем вы обычно видите их с помощью команды журнала.Значит, старшая фиксация будет показана первой.
2) изменить "выбор" на "сквош" для последних зафиксированных изменений. что-то вроде показано ниже. Таким образом, ваши последние 2 коммита будут объединены с первым один.
pick f7f3f6d changed my name a bit squash 310154e updated README formatting and added blame squash a5f4a0d added cat-file
для редактирования используйте 'i', это позволит редактор для вставки.
3) Теперь, сохранить редактор С помощью следующей команды. : wq
когда вы сохраняете это, у вас есть один коммит, который вводит изменения всех трех предыдущих коммитов.
надеюсь, что это поможет вам..
первый: ничто не говорит вам, что у вас есть только одна фиксация на ветку за push: push-это механизм публикации, позволяющий публиковать локальную историю (т. е. коллекцию коммитов) на удаленном РЕПО.
второй: a
git merge --no-ff topical_xFeature
записывал бы на мастер как единая фиксация вашей темы работы, прежде чем нажиматьmaster
.
(Таким образом, вы держитеtopical_xFeature
вокруг для дальнейших эволюций, что вы можете записать наmaster
как одна новая фиксация при следующем слиянии --нет-ФФ.
Если избавиться отtopical_xFeature
есть цель, тоgit merge --squash
это правильный вариант, как описано в Брайан Кэмпбелл ' s ответ.)
переключитесь на главную ветку и убедитесь, что вы в курсе.
git checkout master
git fetch
это может быть необходимо (в зависимости от вашей конфигурации git) для получения обновлений на origin/mastergit pull
слить ветку в ветку master.
git merge feature_branch
сброс главной ветви в исходное состояние.
git reset origin/master
git сейчас учитывает все изменения в неиндексированных изменений. Мы можем добавить эти изменения в один коммит. Добавление. также добавить игнорируемых файлы.
git add --all git commit
Ref: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit