Как исправить проблемы с обзором в Gerrit, когда есть второй более новый обзор

Все еще пытаюсь научиться использовать Gerrit и его процесс. Шаги, которые я сделал, где

  1. Нажмите сначала change1, чтобы просмотреть gerrit в HEAD:refs/for/develop.
  2. Работайте над чем-то еще в той же ветке и нажмите change2 на gerrit для просмотра в HEAD:refs/for/develop

Оба коммита имеют gerrit строки Change-ID

Итак, теперь я хочу решить проблему для change1, что я и сделал.

git checkout -b change1 <change 1's commit id>

Сделал свои изменения и зафиксировал (добавив Change-ID в сообщение фиксации)

git add .
git commit

Теперь, когда я делаю

git push origin HEAD:refs/for/develop

я получил

 ! [remote rejected] HEAD -> refs/for/develop (squash commits first)
error: failed to push some refs to 'ssh://[email protected]:29418/CommunicationsLibrary'

Как исправить проблемы в сложенных отзывах и опубликовать их в gerrit, не создавая еще один отзыв?


person Adrian Cornish    schedule 19.09.2012    source источник
comment
Есть ли у второго изменения, которое вы добавили в Gerrit, первое изменение, которое вы добавили в качестве зависимости?   -  person xshoppyx    schedule 19.09.2012
comment
Да, у него есть первое изменение в качестве зависимости   -  person Adrian Cornish    schedule 19.09.2012
comment
У меня не было времени попробовать это сегодня - спасибо за ответы, попробую завтра - не забыл об этом :-)   -  person Adrian Cornish    schedule 20.09.2012


Ответы (6)


Когда у вас есть зависимые рецензии в Gerrit (то есть одно рецензируемое изменение, которое зависит от более раннего изменения, которое одновременно находится на рецензировании), и вам нужно внести изменения в более раннее изменение, вам фактически необходимо повторно отправить оба изменения (поскольку второе изменение становится зависимым от другого «родительского» коммита)

Итак, ситуация такова, что у вас есть два коммита в одной ветке от основной ветки разработки, например:

o master
\
 o Commit A (in review, requires change)
 o Commit B (in review, no changes required)

Что я обычно делаю в этой ситуации, так это вношу изменения, запрошенные коммитом А, в третий коммит. Наш график коммитов теперь выглядит так:

o master
\
 o Commit A (in review, requires change)
 o Commit B (in review, no changes required)
 o Commit C (modifications to Commit A)

Теперь я делаю git rebase -i master и переупорядочиваю фиксацию C так, чтобы она шла после фиксации A, но перед фиксацией B, а затем сжимаю ее в фиксацию A. График фиксации теперь выглядит так:

o master
\ 
 o Commit A' (Commit A, incorporating the changes from Commit C)
 o Commit B' (the same changes made in Commit B, but applied to Commit A' instead of A)

Наконец, git review (или любая другая команда, которую вы используете для отправки изменений в gerrit), чтобы повторно отправить оба коммита в Gerrit.

Именно из-за подобных сложностей большинство людей настоятельно рекомендуют работать над каждым отдельным изменением в отдельной ветке, а затем объединять в один коммит перед отправкой в ​​Gerrit, вместо того, чтобы иметь дело с такими ситуациями, когда у вас есть проверяемые зависимые изменения. в то же время.

person Trevor Powell    schedule 19.09.2012
comment
Обновление, год спустя: вместо процедуры, описанной выше, я теперь просто делаю один git rebase -i master и устанавливаю команду для фиксации A как редактированную (оставляю команду для фиксации B выбранной). Это оставит вас в режиме перебазирования с фиксацией A в вашей рабочей копии. Затем вы можете изменить коммит A, используя git commit --amend. Как только вы закончите изменять коммит A, вы можете затем git rebase --continue, и он повторно применит коммит B, и все готово. - person Trevor Powell; 09.12.2013
comment
Что вы делаете перед git rebase -i master? Я спрашиваю об этом, потому что думаю, что нужно загрузить (например, git review -d ‹number›) новейший зависимый набор исправлений, но не тот, который вы хотите отредактировать, верно? В противном случае вы получите только Commit A, а не Commit A и B в rebase. - person Fl0R1D3R; 07.01.2016
comment
@KyuuSung В ответе на вопрос указано, что Commit A и Commit B уже существуют на локальном компьютере и находятся в одной ветке. Никаких других команд в этой ситуации не требуется. Если вы не в такой ситуации, вы можете получить фиксацию B с сервера gerrit обычным способом (страница запроса на проверку содержит необходимую команду для этого для вашего сервера). Сделав это и проверив коммит B, вы окажетесь в состоянии, когда сможете следовать этим инструкциям. - person Trevor Powell; 08.01.2016
comment
@KyuuSung Обратите внимание, что этот ответ довольно старый, и я не использовал Геррита несколько лет. Приведенный выше комментарий основан только на моих нынешних воспоминаниях о том, как это работало много лет назад. - person Trevor Powell; 08.01.2016

