обновления git отклонили ошибку на совершенно новом клоне - PullRequest
0 голосов
/ 23 мая 2018

Я клонировал совершенно новое хранилище с нашего сервера.Затем я вытащил новую ветку от происхождения.Я сделал несколько изменений и зафиксировал, но когда я пытаюсь нажать, я получаю сообщение об ошибке «обновления были отклонены, потому что кончик вашей текущей ветви позади».Но это не так - это совершенно новый клон, и за это время другие разработчики не делали никаких коммитов.Я попытался сделать git pull --rebase как предложено здесь , но он просто говорит мне, что моя ветвь уже обновлена.

Как я могу решить эту проблему?

estrom@T460-ESTROM MINGW64 /c/gitRepo/qo6 (master)
$ git fetch origin

estrom@T460-ESTROM MINGW64 /c/gitRepo/qo6 (master)
$ git checkout -b estrom/PH-19312 origin/release-18.9.0
Branch estrom/PH-19312 set up to track remote branch release-18.9.0 from origin.
Switched to a new branch 'estrom/PH-19312'

estrom@T460-ESTROM MINGW64 /c/gitRepo/qo6 (estrom/PH-19312)
$ gitk

estrom@T460-ESTROM MINGW64 /c/gitRepo/qo6 (estrom/PH-19312)
$ git commit -am "PH-19312 hide calories for literacy item in order history"
[estrom/PH-19312 5ace4de] PH-19312 hide calories for literacy item in order history
 1 file changed, 2 insertions(+)

estrom@T460-ESTROM MINGW64 /c/gitRepo/qo6 (estrom/PH-19312)
$ git push
To ssh://stash.mycompany.com:7999/phi/qo6.git
 ! [rejected]        estrom/PH-19312 -> estrom/PH-19312 (non-fast-forward)
error: failed to push some refs to 'ssh://git@stash.mycompany.com:7999/phi/qo6.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

estrom@T460-ESTROM MINGW64 /c/gitRepo/qo6 (estrom/PH-19312)
$ git pull --rebase
Current branch estrom/PH-19312 is up to date.

estrom@T460-ESTROM MINGW64 /c/gitRepo/qo6 (estrom/PH-19312)
$ git pull --ff-only
remote: Counting objects: 28, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 16 (delta 11), reused 0 (delta 0)
Unpacking objects: 100% (16/16), done.
From ssh://stash.mycompany.com:7999/phi/qo6
   34e51c0..6a7696a  PH-18381-18.10         -> origin/PH-18381-18.10
   fa0520a..6665db3  develop                -> origin/develop
 * [new branch]      PH-19548               -> origin/PH-19548
Already up-to-date.

estrom@T460-ESTROM MINGW64 /c/gitRepo/qo6 (estrom/PH-19312)
$ git push
To ssh://stash.mycompany.com:7999/phi/qo6.git
 ! [rejected]        estrom/PH-19312 -> estrom/PH-19312 (non-fast-forward)
error: failed to push some refs to 'ssh://git@stash.mycompany.com:7999/phi/qo6.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

estrom@T460-ESTROM MINGW64 /c/gitRepo/qo6 (estrom/PH-19312)
$

