не может git push из-за несвязанных изменений в исходном файле - PullRequest
0 голосов
/ 18 октября 2018

У нас есть центральное репо, над которым работают более 10 разработчиков.

Я помогаю своему приятелю (он ООО) объединить его PR в master.Из-за другого пиара, который был слит первым, возник конфликт с его пиаром.Все, что мне нужно было сделать, это проверить его ветку, перебазировать ее на текущий master, разрешить все конфликты, зафиксировать git push в его удаленной ветви функций и обновить PR, объединить его.

Просто, что сводит меня с ума: всякий раз, когда я разрешаю все конфликты, нажимаю git rebase --continue, а затем я делаю git push, это выдает мне эту ошибку:

On branch this_is_cool_branch
Your branch and 'origin/this_is_cool_branch' have diverged,
and have 2698 and 2 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean

Следуя его инструкциям, я делаю git pull, затем он вносит целую кучу изменений, которые вообще не были связаны с моими изменениями / конфликтами, это на самом деле изменения других команд.Затем он просит меня:

Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

Я абсолютно не знаю, почему это происходит, пожалуйста, помогите.

Вот мои шаги:

  1. git clone master_branch
  2. git checkout this_is_cool_branch (this_is_cool_branch - это ветка моего собеседника на удаленном компьютере)
  3. git rebase master
  4. вручную разрешены все конфликты
  5. git rebase --continue
  6. git status (досадно, это выдает мне ошибку ниже)

    В ветви this_is_cool_branch Ваша ветвь и 'origin / this_is_cool_branch' разошлись, и каждый имеет 2698 и 2 разных коммита соответственно,(используйте «git pull», чтобы объединить удаленную ветку с вашей)

    нечего коммитить, рабочее дерево чистое

  7. git pull, случается вышеупомянутый кошмар.Тонны несвязанных изменений втянулись и попросили меня исправить конфликты слияний.

Какой шаг я пропустил?Какую команду git я использовал неправильно?

1 Ответ

0 голосов
/ 18 октября 2018

Это один из немногих случаев, когда совет по умолчанию для git противоположен тому, что вы делаете.Как и все остальное в git, вы хотите, чтобы ваш граф истории выглядел в конце операции.

Короче говоря, вам нужно сделать git push --force в конце перебазирования вместо git pull.

И вот почему:

                 master
                    |
                    v
A -- B -- C -- D -- E
      \
       F -- G -- H
                 ^
                 |
    coolbranch, origin/coolbranch

Перед ребазингом ваша история выглядит следующим образом.A-E является мастером, который отклонился от вашей ветви, начиная с B из-за конфликтующего запроса на удаление.Вот что происходит после перебазирования:

                 master
                    |
                    v
A -- B -- C -- D -- E -- F' -- G' -- H'
      \                              ^
       F -- G -- H                   |
                 ^              coolbranch
                 |
        origin/coolbranch

Как видите, добавление локального coolbranch непосредственно к версии на сервере больше не имеет особого смысла.Вместо этого вы хотите сказать серверу, что он принимает принятые вами изменения F'-H' и переместить метку ветки coolbranch на H'.Это именно то, что делает push --force (или -f для краткости).

Если вы попытаетесь сделать git pull после перебазирования, но до git push -f, вы попытаетесь объединить H вH', который в основном отменяет все ваши изменения в базе.

Итак, окончательная процедура должна выглядеть примерно так:

  1. git checkout master
  2. git pull Теперьу вас есть недавно слитый PR
  3. git checkout coolbranch
  4. git pull coolbranch или все, что вы используете для синхронизации вашего местного coolbranch с работой вашего собеседника.
  5. git rebase master
  6. Исправить конфликты и продолжать до тех пор, пока не будет сделано.
  7. Необязательно git status.Вывод, который вы показываете, правильный и ожидаемый, он дает вам количество коммитов между B и H в origin/coolbranch и B и H' в недавно перебазированном coolbranch.Если числа выглядят разумными в этом контексте (например, они различаются по количеству коммитов в конфликтующем PR), то ваш ребаз был, вероятно, хорошим.
  8. git push -f

Послечто вы должны быть готовы подать бесконфликтный пул-запрос.Каждый раз, когда master меняется из-под вас, просто повторите эти шаги.

...