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
.