ETA: результат `git branch -v -v --list estrom / PH-19312

estrom@T460-ESTROM MINGW64 /c/gitRepo/qo6 (estrom/PH-19312)
$ git branch -v -v --list estrom/PH-19312
* estrom/PH-19312 5ace4de [origin/release-18.9.0: ahead 1] PH-19312 hide calories for literacy item in order history

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вывод git branch -v -v --list estrom/PH-19312 показывает правду: локальная ветвь estrom/PH-19312 отслеживает удаленную ветвь release-18.9.0 с origin, которая, действительно, на один коммит впереди локальной ветки.Вот почему git push отказывается работать.

С другой стороны, вы, вероятно, не хотите переходить к release-18.9.0, а к удаленной ветви с именем estrom/PH-19312.Затем вы делаете запрос на извлечение, он проверяется и, если он утвержден, он объединяется в release-18.9.0.

Решение проблемы простое: добавьте --set-upstream в командную строку git push, чтобы сообщитьGit, чтобы использовать ветку с тем же именем в удаленном хранилище:

git push --set-upstream origin estrom/PH-19314

Проблема началась, когда вы создали локальную ветку из удаленной ветки с другим именем.Чтобы избежать этой проблемы в будущем, добавьте --no-track в командную строку при создании ветвей, используя git checkout или git branch:

git checkout -b --no-track estrom/PH-19312 origin/release-18.9.0
0 голосов
/ 23 мая 2018

TL; DR

Возможно, вы захотите изменить настройку upstream вашей ветви и перебазировать:

git branch --set-upstream-to origin/PH-19312
git rebase

Обратите внимание, что если ваш Git очень древний,у вас не будет --set-upstream-to.Вы можете использовать git branch --set-upstream, но вы должны быть более многословным и использовать то, что выглядит как неправильный порядок аргументов (вот почему современный Git имеет --set-upstream-to вместо --set-upstream):

git branch --set-upstream estrom/PH-19312 origin/estrom/PH-19312

Long

Здесь возникают две проблемы, связанные с исходной командой git checkout.

Настройка

Давайте сначала посмотрим на эту команду:

$ git checkout -b estrom/PH-19312 origin/release-18.9.0
Branch estrom/PH-19312 set up to track remote branch release-18.9.0 from origin.
Switched to a new branch 'estrom/PH-19312'

Флаг -b указывает git checkout создать новую ветвь.Следующее слово, estrom/PH-19312, предоставляет имя для новой ветви.Последующее слово origin/release-18.9.0 указывает, какой коммит проверяется, и делает еще одну вещь при использовании с -b: оно сообщает Git, что по умолчанию имя новой ветви должно иметь this имя установлено как upstream .

Пришло время сделать небольшую паузу и обсудить, что мы подразумеваем здесь под "ветвью" (см. Также Что именно мы подразумеваем под "ветвью"«).В этом случае фраза branch estrom/PH-19312 означает имя estrom/PH-19312 в refs/heads пространстве имен ссылок , а "восходящий поток" - записьв .git/config относительно имени estrom/PH-19312. Само имя ветви просто действует как указатель на какой-то существующий коммит, где-то на графике «всех когда-либо сделанных коммитов», который находится в вашем собственном репозитории Git.Перечислять все коммиты могут только те, у кого на самом деле есть клон репозитория, но, просто сделав некоторые предположения из вышеприведенного вывода, я нарисую это так, что, вероятно, немного не так, но по крайней мере что-то правильно :-):

             o--o--o   <-- origin/develop
            /
...--o--o--o--o   <-- master (HEAD), origin/master
         \     \
          \     E   <-- origin/estrom/PH-19312
           \
            o--*   <-- origin/release-18.9.0

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

Затем вы просите Git (через git checkout -b ...):

  • Найдите коммит, на который origin/release-18.9.0 указывает: я пометил этот коммит * здесь.
  • Извлеките коммит в index (также известный как staging area *).1070 * и кеш; см. Другие публикации StackOverflow или документацию Git) и рабочее дерево .
  • Создайте новую метку estrom/PH-19312, указывающую на этоcommit.

В результате сам график остается неизменным, но есть новая метка ветви, и теперь ваш HEAD присоединен к этой новой метке ветви:

             o--o--o   <-- origin/develop
            /
...--o--o--o--o   <-- master, origin/master
         \     \
          \     E   <-- origin/estrom/PH-19312
           \
            o--*   <-- estrom/PH-19312 (HEAD), origin/release-18.9.0

На этом этапе вы выполняете некоторую работу, успешно

Вы изменили некоторые файлы, git add отредактировали их в индексе и git commit ed:

$ git commit -am "PH-19312 hide calories for literacy item in order history"
[estrom/PH-19312 5ace4de] PH-19312 hide calories for literacy item in order history
 1 file changed, 2 insertions(+)

Это создало новый коммит в графе коммитов, поэтому давайте обновим чертеж (я собираюсь отбросить верхнюю строку полностью since Я не использую его):

...--o--o--o--o   <-- master, origin/master
         \     \
          \     E   <-- origin/estrom/PH-19312
           \
            o--*   <-- origin/release-18.9.0
                \
                 N   <-- estrom/PH-19312 (HEAD)

Обратите внимание, что родитель нового коммита N является существующим коммитом *.Это, вероятно, неправильно: вы начали с release-18.9.0, как видно на origin (который ваш Git запоминает как origin/release-18.9.0), а не с estrom/PH-19312, как видно на origin.

Первыйнеудачная команда Git

В этот момент вы запустили:

$ git push
To ssh://stash.mycompany.com:7999/phi/qo6.git
 ! [rejected]        estrom/PH-19312 -> estrom/PH-19312 (non-fast-forward)

По умолчанию git push пытается нажать, основываясь на настройке push.default.В этом случае все, что вы установили, заставило ваш Git нажать estrom/PH-19312.Однако ваша настройка push не является ни simple, ни upstream.Это может быть matching (особенно если ваш Git довольно древний, например, Git с 1.7 до 1.9 вместо 2.0+).Так что ваш Git подумал, что ему следует попросить другого Git на ssh://stash.mycompany.com:7999/phi/qo6.git, чтобы этот другой Git установил его estrom/PH-19312, чтобы он указывал на коммит N.

Но их estrom/PH-19312 очков совершают E.Если они установят их estrom/PH-19312 для указания на N, они потеряют совершить E.Поэтому они говорят: Нет, я не буду этого делать: отклонено: без ускоренной перемотки вперед. Вот что означает без ускоренной перемотки вперед : ярлык, который у них теперь есть, указывает на какой-то коммити вы предлагаете, чтобы они удалили некоторые коммиты из своей ветви, при этом устанавливая в своей ветке указатель на ваш новый коммит N.

Обратите внимание, что если вы использовали simple поскольку ваш push.default, ваш Git откажется делать push, потому что вышестоящее имя - release-18.9.0 (ваш origin/release-18.9.0).Если бы вы использовали upstream в качестве настройки push.default, ваш Git попросил бы их Git установить их release-18.9.0 - это возможно, но я думаю, маловероятно, что это именно то, что вы хотите.

Rebase делаетничего из-за настройки восходящего потока

Когда вы используете git rebase или git pull --rebase, ваш Git пытается скопировать ваш коммит N поверх вашего origin/release-18.9.0.Как видно из графика, ваш коммит N уже находится над коммитом, на который указывает origin/release-18.9.0, поэтому rebase ничего не делает.

Если вы измените настройку восходящего потока для ветки estrom/PH-19312 на origin/estrom/PH-19312, git rebase скопирует N в новый коммит N', который находится на вершине origin/estrom/PH-19312:

...--o--o--o--o   <-- master, origin/master
         \     \
          \     E   <-- origin/estrom/PH-19312
           \     \
            \     N'  <-- estrom/PH-19312 (HEAD)
             \
              o--*   <-- origin/release-18.9.0
                  \
                   N   [abandoned]

Этот коммит теперь подходит для отправки другому Git для it чтобы добавить его его до estrom/PH-19312.Я подозреваю, что это то, что вы хотите.

0 голосов
/ 23 мая 2018

Сначала попробуйте git pull --ff-only

Затем нажмите ваши изменения

Это приведет к быстрой перемотке вперед вашей локальной копии ветви, чтобы она стала такой же, как и у удаленного.

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