У меня есть следующие ветки:
master
production
и следующие удаленные ветки:
origin/master
origin/production
У меня есть сценарий, который извлекает origin/master
ветку и получает различие того, что изменилось из моей последней fetch ( log -p master..origin/master
). Потом сливаю origin/master
.
Найденные коммиты отправляются в инструмент проверки кода.
Я хочу отправить успешные коммиты - и только их - в производственную ветку, а затем, конечно же, в origin/production
.
Как я могу это сделать?
Кроме того, у меня запущено 2 сценария: один, который извлекает origin/master
, отправляет данные в базу данных и выполняет слияние, а другой, который я сейчас пишу, должен будет подтолкнуть успешные коммиты.
Я хотел бы, чтобы эти 2 сценария работали, избегая при этом состояния гонки / конфликта слияния. Поскольку я хочу работать только с указанными коммитами, может быть, есть способ избавиться от коммитов, которые мне не нужны?
Ответы:
Я думаю, вы ищете термин «вишенка». То есть возьмите одну фиксацию из середины одной ветки и добавьте ее в другую:
становится
Это, конечно, можно сделать с помощью команды git cherry-pick.
Проблема с этим коммитом в том, что git считает, что коммиты включают всю предшествующую им историю - таким образом, если у вас есть три таких коммита:
И попробуйте избавиться от B, вам нужно создать совершенно новый коммит, например:
Где C 'имеет другой идентификатор SHA-1. Точно так же Cherry выбор фиксации из одной ветки в другую в основном включает создание патча, а затем его применение, что также приводит к потере истории.
Это изменение идентификаторов коммитов, помимо прочего, нарушает функциональность слияния git (хотя при умеренном использовании есть эвристика, которая устранит это). Что еще более важно, он игнорирует функциональные зависимости - если C действительно использовал функцию, определенную в B, вы никогда не узнаете.
Возможно, лучший способ справиться с этим - иметь более мелкозернистые ветви. То есть, вместо того, чтобы просто иметь 'master', иметь 'featureA', 'bugfixB' и т. Д. Выполняйте проверку кода для всей ветки за раз - где каждая ветка очень сосредоточена на выполнении только одной задачи - а затем объедините это одна ветка, когда вы закончите. Это рабочий процесс, для которого предназначен git, и в чем он хорош :)
Если вы настаиваете на работе с вещами на уровне патчей, вы можете посмотреть на darcs - он рассматривает репозиторий как набор патчей, и, таким образом, выбор вишни становится фундаментальной операцией. Однако у этого есть свои проблемы, например, очень медленно :)
Изменить: Кроме того, я не уверен, что понимаю ваш второй вопрос о двух скриптах. Может быть, вы могли бы описать это более подробно, возможно, как отдельный вопрос, чтобы не запутаться?
источник
Я понимаю, что это старый вопрос, но он упоминается здесь: Как слить конкретный коммит в Git
Следовательно, новый ответ: используйте ветки функций и запросы на вытягивание.
Как это выглядит, где fA - это фиксация с функцией A, а fB - это фиксация с функцией B:
Запросы на вытягивание связаны с функциональностью GitHub, но на самом деле я имею в виду только то, что кто-то несет ответственность за объединение веток функций в master.
источник