Не могу добавить новый файл в удаленное репо, говорит, что мне нужно вытащить, но уже сделал

Для личного проекта, где я единственный, кто создает код, я иногда переключаюсь между двумя разными IDE. Таким образом, исходный код хранится локально в двух разных местах. Я хотел бы иметь историю/резервную копию кода на Bitbucket. Способен ли Git справиться с этим?

У меня есть foo.cpp в каталоге source_code. Я не хочу копировать все из удаленного репо в source_code. После добавления и фиксации foo.cpp я пытаюсь запустить git push origin master и выдает ошибку

 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://bitbucket.org/...'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Как он рекомендует, я делаю git pull origin master, но это ошибка с

error: Pulling is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.

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

Когда я делаю git status, это дает

You are currently rebasing branch 'master' on '930b2f7'.
  (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)

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
        both added:      foo2.cpp

Версия foo2.cpp для Bitbucket была правильной, поэтому я удалил локальную версию. Затем я запустил $ git restore --staged foo2.cpp, которая сработала. Теперь git pull origin master работает. Но все равно не могу толкнуть.

 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://bitbucket.org/...'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Опять же, все, что я пытаюсь сделать, это добавить файл в основную ветку удаленного репо. (Кроме того, является ли удаленное репо подходящим термином для обозначения конкретного проекта на хостинге, таком как Bitbucket?)

Также там написано (master|REBASE 2/3), что я понятия не имею, что это значит.