Я думаю, что ваша проблема связана с тем, что поправка к 1-му коммиту теперь имеет второй коммит как зависимость. Это то, что я бы сделал лично, но может быть лучший способ. Я смотрю на это, поскольку вы хотите изменить базу так, как ваши коммиты, и вы имеете дело с последними 3. Итак, запустите «git rebase -i HEAD~3». Это позволяет вам изменить базу последних 3 коммитов, изменив порядок или объединив их друг с другом. Вы должны знать, что он перечисляет коммиты в порядке старейших. Вот пример:

Лог git выглядит следующим образом:

информация о коммите: ......

сообщение: foo2

информация о коммите: ......

сообщение: бар1

информация о коммите: ......

сообщение: foo1

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

выбрать foo1.

выбрать бар1.

выбрать foo2.

(Предполагается, что ваше второе изменение foo не изменило ни один из файлов, которые изменил bar1, поскольку это может не сработать, и если вы это сделали, вы все равно должны были изменить фиксацию.) Затем измените список на это:

выбрать foo1

исправить foo2

выбор бар1

После этого у вас будут foo1 и foo2, объединенные в один коммит, а bar1 будет следующим коммитом. Затем я запускал «git reset --soft HEAD~1», сбрасывающий самую новую фиксацию, а затем «git commit --amend», который позволяет вам изменить сообщение коммита для первого обзора и обязательно включить идентификатор изменения. . Тогда попробуйте свой толчок. После этого у вас должен быть установлен новый патч, и все файлы, которые были изменены вторым изменением, будут изменены и останутся в вашем рабочем каталоге.

person xshoppyx    schedule 19.09.2012
comment
Спасибо за ваш ответ - я принял ответ Тревора, потому что он был первым - person Adrian Cornish; 21.09.2012
comment
Не беспокойтесь, мне все равно, принят мой ответ или нет. Я просто рад, что это помогло вам :) - person xshoppyx; 21.09.2012

вызов

commit --ammend

вместо вашего второго изменения

person Haoyi Mike    schedule 15.03.2016

Ситуация точно такая, как объяснил @Trevor. rebase -i это хороший способ сделать, когда у вас есть это условие.

Лично я тоже использую эту команду, но немного по-другому:

<сильный>1. Используйте --fixup и --autosquash

у вас есть два коммита:

old commit
new commit

когда вы хотите изменить старый коммит, тогда

 git commit --fixup <old_commit_id>

затем перебазируйте с помощью автосквоша,

git rebase -i --autosquash <commit_id_before_old_commit>

Если мои комментарии неясны, вы можете проверить подробности в: https://fle.github.io/git-tip-keep-your-branch-clean-with-fixup-and-autosquash.html

OR

<сильный>2. Воспользуйтесь преимуществами Геррита

После того, как вы зафиксируете два изменения, у вас будет два изменения open-review в вашем графическом интерфейсе.

Затем перейдите к своему «старому изменению», выберите загрузить -> проверить это изменение, на самом деле после проверки вы перейдете в ветку для этого изменения, затем исправьте свой код, исправьте, перебазируйте, нажмите. .. как то, что вы делаете, как обычно.

person WUJ    schedule 23.01.2020

просто git commit --amend затем git review

person CheStar    schedule 05.01.2018
comment
как мне найти фиксацию --amend to, когда в обзоре git у меня есть список из нескольких коммитов? - person Noa Yehezkel; 08.05.2018

Я пытался с этими попытками

  1. сделал git rebase -i master
    это не сработало
  2. затем последнее, что я сделал, я сделал резервную копию файлов. Удалил весь проект. потом снова клонировал. Вставьте файлы в нужную папку из резервной копии, а затем снова зафиксируйте, а затем нажмите. Это сработало .
person Bhoopendra Dandotiya    schedule 19.05.2017