2014-11-16 2 views
0

Рассмотрят следующий сценарий (Это не идеальное, но имеет место, тем не менее):Git - Как применить исправление MAINLINE с другими ожидающими изменениями

  1. последние совершить на моем местном отделении магистрального это совершить «c1»
  2. Этот коммит еще не готов к регистрации из-за ожидающих CR и т. Д.
  3. Между тем, из-за проблемы с высоким приоритетом, мне нужно сделать еще одно изменение на mainline. Однако я не могу проверять фиксацию «c1».

Что является рекомендуемой процедурой для этого?

Я думал, что должен создать новую ветвь, скажем, pre-c1-ветку от фиксации до c1 на главной линии. Затем выберите cherry-pick c1 и примените его к pre-c1-branch и git reset - hard HEAD на mainline, чтобы удалить фиксацию c1 из основной ветки. Затем я могу применить исправление ошибки к ветке mainline и проверить это. После того, как это зарегистрировано, я объединю этот c1 commit на mainline.

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

+0

Вы уже нажимали последнюю фиксацию до c1 на удаленную? –

+0

Да. Все локальные коммиты на магистрали, которые опережают удаленный HEAD, были сжаты в одну транзакцию c1. – user855

ответ

0

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

* --- * --- * --- * (origin/master) 
        \ 
        ---- * ---- c1 (master) 

Таким образом, вы совершили что-то новое в вашей локальной главной ветви с c1 быть последней фиксации. Теперь вы хотите добавить фиксацию к хозяину пульта. Самый простой способ будет просто проверить, что совершить, и совершить что-то там:

git checkout origin/master 
# work 
git commit 
git push origin HEAD:master 

При проверке удаленного филиала, Git будет, однако, предупредить вас, что вы находитесь на «отделенный РУКОВОДИТЕЛЬ» и совершаете вы делаете, будет исчезать если вы их не нажимаете. Таким образом, более чистое решение было бы просто создать ветку вместо:

git checkout -b master-fix origin/master 
# work 
git commit 
git push origin master-fix:master 

Это, по существу, то же самое, за исключением, что вы получаете отдельную ветвь master-fix которой вы будете работать.

Конечно, это также означает, что ваш местный мастер и ведущий пульта дистанционного управления все еще расходятся. Таким образом, было бы более желательно, чтобы master обращался к ведущему удаленному устройству и вместо этого помещал вашу функцию (c1) на отдельную ветку. Чтобы сделать это, вы можете создать новую ветку, которая будет содержать c1, а затем сбросить master на пульте дистанционного управления:

git branch my-feature # creates a new branch which is a copy of the current one (master) 
git reset --hard origin/master # reset the master branch to the remote’s state 
# work 
git commit 
git push origin master 

Это, вероятно, будет самым чистым решением. И если вы закончили с вашей функцией, вы можете просто объединить эту функцию в главную ветку с помощью git merge my-feature.

+0

У меня могут быть некоторые недоразумения, но я думал, что последний вариант не будет работать, потому что ветвь my-feature создается из локального мастера, и как только я сброшу локальную ветвь мастера, ветвь my-feature также потеряет это изменение, потому что все-таки , новая ветвь my-feature не имеет копии commit c1 .. Просто указатель на нее ... Нет? – user855

+0

Нет копий. Ветви всегда являются указателями на объекты. Поэтому, если вы создадите новую ветку 'my-feature', она будет указывать на то же самое' c1', что указывает 'master'. Поэтому впоследствии вы можете сделать «master» точкой для другого коммита (это то, что делает «git reset»), не затрагивая другие ветви. – poke

+0

Спасибо. Это сработало чудесно. – user855

0
  1. Stash ваша текущая работа, если вы не можете ее совершить сейчас. git stash
  2. git checkout HEAD^1 перейти к фиксации до c1.
  3. git checkout -b hotfix, чтобы внести свои важные изменения в другую ветку.
  4. Завершите свои изменения и разверните их для своего клиента или что-то еще.
  5. Теперь вы можете вернуться к предыдущей ветви, например. ведущий git checkout master.
  6. git merge hotfix, чтобы получить исправление в ветке dev и разрешить конфликты, если они есть.
  7. Последнее, что бы вытащить свой кошелек, который вы не зафиксировали в начале с git stash pop.

Надеюсь, что это поможет, и я ничего не пропустил из вашего описания.

0

Вы можете сохранить ваши текущие изменения. С командой

git stash save "message to identify the change" 

После этого вы можете перейти на другую ветку и совершить другое исправление. Чтобы вернуть сохраненные изменения можно использовать команду

git stash list 

Получить reflog синтаксис, например, копить @ {0}

затем применить его

как

git stash apply [email protected]{0} 

Надежда становится ясно.

+0

Коммит 'c1' уже существует, поэтому удержание здесь не является подходящим решением. – poke

+0

C1 commit уже существует. Вы предлагаете мне отключить c1, выполнив «git reset --mixed HEAD ~ 1», а затем сохраните эти изменения? – user855

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