person northerner    schedule 02.08.2020    source источник
comment
Если вы все еще находитесь в середине операции перебазирования, запустите git rebase --continue, чтобы возобновить перебазирование.   -  person Greg Burghardt    schedule 02.08.2020
comment
Кроме того, черт возьми убедитесь, что вы не перемещаете ранее отправленные коммиты из мастера.   -  person Greg Burghardt    schedule 02.08.2020
comment
Что вы имеете в виду, когда переключаетесь между двумя IDE, хранящимися локально в двух разных местах? Означает ли это, что у вас есть две копии репозитория локально, по одной для каждой IDE?   -  person LightCC    schedule 02.08.2020
comment
Q: говорит, что мне нужно вытащить, но уже сделал... A: Это говорит именно о том, что это означает: ваш пульт не синхронизирован с вашим локальным репозиторием :( LightCC дал отличный ответ. Пожалуйста, не забудьте проголосовать и принять, если вы нашли его полезным. Что еще более важно: обязательно ПРОЧТИТЕ его. Пожалуйста, адаптируйте свой рабочий процесс git соответственно. Если у вас возникнут дополнительные вопросы, отправьте ответ.   -  person paulsm4    schedule 03.08.2020
comment
@LightCC Я имею в виду, что я использую тяжеловесную IDE для большей части кода, но иногда предпочитаю Notepad++ для небольших драйверов/экспериментов. Файлы, созданные в Notepad++, находятся в другом каталоге, чем файлы, созданные в среде IDE.   -  person northerner    schedule 03.08.2020
comment
Если это просто другая папка, это не должно влиять на Git - если я что-то не упустил, просто сохраните все папки в одной структуре папок и пусть Git охватит все это, предполагая, что это один более крупный проект. Если вам нужна модульность, сделайте каждый драйвер/эксперимент отдельным репозиторием. Если вы делаете несколько репозиториев, имеете несколько пультов и делитесь любым кодом напрямую, используя локально файловую систему. ПРИМЕЧАНИЕ. Другая стратегия может состоять в том, чтобы создать отдельную ветку для каждого из ваших экспериментов и просто переключаться между ними. Вы можете вытащить код из любого коммита/ветви прямо в рабочий каталог.   -  person LightCC    schedule 03.08.2020
comment
Это говорит о том, что с тех пор, как я удалил foo2.cpp, есть неустановленные изменения, и они не могут быть извлечены. Я не хочу удалять foo2.cpp с удаленного сервера. Как это можно исправить?   -  person northerner    schedule 03.08.2020
comment
git продолжает добавлять <<<<<<< HEAD и >>>>>>> initial commit к строкам внутри foo2.cpp   -  person northerner    schedule 03.08.2020
comment
<<< HEAD и т. д. — это промежуточная версия слияния этого файла. Вы застряли в слиянии/перебазировании. Если вы сбросите --hard до последнего коммита, он просто восстановит все файлы и отменит слияние, но в противном случае изучите, как прервать текущее слияние. В зависимости от того, что вы сделали, чтобы попытаться исправить это (кто знает, в каком состоянии он находится на данный момент), трудно дать прямой совет, кроме как временно сохранить любые файлы, которые вы хотите сохранить в другой папке, и выполнить полный сброс до последний коммит.   -  person LightCC    schedule 03.08.2020
comment
@LightCC Я сделал git push -f origin master и потерял большинство файлов и историю их коммитов из Bitbucket. Это можно отменить?   -  person northerner    schedule 04.08.2020
comment
К сожалению, принудительные толчки навсегда заменяют удаленное репо локальным репо, так что нет. Я понимаю, что сейчас это не помогает (извините), но приучите себя никогда не форсировать push без двойной и тройной проверки того, что вы точно знаете, что произойдет, и спросите себя, можно ли решить проблему с помощью новых коммитов, которые отменяют изменения. вместо.   -  person LightCC    schedule 04.08.2020
comment
Ответ здесь устранил проблему stackoverflow.com/questions/63242200/ Git слишком опасен для использования с важными файлами, не будучи уверенным в том, что делает каждая команда. Как научиться этому безопасно?   -  person northerner    schedule 04.08.2020
comment
@ paulsm4 нормально разрабатывать с помощью IDE. Я использую Нетбинс. Путь к исходному коду выглядит как C:\Users\<user-name>\Documents\NetBeansProjects\<project-name>, и я предполагаю, что другие IDE имеют такие же сложные пути. Большинство людей настраивают git в этом месте, то есть заходят ли они в каталог проекта и запускают git init, а затем запускают все последующие команды git в этом месте для проекта? Если нет, то каков правильный рабочий процесс?   -  person northerner    schedule 05.08.2020


Ответы (2)


Гит это хорошо.

Git очень усердно работает над обеспечением целостности вашего базового плана и истории вашего базового плана.

У вас только что произошла серия неудачных событий, мне очень жаль :(

Вы также подняли пару хороших вопросов:

  • Q1: Разработка в среде IDE — это нормально. Я использую Нетбинс. Большинство людей настраивают git в этом месте, то есть заходят ли они в каталог проекта и запускают git init...?

    КРАТКИЙ ОТВЕТ: обычно вы позволяете среде IDE создать для вас локальное хранилище

  • Q2: Git слишком опасен для использования с важными файлами, если вы не знаете, что делает каждая команда. Как научиться этому безопасно?

    КРАТКИЙ ОТВЕТ. Поэкспериментируйте с несколькими проектами hello world и хорошим руководством по Git; вы всегда можете сделать резервные копии своего проекта.

ПРЕДЛОЖЕНИЯ:

  1. Использование Git с вашей IDE:

    • By all means, use your IDE (e.g. Netbeans). I happen to mostly use Eclipse for Java, and MSVS for Windows).
    • Я бы создал ваши проекты и инициализировал Git, все в IDE.
    • Assuming you're on Windows, I would also download and install either/both of:
    • Вы обнаружите, что можете использовать ЛЮБОЙ из этих клиентов Git в ЛЮБОЙ комбинации в своей работе.
  2. Git совершенно не зависит от того, какие клиенты вы используете.

    После того, как вы запустили проект и загрузили один или оба других клиента Git, перейдите в каталог своего проекта и убедитесь, что все они видят одно и то же.

  3. Ознакомьтесь с некоторыми основными рабочими процессами Git.

    • После того, как вы создали свой проект, найдите хороший учебник и начните экспериментировать с функциями Git. Локально и/или с помощью Github или BitBucket.

    • Checkin, checkout, push, pull, reset --hard, создание веток, объединение веток и т.д. и т.п.

    • Каждый шаг на этом пути... перейдите в физический каталог вашего проекта... и сделайте вторичную копию. Как только вы обретете уверенность, вы обнаружите, что эта дополнительная резервная копия не нужна. До тех пор, это может быть спасением :)

    • Всегда помните, что в любое время и по любой причине, пока у вас есть скрытый подкаталог .git, вы всегда можете восстановить свой последний коммит:

      git reset --hard

'Надеюсь, это поможет...

person paulsm4    schedule 04.08.2020
comment
Вы говорите, что обычно используются функции Git, встроенные в IDE, а также клиенты Git для одних и тех же файлов? Я правильно понимаю? - person northerner; 05.08.2020
comment
Ага - это именно то, что я говорю. На практике это означает: а) вы можете использовать встроенные инструменты IDE (таким образом экономя несколько нажатий клавиш и придерживаясь любых соглашений, которые поощряет IDE), но б) вы всегда можете использовать другие клиенты Git по мере необходимости :) также предлагаю вам поработать с некоторыми учебными пособиями и провести несколько экспериментов, чтобы лучше ознакомиться с тем, как работает Git ... чтобы вы не испытали еще одну серию неудачных событий;) - person paulsm4; 05.08.2020
comment
Если у меня есть папка, которую отслеживает git (например, запущена git init), безопасно ли перетаскивать ее в другое место? Или это сломает git? - person northerner; 01.09.2020
comment
Все (ВСЕ), необходимое для репозитория git, содержится в скрытой папке .git. Так что да, вы можете безопасно перетаскивать свой каталог (например, MyProject) ... до тех пор, пока вы ТАКЖЕ убедитесь, что вы включили подкаталог .git. - person paulsm4; 02.09.2020

