Как я могу использовать git rebase для преобразования моего рабочего дерева именно так, как я хочу? - PullRequest
0 голосов
/ 27 сентября 2011
* 080dc7a (HEAD, origin/master, origin/HEAD, master)
*   bfeee2f
|\  
| * 16e94ff (origin/McLongNumber, McLongNumber)
| *   f50319b
| |\  

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

*   bfeee2f (HEAD, origin/master, origin/HEAD, master)
|\  
| * 16e94ff (origin/McLongNumber, McLongNumber)
| *   f50319b
| |\  

Я уже пытался использовать --onto -p и -i безуспешно.Даже при использовании опции -p, когда мне удалось успешно раздавить последний коммит, линия дерева, которая показывала слияние McLongNumber с главной ветвью, была потеряна из журнала.Поэтому я думаю, что кто-то, кто более знаком с командой rebase, может помочь мне в этом.

1 Ответ

1 голос
/ 27 сентября 2011

Вы можете сделать это так:

# make 'master' point to it's parent commit,
# but don't modify the index or working directory
git reset --soft HEAD^

# rewrite the commit using the stuff in the index
git commit --amend

# publish the modified commit (see WARNING below)
git push -f

Обратите внимание, что SHA1 изменится; больше не будет bfeee2f.

ПРЕДУПРЕЖДЕНИЕ

Почти всегда ОЧЕНЬ ПЛОХАЯ идея переписать историю, которая уже была опубликована в общем хранилище. Большинство общих репозиториев настроены на отклонение изменений в истории, даже если используется параметр -f для git push. Таким образом, вы все равно не сможете делать то, что хотите.

Единственный раз, когда приемлемо переписать опубликованную историю:

  • Вы единственный, кто использует вышестоящий репозиторий, и вы знаете, как восстанавливаться после переписывания истории в других ваших клонах.
  • Другие пользователи общего хранилища знают, как восстанавливаться из переписанной истории, и вы предупредили их, что переписали историю, и позаботились о том, чтобы важные изменения не были сброшены при принудительном нажатии. , Несмотря на это, переписывание истории очень разрушительно для других; Это отличный способ серьезно раздражать ваших коллег / соавторов / участников.
...