Git, перебирающий интерактив, не сдавленный, когда быстрая перемотка вперед доступна - PullRequest
2 голосов
/ 20 мая 2011

У меня есть ветка от мастера с тремя изменениями, и я хочу перебазировать ее обратно к мастеру. Например:

$git checkout master
$git branch dev && git checkout dev
$<do 3 commits>
$git checkout master
$git rebase dev -i

Обычно я бы дал 3 коммита и позволил бы мне раздавить. В этом случае, однако, это просто «noop», и когда ребаз завершен, я вижу, что три коммита перенесены в master. Я думаю, что здесь, поскольку предок не расходился, возможен перемотка вперед, и вот что произошло. Но я хочу раздавить коммиты.

Я пытался использовать --no-ff, но он делает то же самое, что и в моем первоначальном случае (noop + no squashing).

Я тоже пытался делать (пока на ветке dev)

$git rebase -i HEAD~3
$git checkout master
$git rebase dev

Но на самом деле это боль, и я должен знать, сколько коммитов давит на часть HEAD ~ X.

Сноска: Причина, по которой это важно для меня, заключается в том, что именно этот сдавленный набор изменений будет рассмотрен в Gerrit. Если они раздельные, рецензирование невозможно.

1 Ответ

3 голосов
/ 20 мая 2011

Я не совсем уверен, почему вы делаете некоторые вещи в своем вопросе, например, разве вы не имеете в виду $git branch dev && git checkout dev, прежде чем совершать коммиты?В любом случае, вы просто создаете их на master.(Между прочим, если я прав, вы можете сделать git checkout -b dev в качестве ярлыка.)

Причина, по которой вы просто получаете noop, заключается в том, что git rebase пытается повторно применить все коммиты в текущем ветвь, которая не входит в ветку, указанную в качестве аргумента <upstream>.Таким образом, когда вы делаете git rebase -i dev в то время как на master, в master нет коммитов, которые не на dev.По сути, вы хотите сделать это наоборот.Я бы сделал следующее:

git checkout dev
git rebase -i master
[... change to 'squash' all but the first of the actions ...]

Тогда у вашей ветви разработки будет только один сдавленный коммит, и вы можете объединить его с мастером, если хотите.

В качестве альтернативы, вы можете использовать git merge --squash:

git checkout master
git merge --squash dev
git commit -m "The changes from dev squashed into one commit"

Тогда master будет иметь один новый коммит, который представляет собой результат слияния dev в мастер, сжатый в один коммит, и этот новый коммит будет иметь только одного родителя, а некоммит слияния.

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