2016-09-09 7 views
1

Какой-то один слитый нерабочий код в git, и после этого были парочки. У меня есть два варианта: 1. Чтобы отменить изменения один за другим, а затем, когда я достиг хорошего кода, остановитесь там. Вариант 2. Разделите чистую версию, используя контрольную шагу и сделайте ее голова. Я вижу вопрос posted here и еще несколько вопросов. Если я пытаюсь вариант один, после пары перезагрузок при попытке сбросить следующий я получаю:Как взять старую версию git-кода и сделать его последним

On branch master 
Your branch is ahead of 'origin/master' by 3 commits. 
    (use "git push" to publish your local commits) 
nothing to commit, working directory clean 

Затем я проверил версию я хочу, чтобы перейти к голове, и попытаться совершить это. Но я получаю это:

HEAD detached at 0c1b8c1 
nothing to commit, working directory clean 

Когда я пытаюсь вариант 2 получить правильную версию кода, но при попытке совершить, это ничего не говорит совершить. Каков наилучший способ взять старую версию кода и сделать его последним и самым большим в GIT? Это то, что я пытаюсь сделать: enter image description here

ответ

4

Отъезд последнего хорошего мастера в новую отрасль (так что если вы случайно нажать не в то время мы не уничтожить код):

git checkout <last good master hash> -b local_master_branch 

Теперь вы можете вишневого выбрать вещи, которые вы хотите на этой ветке:

git cherry-pick (HASH OF DESIRED COMMITS) 

Это работает очень хорошо, но может занять много времени, если есть много ветвей.

====================================

Что я предлагаю вместо это проверка на хорошие ветви

git checkout good_branch 

Rebase его на new_branch

git rebase local_master_branch 

, а затем объединить, что в местный мастер

git checkout local_master_branch 
git merge good_branch 

А затем промыть и повторить с помощью код.

===================================

Если ваших хорошей ветви донской «т на самом деле существует, и вы просто сломанный мастер для работы, проверить его

git checkout origin/master -b broken_master 

и сделать интерактивную перебазироваться на вершине хорошего мастера

git rebase -i local_master_branch 

Это позволит вам указать вещи, которые вы на самом деле хотите сохранить, и я на самом деле самый быстрый из трех методов.

++++++++++++++++++++++++++++++++++++++++++++++ ++++

THEN! ОПАСНОСТЬ! ЗДЕСЬ ДРАКОНЫ!

+++++++++++++++++++++++++++++++++++++++++++++ +++++

После завершения, вы должны сделать резервную копию текущего (пунктирным) мастером

git checkout origin/master -b broken_master 

Тогда проверки вашего чистый, полностью здание и не имеет никаких проблем отрасли со всеми неподвижной:

git checkout local_master_branch 

переименовать в филиале

git branch -m master 

затем принудительно-толчок, который освоить

git push origin master -f 

ОПАСНОСТЬ! Это DANGEROUS, если вы не знаете, что вы на самом деле делаете, потому что вы сбрасываете мастер по происхождению.

И для всех людей, которые похожи на «Эй, теперь мастер, над которым я работал, больше не существует», попросите их переделать нового хозяина.

+0

Я создал новую ветку с последним хорошим проверочным шагом. Теперь, когда я проверяю эту ветку, я получаю это сообщение: 'git checkout origin/clean_branch Примечание: проверка« origin/clean_branch ». Вы находитесь в состоянии «отдельно стоящего HEAD» ..... сделайте это (сейчас или позже), используя -b снова с командой проверки.Пример: мерзавец контроль -b <новый Гиса-имя> ========= Теперь, если я 'мерзавец перебазироваться local_master_branch фатальным: Необходим один пересмотр недействительным выше local_master_branch» –

+0

Когда вы получаете это сообщение, выполните 'git checkout -b new_branch_name'. Вы должны назвать ветку, прежде чем сможете с ней работать. –

+0

Я сделал ручное слияние, чтобы получить то, что мне нужно. Когда вы создаете ветку с помощью -b, она будет нажата как новая ветка. то, что я хотел, было толкать в начало/мастер или, другими словами, у меня есть начало ветки/clean_code, которое находится за исходным/ведущим и заставляет его происходить / –

0

Это зависит от того, хотите ли вы

  1. переписать историю, начиная с Clean Code (требует принудительного толчок, если уже толкнул) или
  2. историю на добавление только сводит на нет эффект от плохих фиксаций (нажать дружественных).

1) уже описан
2) выглядит как

1 git checkout <CleanCode hash> 
2 git symbolic-ref HEAD refs/heads/master 
3 git commit -m <commit message> 
4 git cherry-pick <good commit> 
  1. индивидуальный заказ, индекс синхронизируется с CleanCode совершают
  2. ГОЛОВЫ точки освоить сверху еще раз, индекс все еще удерживает состояние от CleanCode
    (1 & 2 может быть заменен get reset <CleanCode hash> и git reset --soft <master top hash>)
  3. сделать новый коммят эффективный индекс из CleanCode - эффект каждой фиксации после первоначального CleanCode обнуляется (плохой и хороший)
  4. применять хорошую дельту (восстановление эффекта хорошей фиксации)

В конце концов, что история будет выглядеть например

<cherry-picked delta> 
| 
<CleanCode state copy> 
| 
<delta to cherry-pick> 
| 
<bad commit> 
.. 
| 
<CleanCode> 
| 
..