Этот вопрос касается не только того, как выполнить эту задачу, но и того, является ли это хорошей или плохой практикой с Git.
Учтите, что локально я больше всего работаю над основной веткой, но я создал тематическую ветку, которую назову «topical_xFeature». В процессе работы над «topical_xFeature» и переключения туда и обратно для выполнения другой работы в основной ветке выясняется, что я сделал более одной фиксации в ветке «topical_xFeature», но между каждой фиксацией я не делал От себя.
Во-первых , считаете ли вы это плохой практикой? Разве не было бы разумнее придерживаться одной фиксации на ветку за нажатие? В каких случаях было бы хорошо иметь несколько коммитов в ветке до того, как будет сделан push?
Во-вторых , как мне лучше всего выполнить перенос нескольких коммитов из ветки topical_xFeature в главную ветку для push-уведомлений? Разве неприятно не беспокоиться об этом и просто делать push, когда несколько коммитов отправляются, или менее неприятно как-то объединить коммиты в один, а затем нажать? Опять же, как это сделать?
источник
git branch -d topic
. Почему git не может определить, что все изменения объединены?git branch -D topic
чтобы принудительно удалить ее.Это способ, которым я обычно следую, чтобы объединить несколько коммитов в один коммит, прежде чем вставлять код.
Для этого я предлагаю вам использовать концепцию « сквоша », предоставленную GIT.
Следуйте приведенным ниже инструкциям.
1) git rebase -i master (вместо master вы также можете использовать конкретный коммит)
откройте интерактивный редактор rebase, в котором будут показаны все ваши коммиты. В основном там, где вам нужно идентифицировать коммиты, которые вы хотите объединить в один коммит.
Представьте, что это ваши коммиты и они показаны в редакторе примерно так.
Важно отметить, что эти коммиты перечислены в порядке, обратном тому, который вы обычно видите с помощью команды log. Значит, сначала будет показан более старый коммит.
2) Измените «pick» на «squash» для последних зафиксированных изменений. что-то вроде показанного ниже. При этом ваши последние 2 коммита будут объединены с первым.
Вы также можете использовать короткую форму, если вам нужно объединить много коммитов:
для редактирования используйте 'i', это позволит редактору вставить. Имейте в виду, что самая старая (самая старая) фиксация не может быть сдавлена, так как нет предыдущей фиксации для объединения. Так что его нужно выбрать или "p". Используйте «Esc» для выхода из режима вставки.
3) Теперь сохраните редактор с помощью следующей команды. : WQ
Когда вы сохраните это, у вас будет одна фиксация, которая вводит изменения всех трех предыдущих коммитов.
Надеюсь, что это поможет вам.
источник
git rebase -i HEAD~2
было полезно начать. Тогда этот ответ оказался полезным. Затем яgit status
показал: «Ваша ветка и 'origin / feature / xyz' разошлись и имеют 1 и 1 разные коммиты соответственно». Поэтому мне нужно былоgit push origin feature/xyz --force-with-lease
увидеть stackoverflow.com/a/59309553/470749 и freecodecamp.org/forum/t/…Во-первых : ничто не говорит вам о том, что нужно иметь только одну фиксацию для каждой ветки на push: push - это механизм публикации, позволяющий публиковать локальную историю (то есть коллекцию коммитов) в удаленном репо.
Во-вторых : a
git merge --no-ff topical_xFeature
будет записывать в master как отдельную фиксацию вашу работу по теме, прежде чем нажиматьmaster
.(Таким образом, вы сохраните
topical_xFeature
для дальнейшего развития, что вы можете записатьmaster
как один новый коммит при следующем слиянии --no-ff.Если
topical_xFeature
цельgit merge --squash
- избавиться от него, то это правильный вариант, как подробно описано в Брайане Кэмпбелле «S ответ .)источник
--squash
не--no-ff
то, что вам нужно.--no-ff
создаст коммит слияния, но также оставит все коммиты изtopical_xFeature
.topical_feature
ветвь и просто записать одну фиксацию вmaster
ветке.Переключитесь на главную ветку и убедитесь, что у вас установлена последняя версия.
git fetch
это может быть необходимо (в зависимости от вашей конфигурации git) для получения обновлений на origin / masterОбъедините функциональную ветку с основной веткой.
Сбросьте главную ветвь в исходное состояние.
Теперь Git рассматривает все изменения как неустановленные. Мы можем добавить эти изменения как одну фиксацию. Добавление. также добавит неотслеживаемые файлы.
Ссылка: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
источник
Сначала выберите, после какого коммита вы хотите, чтобы все произошло.
Сбросить на выбранную вами голову (я выбрал
HEAD@{2}
)git status
(просто чтобы убедиться)Добавьте новую фиксацию
Примечание:
HEAD@{0}
&HEAD@{1}
теперь объединены в 1 коммит, это также можно сделать для нескольких коммитов.git reflog
снова должен отображаться:источник
Инструмент для автоматизации нескольких коммитов в один
как говорит Кондал Колипака . Использование "git rebase -i"
Логика "git rebase"
При использовании «git rebase -i» git создает файл git-rebase-todo в текущем каталоге .git / rebase-merge, а затем вызывает редактор git, чтобы пользователи могли редактировать файл git-rebase-todo для обработки. Итак, инструмент должен соответствовать:
Измените редактор git по умолчанию
Итак, инструменту нужно изменить редактор git и обработать файл git-rebase-todo. Инструмент с использованием Python ниже:
Ссылка: https://liwugang.github.io/2019/12/30/git_commit_en.html
источник