Как я могу разделить предыдущий git коммит на отдельные коммиты? - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь отследить ошибку, которая была введена где-то в определенном коммите. К сожалению, этот коммит состоит из множества файлов, и я не уверен, где возникла проблема. Я хотел бы сделать что-то вроде "git bisect", но это помогло бы, если бы я мог разбить фиксацию задачи на кучу коммитов меньшего размера.

У меня нет проблем с созданием ветвь, возвращая проблемный коммит, затем повторно применяя его как серию коммитов, но я не знаю, как это сделать. Исследование этого вопроса здесь на Stack Overflow приводит к множеству ответов, связанных с переписыванием истории (например, this или this ), что я не хочу делать, потому что коммит находится под вопросом произошло в прошлом и было перенесено в центральное хранилище.

Как разделить один коммит, модифицируя несколько файлов в серию коммитов, по одному для каждого файла?

Редактировать: возможно, я недостаточно четко объяснил вопрос.

У меня есть хранилище с коммитами, которые выглядят так:

A --- B --- C --- D

Коммит B - это проблема. Была введена ошибка, которая была сужена до фиксации B. Но фиксация B состоит из большого количества изменений в большом количестве файлов, поэтому неясно, что именно послужило причиной ошибки.

Что бы я хотел сделать это:

A --- B --- C --- D --- revert B --- B1 --- B2  --- ... --- Bn

Где B1, B2, ... Bn - это коммиты отдельных файлов, которые были изменены в коммите B.

Если я можно сломать проблемный коммит c, затем я могу использовать git bisect, чтобы еще больше сузить проблему.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 19 февраля 2020

Поскольку вы уже знаете, какой коммит привел к ошибке и просто пытается использовать git, чтобы помочь вам лучше понять код:

1.) Создайте ветку на коммите, который вы хотите

например git branch investigation abcdef1 (где abcdef1 - га sh или проблемный c коммит)

ps: investigation - это просто имя I выбрал ветку ... Может быть что-то еще ...


2.) Go на новую ветку, которую вы только что создали

например, git checkout investigation


3.) Отменить проблематику c commit (влияет только на эту новую ветку, поэтому не повреждает исходную историю в вашей основной ветке)

Например, git reset HEAD~1

На этом этапе все добавленные / измененные / удаленные файлы вернутся в исходное состояние непосредственно перед выполнением фиксации. Вы можете сделать git status, чтобы увидеть все различия.

Отсюда вы можете начать создавать коммиты, когда вы будете sh, либо по одному файлу, либо группировать некоторые из них ... вам.


Конечно, это просто для вас, чтобы отследить, где ошибка ... Вы бы не слили эту ветку обратно в master или что-нибудь в этом роде ... Это просто одноразовая ветвь для изучения ошибки ... Как только вы узнаете, где находится ошибка, go вернитесь к master (или к какой-либо другой ветке), и исправьте ошибку там, а затем просто удалите investigation филиал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...