2016-05-12 4 views
2

Так что это большой. Я создал ветвь смены ветвей, как указано ниже, и мне нужно объединить изменения с 1.3.6 и 1.4.1 в эту ветку. Теперь проблема в том, что я хочу выборочно объединить изменения. Я не хочу, чтобы все изменения с 1.3.6 в ветку изменений. как мне это сделать?Как слить, не теряя историю фиксации?

Это структура

master 
|- track1 
|- track2 
|---|- msr-657 
|---|---|--1.4.1 
|---|---|--change-branch 
|- track3 
|---|-- 1.3.6 
+1

Звучит как работа для 'cherry-pick'. – isherwood

+0

Спасибо @isherwood –

ответ

1

У вас есть четыре способа: с помощью команды merge с --no-commit флагом, используя revert после того, как merge, селективное rebase или используя cherry-pick.

Слияние с помощью --no-commit, вероятно, является лучшим для ведения истории вокруг, но это будет больше работы, так как вам придется вручную отменить изменения перед фиксацией.

Другой вариант - merge, затем выборочно revert изменяется с использованием git revert. Тем не менее, это сделает историю более беспощадной.

Если вы не заботитесь о том, чтобы история была «чистой», вы можете просто использовать rebase, но это работает безопасно, если вы еще не нажали свои изменения на общее репо (если вы работаете с другими) или вы делаете переустановку из ветви выброса. Вы бы сделать что-то вроде этого:

git rebase --interactive master 1.3.6 

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

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

В конце концов, это зависит от того, держите ли вы вокруг ветки 1.3.6 и как вы хотите, чтобы ваша история в конечном итоге выглядела.

2

git cherry-pick является самым простым. вы можете git cherry-pick любой фиксатор вы хотите в текущую HEAD. Вы также можете попробовать GIT вишнево-подборщик a..b в вишневый выбрать все коммиты из ребенка на Б.

мерзавца перебазироваться также достаточно мощный, чтобы сделать эту работу, но это немного сложнее и запутаннее ,

Смежные вопросы