2013-08-07 4 views
0

Я новичок в git, и я сделал boo boo. Я начал новую ветку (poly_attr), проверил ее, совершил некоторые коммиты. Пока я все еще был в этом отделении, я работал над несколькими другими вещами, которые должны были отправиться в другую ветку. Поэтому я совершил все, что должно быть в poly_attr, затем создал и проверил новую ветку (issue1), зафиксировал изменения и нажал обе ветви. Угадайте, что я забыл сделать? Перед созданием проблемы проверьте мастер. Итак, моя ветка issue1 отключилась от poly_attr. Хорошо, легко исправить, я думаю, проверить мастер и rebase issue1 для освоения. Нет, теперь у меня есть проблема 1 ветви poly_attr (удаленная) и одна из master (локальная). Как я могу удалить ветвь issue1 из poly_attr?git rebase и remote push

ответ

2

Перефразируя, вы начали с этим:

... - M5 - M6    <-- master, origin/master 

То есть, были некоторые серии фиксаций (который я пронумерованный, Mn). Вы сделали новое имя ветви poly_attr указывая на то передай как кончик master и сделал больше фиксаций, которые я маркировать Pn:

... - M5 - M6     <-- master, origin/master 
      \ 
       P0 - P1   <-- poly_attr 

Затем вы сделали новую ветвь issue1 начиная с конца poly_attr (не там, где вы намеревались начать), и сделал больше фиксаций:

... - M5 - M6     <-- master, origin/master 
      \ 
       P0 - P1   <-- poly_attr 
        \ 
         I0 - I1 <-- issue1 

Тогда вы сделали git push, что толкнул как poly_attr и issue1 к удаленному (второй лох).

Удаленный теперь совершает I0 и I1 (с той же ветви этикетки на пульте дистанционного управления, как у вас есть на вашем местном), и вы не можете удалить их оттуда, если вы не можете войти туда и делать такие вещи, в том числе git gc. Хуже того, при условии, что репо на origin является общим, Другие люди могут иметь их сейчас. Это, в свою очередь, означает, как вы это исправите, зависит от того, насколько вы уверены, что у вас нет никого другого, насколько они влияют на кого-либо, у кого есть , имейте это и/или как отчаянно вы должны иметь окончательную историю ветвей » просто".

Это легко, в собственном репо, чтобы запустить git rebase -i master issue1 и выбрать переносится только совершает I0 и I1 или даже git rebase --onto master poly_attr issue1 переносить I0 и I1 без необходимости редактирования интерактивного Rebase вещи. В любом случае, если ваш конечный результат:

... - M5 - M6     <-- master, origin/master 
      |\ 
      | P0 - P1   <-- poly_attr, origin/poly_attr 
      |  \ 
      |   I0 - I1 <-- origin/issue1 
      \ 
       I0' - I1'   <-- issue1 

Обратите внимание, что I цепи фиксаций являются еще там, а остальные этикетки у них есть «удаленный филиал» origin/issue1.

Если вы уверен никто не захватил issue1 с пульта дистанционного управления, и если у вас есть достаточное разрешение, вы можете git push -f origin issue1:issue1 после выполнения вашего перебазирования. Это пошлет над новыми коммитами I0' и I1' и сделайте пульт дистанционного управления его меткой issue1, чтобы указать на I1', на кончике вашего нового филиала issue1.Старые фиксации (I0 и I1) все равно будут вокруг некоторого времени, но никто не увидит их, они не будут находиться в пути, и в конце концов они будут собираться в качестве мусора:

... - M5 - M6     <-- master, origin/master 
      |\ 
      | P0 - P1   <-- poly_attr, origin/poly_attr 
      |  \ 
      |   I0 - I1  [invisible and eventually gc'd] 
      \ 
       I0' - I1'   <-- issue1, origin/issue1 

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

Если вы не уверен или не имеет разрешения или что-то еще, вам придется жить с чем-то беспощадным. Вместо того, чтобы делать новые коммиты (In'), вам просто нужно будет добавить к концу цепочки issue1, совершает то, что отменяет действие каждого обязательства Pn. Вы можете сделать это довольно просто, начиная с оригинальной (не нормированный) цепи:

... - M5 - M6     <-- master, origin/master 
      \ 
       P0 - P1   <-- poly_attr 
        \ 
         I0 - I1 <-- issue1 

Просто используйте git revert применить инверсию изменений, внесенных в серии P:

$ git checkout issue1 
$ git revert master..poly_attr 

Это дает вам новая цепь:

... - M5 - M6     <-- master, origin/master 
      \ 
       P0 - P1   <-- poly_attr 
        \ 
         I0 - I1 - RP1 - RP0 <-- issue1 

, где RP1 является обязательство, что возвращается (неудачи) P1 и RP0 - это фиксация, которая возвращает P0. Если вы добавили файл в P1, он будет удален в RP1. Если вы удалили строку кода в P0, она возвращается обратно в RP0. Это означает, что конечный результат, файлов вы получаете при регистрации RP0, выглядите так же, как если бы вы вносили изменения в I0 и I1 поверх фиксации M6. История, конечно, выглядит совсем по-другому, и это хорошая идея, чтобы объяснить (в реверсе), почему это произошло. Но конечный результат тот же, и вы добавляете только новые коммиты в конец цепи In, а это значит, что другие люди, у которых есть коммиты, могут немного поднять новый материал.

+0

Wow, torek! Это лучший и самый описательный ответ, который, я думаю, я видел. Огромное спасибо. Вы поняли это правильно. К счастью, я не беспокоюсь о том, чтобы кто-то еще спускал ветви, и это я, поэтому я просто пошел вперед и толкнул изменения без тщательного изучения. Думаю, теперь я его контролирую. Еще раз спасибо. – user2659205