Что произошло
Когда вы загрузили 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
.