Локальные и удаленные репозитории должны иметь одинаковые файлы для коммита.

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

Позволь мне объяснить:

У меня есть foo.cpp в каталоге source_code. Я не хочу копировать все из удаленного репо в исходный код.

Я предполагаю, что под удаленным репо вы имеете в виду репо на удаленном сервере, то есть на Bitbucket. В Git нет такой вещи, как локальная копия удаленного репозитория с меньшим количеством файлов для данного коммита. Когда вы клонируете репозиторий Git, вы получаете все файлы. На самом деле, обычно все файлы со всеми коммитами/историей. На самом деле в этом смысл Git — контролировать версии всех ваших файлов, чтобы вы могли воссоздать точную копию всех файлов из любого коммита на любом ПК.

Если вы просто хотите обновить foo.cpp в репозитории, просто измените foo.cpp, добавьте его в индекс и отправьте обратно на удаленный сервер. Новый коммит по-прежнему будет содержать все остальные файлы, только foo.cpp будет изменено в новом коммите.



Как выйти из сложившейся ситуации?

Вы можете выйти из перебазирования/слияния, выполнив полный сброс до последней фиксации в локальном репо. Это сбросит все, чтобы начать заново. Но я не думаю, что вы сможете работать так, как хотите, и при этом все синхронизировать.

Когда вы извлекаете и пытаетесь перебазировать, перемотать вперед или объединить, Git запутается, если вы удалите файлы, потому что вы не хотите, чтобы они были в локальном репо, но они существуют в удаленном - поэтому вы получаете ошибки



Несколько локальных репозиториев?

Я не уверен, зачем вам нужны разные локальные репозитории для разных IDE, но вы МОЖЕТЕ сделать это, если это действительно необходимо. Просто дважды клонируйте репо в разные каталоги.

Просто поймите, что всякий раз, когда вы нажимаете на удаленное устройство с одного из локальных пользователей, это будет выглядеть так же, как другой пользователь, нажимающий на удаленное устройство из другого репо. Вам нужно будет получить эти изменения и выполнить быструю пересылку/слияние (git pull — это комбинация git fetch и git merge) в другом локальном репо, чтобы включить их. Если вы обновите оба локальных репозитория независимо друг от друга, вы в конечном итоге столкнетесь с конфликтами слияния, если они редактируют одни и те же файлы. Однако, если вы всегда переключаетесь между репозиториями, поднимая одно и опуская перед работой над другим, этого никогда не должно происходить.



Рассмотрите возможность использования только одного локального репо (или нескольких удаленных репо).

Однако я бы спросил, зачем вам два отдельных репозитория локально для разных IDE. Я бы действительно изучил ваши рассуждения о такой настройке - вероятно, есть лучший рабочий процесс.

Вы должны иметь возможность работать с одним локальным репозиторием, в котором есть все файлы, необходимые для любой IDE. Если вам действительно нужны разные файлы и вам нужно управлять ими отдельно, рассмотрите возможность создания для них совершенно отдельных репозиториев. Существуют различные методы, которые можно использовать для совместного использования общих файлов между двумя репозиториями, например, подмодули третьего репозитория как библиотеки с общими файлами.

Нам потребуется больше подробностей о цели использования двух отдельных IDE в одном репозитории, чтобы дать ответ о лучших практиках, как это сделать с помощью Git. Например, одна установка предназначена для разработки, а другая — для выпуска? (Это был бы отличный отдельный вопрос о StackOverflow...)

person LightCC    schedule 02.08.2020
comment
there is no such thing as having a local copy of a remote repo that has fewer files for a given commit можно ли разделить локальное репо на два каталога, чтобы объединенные файлы из обоих из них содержали все файлы в данном коммите? - person northerner; 03.08.2020
comment
Я имею в виду, что знаю, что могу вручную решить эту проблему, зайдя в веб-интерфейс Bitbucket и добавив туда foo.cpp. - person northerner; 03.08.2020
comment
Нет, это не цель git. То, что вы описываете, это два разных репозитория. Вы можете совместно использовать файлы локально, если некоторые из них совпадают, или формально вы можете создать отдельный репо только для общих материалов и сделать его подмодулем в каждом из двух репозиториев. Или вы можете взломать его с разными файлами в отдельных ветках. Это, вероятно, лучше, когда это просто прототипы/эксперименты... (т.е. если это временные случаи, используйте ветку, если постоянные, используйте другое репо). - person LightCC; 03.08.2020