Почему я не могу сделать sh мой код в репозитории GitHub после настройки моего пульта? - PullRequest
0 голосов
/ 20 марта 2020

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

1) Я установил репозиторий init в папку своего проекта:

git init

2) Я настроил ссылка на мой репозиторий GitHub:

git remote add origin https://github.com/AndreaNobili/SpringBoot-Excel-API.git

И, извлекая справочную информацию, я получаю это:

developer@developer-virtual-machine:~/git/SOC-dashboard$ git remote -v
origin  https://github.com/AndreaNobili/SpringBoot-Excel-API.git (fetch)
origin  https://github.com/AndreaNobili/SpringBoot-Excel-API.git (push)

, так что, похоже, все в порядке.

3) Сначала я попытался набрать sh код моего проекта:

developer@developer-virtual-machine:~/git/SOC-dashboard$ git push origin master
Username for 'https://github.com': nobili.andrea@gmail.com
Password for 'https://my.mail@gmail.com@github.com': 
To https://github.com/AndreaNobili/SpringBoot-Excel-API.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/AndreaNobili/SpringBoot-Excel-API.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.

Я ввел свои учетные данные, но получаю предыдущее сообщение об ошибке. Что именно означает?

4) Моя идея заключается в том, что я должен выполнить извлечение удаленного репозитория до того, как pu sh мой код (в репозиторий GitHub Я вижу, что есть .gitignore file.

Итак, я попытался сделать:

developer@developer-virtual-machine:~/git/SOC-dashboard$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> master

Я также попробовал это:

developer@developer-virtual-machine:~/git/SOC-dashboard$ git pull origin master
Da https://github.com/AndreaNobili/SpringBoot-Excel-API
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories

Так что же не так? Чего мне не хватает? Как я могу попытаться исправить и исправить pu sh мой код?

1 Ответ

2 голосов
/ 20 марта 2020

tl; dr Когда вы делали репо на Github, он уже имел коммит для добавления .gitignore. git init + git remote add не получил этот или какие-либо коммиты, у вас был пустой локальный репозиторий. Ваши локальные коммиты не были построены поверх удаленных коммитов, у них не было общего предка, они были «не связаны». Git не будет объединять несвязанные ветви.

Чтобы исправить это, git fetch origin, чтобы убедиться, что у вас есть последний снимок пульта, и git rebase origin/master, чтобы переписать ваши локальные коммиты поверх главной ветви источника. Затем вы можете сделать команду sh.

. В будущем загрузите новый репозиторий, используя git clone.


$ git push origin master
Username for 'https://github.com': nobili.andrea@gmail.com
Password for 'https://my.mail@gmail.com@github.com': 
To https://github.com/AndreaNobili/SpringBoot-Excel-API.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/AndreaNobili/SpringBoot-Excel-API.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.

Вся информация есть, но она немного крипти c. Важный бит таков:

 ! [rejected]        master -> master (non-fast-forward)

«Быстрый переход» - это когда не требуется слияние для обновления ветви.

Например. Вы клонируете репозиторий с тремя коммитами, A, B и C. В этот момент вы получаете полную копию хранилища.

$ git clone <some repo>

origin
A - B - C [master]

local
A - B - C [master]
          [origin/master]

origin/master отслеживает последнее место, где вы видели главную ветку удаленного хранилища.

Вы добавляете несколько коммитов локально.

origin
A - B - C [master]

local
A - B - C [origin/master]
         \
          D - E [master]

Ты пу sh. Это pu sh может произойти, потому что Git нужно только сложить D и E поверх E. Это «быстрый переход».

$ git push origin master

origin
A - B - C - D - E [master]

local
A - B - C - D - E [master]
                  [origin/master]

Проблема возникает, когда ваши истории имеют разошлись . Это происходит, когда кто-то делает коммит в удаленном репозитории, так как вы внесли изменения.

Давайте go вернемся к клону fre sh.

$ git clone <some repo>

origin
A - B - C [master]

local
A - B - C [master]

Вы добавляете несколько коммитов локально.

origin
A - B - C [master]

local
A - B - C - D - E [master]

Кто-то подталкивает некоторые коммиты.

origin
A - B - C - F - G [master]

local
A - B - C [origin/master]
         \
          D - E [master]

Вы пытаетесь набрать sh и получите ! [rejected] master -> master (non-fast-forward). Ваши истории расходятся и должны быть объединены. git push не будет этого делать, вы должны git pull и иметь дело с любыми конфликтами.

$ git pull

origin
A - B - C - F - G [master]

local
A - B - C - F - G [origin/master]
         \       \
          D - E - M [master]

Теперь вы можете пу sh.

$ git pull

origin
A - B - C - F - G
         \       \
          D - E - M [master]

local
A - B - C - F - G [origin/master]
         \       \
          D - E - M [master]

Так кто сделал это расходящееся изменение? Ты сделал. Когда вы создали репозиторий на Github, он сделал начальную фиксацию для добавления файла .gitignore .

Если вы клонировали репозиторий, все будет в порядке, как описано выше. Но вместо этого вы инициализировали и добавили удаленный.

$ git init
$ git remote add origin https://github.com/AndreaNobili/SpringBoot-Excel-API.git

origin
A [master]

local

origin имеет коммит, а в вашем локальном репозитории его нет. Git не разговаривает с пультами без вашего явного уведомления. Вы должны были бы git pull на данный момент. Или вместо этого сделайте git clone.

Теперь вы добавили больше коммитов.

$ git init
$ git remote add origin https://github.com/AndreaNobili/SpringBoot-Excel-API.git

origin
A [master]

local
B - C [master]

Обратите внимание, что нет никакой связи между вашими коммитами по источнику и вашими локальными коммитами. Они не имеют ничего общего. Они "не связаны".

Ваша попытка набрать sh и получить ! [rejected] master -> master (non-fast-forward), потому что история разошлась.

Вы пытаетесь вытащить и получить fatal: refusing to merge unrelated histories, потому что ваши местные коммиты и коммиты по происхождению не связаны. Git не знает, как их объединить.


Чтобы это исправить, сначала извлеките последние изменения из источника.

$ git fetch origin

origin
A [master]

local
B - C [master]

A [origin/master]   # the unrelated commit fetched from origin

Затем rebase ваши изменения поверх их. rebase в основном копирует ваши изменения в несвязанный коммит.

$ git rebase origin/master

origin
A [master]

local
A [origin/master]
 \
  B1 - C1 [master]

И теперь вы можете сделать pu sh.

(Вы также можете выполнить выборку + перебазирование за один шаг: git pull --rebase origin master. git pull - это выборка + слияние, или с --rebase a rebase.)

В будущем загрузите новый репозиторий с git clone.

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