Есть проблемы с Git Push - PullRequest
       132

Есть проблемы с Git Push

1 голос
/ 04 мая 2020

Я разветвил репозиторий github, содержащий файл R и markdown, и скачал и распаковал на моем локальном компьютере. Я обновил файл R. Чтобы загрузить в тот же репозиторий GitHub, я успешно выполнил следующие функции

$ git add .
$ git commit -m "edited ....."
# git log shows the commits
$ git remote add origin "git@github.com:ABBuriro/ProgrammingAssignment2-master.git"

Однако всякий раз, когда пытаетесь использовать git pu sh origin master, выдается ошибка ![rejected] master -> master (non-fast-forward)

Помощь всегда ценится

1 Ответ

2 голосов
/ 04 мая 2020

Что произошло

Когда вы загрузили zip, он фактически не включал все метаданные из git, которые обычно хранятся в каталоге .git. Фактически, когда я загружаю zip-архив с github, распаковываю его и запускаю в нем git status, он говорит мне

$ git status
fatal: not a git repository (or any parent up to mount point /cygdrive)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

Я предполагаю, что вы запустили git init, чтобы «исправить» это.

В следующий раз

После разветвления вашего хранилища вы должны вместо этого git clone. Это скопирует всю историю git из онлайн-репозитория на ваш локальный компьютер

git clone https://github.com/ABBuriro/ProgrammingAssignment2-master.git" target-directory-the-repo-should-be-downloaded-to

Как исправить

Если вы спросите git, у вас есть две совершенно разные истории в Интернете и на вашей локальной машине. Онлайн с самого начала до некоторого коммита A, и на вашей машине есть ваши новые коммиты, которые основаны на данных коммита A, но на самом деле не имеют отношения к нему с точки зрения истории.

One Простым способом решения этой проблемы было бы клонировать репозиторий в новый каталог, скопировать туда все свои новые данные (кроме .git dir), выполнить коммит еще раз, а затем pu sh. Проблема в том, что вы теряете ваши новые сообщения о коммите, так как вместо этого все они будут одним большим коммитом.

git clone https://github.com/ABBuriro/ProgrammingAssignment2-master.git" somedir
# copy all data over, then
git add -A
git commit -am "fix my history"
git push

Я отредактирую это, когда найду лучший ответ. Дайте мне знать, если этого ответа вам уже достаточно, как есть.

A Better Fix?

Вы также можете попытаться сохранить обе истории коммитов без изменений. Для этого вам нужно находиться в репозитории git, который вы создали из zip (где вы внесли все свои изменения), и добавить источник. ты уже сделал это Вместо этого я использую https, потому что привык к этому, но не думаю, что это должно иметь значение.

# add the remote
git remote add origin https://github.com/ABBuriro/ProgrammingAssignment2-master.git
# fetch the data - this does not change your files, only your local view of the online repository
git fetch origin

Теперь у нас есть origin/master со всеми исходными коммитами и вашим локальным master со всеми вашими локальными изменениями. Мы хотим воспроизвести локальные изменения на origin/master.
. Для этого мы используем rebase. Это немного хитро относительно того, как указать, чтобы всегда отдавать предпочтение нашим изменениям, если возникает конфликт, но короткая версия должна использовать -Xtheirs (потому что git на самом деле "их" - то есть онлайн - ветвь, и это означает, что с ее точки зрения, локальная ветвь в то время «их», а не «наша».)

git rebase -Xtheirs origin/master

Теперь вы можете столкнуться с некоторыми сообщениями о конфликтах, подобных этим (я проверил это с одним из моих собственных репозиториев, поэтому у вас будут разные имена файлов):

Auto-merging README.md
CONFLICT (add/add): Merge conflict in LICENSE.md
Auto-merging LICENSE.md
CONFLICT (add/add): Merge conflict in .gitmodules
Auto-merging .gitmodules
CONFLICT (add/add): Merge conflict in .gitignore
Auto-merging .gitignore
error: could not apply 68398a8... zipped change 1
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".
Could not apply 68398a8... zipped change 1

Сами по себе конфликтные сообщения в порядке, но error в конце не очень хорошо. Обратите внимание, что «zip change 1» является сообщением коммита первого локального коммита.
Когда я запускаю git status, это показывает, что мой отличающийся файл был действительно правильно добавлен. Это другие файлы, которые как-то относятся к sh. Я действительно не знаю, почему они заявляют sh, но, поскольку я абсолютно уверен, что я не изменил их, и, следовательно, я могу сохранить свою локальную версию, я просто добавлю их все.

$ git status
interactive rebase in progress; onto 3d5e9b1
Last command done (1 command done):
   pick 68398a8 zipped change 1
Next command to do (1 remaining command):
   pick 87f6bc2 zipped change 2
  (use "git rebase --edit-todo" to view and edit)
You are currently rebasing branch 'master' on '3d5e9b1'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   query.py

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

        both added:      .gitignore
        both added:      .gitmodules
        both added:      LICENSE.md
        both added:      README.md
        both added:      config.yml
        both added:      querywrapper.py
        both added:      secret_config.template.yml
        both added:      shiroutine.py
        both added:      shiverbot.py

$ git add -A

И продолжайте перебазирование с помощью

git rebase --continue

Все остальные коммиты не должны создавать проблем, так как они воспроизводятся поверх этого.

Теперь вы можете запустить git log и увидеть все ваши сообщения о коммитах - сначала онлайн, а также локальные. Поскольку ваш местный мастер теперь опережает origin/master, в ускоренном режиме вы можете git push -u origin/master.

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