2016-08-16 8 views
0

На рабочем месте команда выполняет свою работу в своей собственной ветви функции, объединяет функции в развитии ветки и затем, наконец, делает вишневый выбор коммитов в производственную отрасль. Сервер обслуживает файлы из производственной ветки. Это означает, что в производственной отрасли все, что показано на общедоступном веб-сайте. Другими словами, вместо загрузки файлов через FTP команда cherry выбирает коммиты из своей ветки функций, содержащей новые файлы, в производственную ветвь, а затем делает git pull origin production на веб-сервере для обновления файлов.Создание новых коммитов из сбор и исключение файлов из существующих коммитов?

Я не знаком с таким рабочим процессом, потому что я обычно загружаю через FTP, и у меня есть все права на загрузку только необходимых файлов. Мне было интересно, в таком рабочем процессе можно воссоздать новые коммиты, содержащие выбранные файлы, на основе существующих коммитов?

В качестве примера, скажем, я сделал 2 фиксаций, как так (Commit A идет перед Commit B) в MyFeatureBranch:

Commit B: 
Removed 1 line from FileA. 
Added 2 lines to FileB. 
Deleted FileC 
Added 1 line to package.json 

Commit A: 
Added 2 lines to FileA. 
Removed 5 lines from FileB. 
Created package.json. 

Как я могу создать Commit C поверх Commit B, содержащего объединенные изменения в Commit A и Commit B файлов FileA и FileB, но исключает файл package.json (или даже больше файлов, чтобы исключить)?

Я не могу использовать gitignore, потому что мне все еще нужно нажать, чтобы обновить package.json до develop.

Мое намерение иметь Commit C, как это так, что я могу легко сделать git cherry-pick CommitC из MyFeatureBranch в production ветви, и все мои обновления (хотел и ненужные файлы) в настоящее время сдвинуты в производство. Я мог бы использовать вишню - выбираю коммиты один за другим, но package.json все равно будет скопирован в производственную ветку, потому что он находится внутри Commit A.

Итак, возможно ли создать новый коммит из выбранных файлов и исключить файлы из существующих коммитов?

ответ

1

Прежде всего: Использование cherry-pick в том, как вы описали его, похоже, не является хорошим рабочим процессом. Это сделает работу с git намного сложнее, чем требуется, так как существует несколько ветвей, содержащих в основном один и тот же код, но при этом отсутствует общая история. Возможно, было бы хорошей идеей пересмотреть этот рабочий процесс и решить проблемы, с которыми справляются вишневые подборки.

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


Это способ, которым я хотел бы рекомендовать вам произвести Фиксировать C, если вы действительно хотите, так как этот процесс довольно легко следовать, все еще сохраняя чистую историю файлов. Ниже вы можете найти подсказки для некоторых альтернатив, которые могут работать.

Оформить новую ветку от родительского коммита Commit A. Вы можете найти это commit либо с помощью git log, либо просто использовать A^(где A - хэш Commit A), который всегда будет ссылаться на родительское коммитирование A (предполагая, что A не является фиксацией слияния, которая также не будет работать с процессом cherry-pick).

git checkout -b cherry-pick-preparation A^ 

Препарат для вишни - это название новой ветки, используемой для приготовления вишневого салата. Вам нужно либо удалить это после того, как в следующий раз выберете cherry-picking commit или используйте другое имя. Также возможно сделать все это без создания новой ветки, однако я бы избегал этого, чтобы убедиться, что вы можете вернуться к своей работе, если вы делаете ошибки.

Теперь выберете все изменения из своей ветки, не совершая их. B может быть либо хэшем последней фиксации, либо просто именем вашей ветви.

git checkout B -- . 
git reset HEAD . 

Это позволит установить все файлы на то же содержание, как в B. Вы можете посмотреть на что, используя git status и git diff. Теперь вы можете отменить все, что вы не хотите использовать позже. Если вам нужно сбросить полные файлы, вы можете сделать git checkout -- file1 file2 file3 для сброса этих файлов. Когда вы закончите фиксацию изменений. Результирующая фиксация может быть выбрана вишней в другом месте.


Вы также можете посмотреть на интерактивном перебазировании, которая позволит вам изменить историю вашей отрасли, не создавая новую ветку. Возможно, вы захотите «отредактировать», чтобы изменить свои фиксации и удалить изменения, которые вы не хотите выбирать, и «сквош», чтобы объединить свои коммиты в один.


Можно также добавить Фиксировать C в верхней части А и В, которые просто Отменяет изменения, которые вы не хотите в производстве, а затем вишневого выбрать все три фиксаций. Полученные файлы будут такими же, как раньше, но в истории видны изменения в package.json. Скорее всего, это не очень хорошая идея, так как после этого очень сложно следить за историей файлов.

+0

Большое спасибо за эту идею! Похоже, это может сработать! Вы просто сказали, что я мог бы сделать git branch hashA ^, чтобы создать новую ветку из CommitA. Что означает эта каретка после хэша? – Carven

+0

Это относится к родительскому фиксации hashA (последняя фиксация перед hashA) – lucash

+0

@Carven Я только что узнал, что в моем ответе была ошибка. Пожалуйста, см. Мое редактирование для правильного способа проверки файлов из другой ветви. – lucash