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

Для личного проекта, где я единственный, кто создаёт код, я иногда переключаюсь между двумя разными 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.

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

Когда я выполняю 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

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

 ! [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.

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

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

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Git - это хорошо.

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

У вас только что была серия К сожалению, события , прошу прощения: (

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

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

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

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

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

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

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

    • В любом случае используйте вашу IDE (например, Netbeans). Я в основном использую Eclipse для Java и MSVS для Windows).
    • Я бы создал ваши проекты и инициализировал Git, все в среде IDE.
    • Предполагая, что вы ' в отношении Windows, я бы также загрузил и установил одно / оба из:
    • Вы обнаружите, что можете использовать ЛЮБОЙ из этих Git клиентов в ЛЮБОЙ комбинации в своей работе.
  2. Git полностью не зависит от c того, какой клиент (ы) вы используете.

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

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

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

    • Checkin, checkout, pu sh, pull, «reset --hard», создавать ветки, объединять ветки и т. Д. c . et c.

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

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

      git reset --hard

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

1 голос
/ 03 августа 2020

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

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

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

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

Я предполагаю, что под «удаленным репо» вы имеете в виду репо на удаленном сервере, то есть Bitbucket. В Git нет такой вещи, как наличие локальной копии удаленного репо с меньшим количеством файлов для данной фиксации. Когда вы клонируете репозиторий Git, вы получаете все файлы. Фактически, обычно все файлы со всеми коммитами / историей. В этом и состоит суть Git - контролировать версии всех ваших файлов, чтобы вы могли воссоздать точную копию всех файлов из любого коммита на любом P C.

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


Как выйти из текущей ситуации?

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

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


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

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

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


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

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

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

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

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