Что вы, вероятно, сделали, чтобы вызвать это:
Такого рода вещи случаются, когда вы запускаете небольшую программу. Вы собираетесь изменить что-то, что уже работало, поэтому вы разыгрываете заклинание 3-го уровня вечной отмены:
machine1:~/proj1> git init
и вы начинаете добавлять / фиксировать. Но затем , проект начинает становиться более активным, и вы хотите работать на нем с другого компьютера (например, с домашнего компьютера или ноутбука), поэтому вы делаете что-то вроде
machine2:~> git clone ssh://machine1/~/proj1
и он клонируется, и все выглядит хорошо, и вы работаете над своим кодом с machine2.
Затем ... вы пытаетесь выдвинуть ваши коммиты с machine2, и вы получите предупреждающее сообщение в заголовке.
Причина этого сообщения в том, что git-репо, из которого вы извлекли, было как бы предназначено для использования только для этой папки на машине1. Вы можете клонировать из него просто отлично, но нажатие может вызвать проблемы. «Правильный» способ управления кодом в двух разных местах - это «голое» репо, как было предложено. Голый репозиторий не предназначен для выполнения какой-либо работы в , он предназначен для координации коммитов из нескольких источников. Вот почему самый лучший ответ предлагает удалить все файлы / папки, кроме папки .git, после того, как вы git config --bool core.bare true
.
Уточнение ответа с самым высоким рейтингом: Во многих комментариях к этому ответу говорится что-то вроде: «Я не удалял файлы, не относящиеся к .git, с машины1, и я все еще мог зафиксировать с машины2 ». Вот так. Однако, эти другие файлы полностью «отделены» от git-репо. Попробуйте там git status
, и вы увидите что-то вроде «роковой: эта операция должна выполняться в рабочем дереве». Таким образом, предложение удалить файлы не так, чтобы коммит с machine2 работал , работал ; это чтобы вы не запутались и не подумали, что git все еще отслеживает эти файлы. Но удаление файлов является проблемой, если вы все еще хотите работать с файлами на компьютере1, не так ли?
Итак, что вы действительно должны делать?
Зависит от того, сколько вы планируете по-прежнему работать на machine1 и machine2 ...
Если вы закончили разработку с machine1 и перенесли всю свою разработку на machine2 ... , просто сделайте то, что предлагает самый высокий ответ: git config --bool core.bare true
, а затем, при необходимости, удалите все файлы. / папки, отличные от .git, из этой папки, поскольку они не отслежены и могут вызвать путаницу.
Если ваша работа на machine2 была единовременной, и вам не нужно продолжать там разработку ... , тогда не пытайтесь делать голое репо; просто ftp / rsync / scp / и т.д. ваши файлы с машины * 2 * поверх файлов на машине * 1 *, подтвердите / нажмите с машины * 1 *, а затем удалите файлы с машины * 2 *. Другие предлагали создать ветку, но я думаю, что это немного запутанно, если вы просто хотите объединить какую-то разработку, которую вы делали разово, с другой машины.
Если вам нужно продолжить разработку как на machine1, так и на machine2 ... , то вам нужно правильно все настроить. Вам нужно конвертировать репо в голое, , затем , вам нужно сделать клон этого на machine1, чтобы вы работали in. Вероятно, самый быстрый способ сделать это - сделать
machine1:~/proj1> git config --bool core.bare true
machine1:~/proj1> mv .git/ ../proj1.git
machine1:~/proj1> cd ..
machine1:~> rm -rf proj1
machine1:~> git clone proj1.git
machine1:~> cd proj1
Очень важно: , поскольку вы переместили расположение репозитория с proj1 на proj1.git, , вам необходимо обновить его в файле .git / config на machine2 . После этого вы можете зафиксировать свои изменения с machine2. Наконец, я стараюсь хранить свои голые репозитории в центральном месте, вдали от моих рабочих деревьев (то есть не помещайте «proj1.git» в ту же родительскую папку, что и «proj1»). Я советую вам сделать то же самое, но я хотел, чтобы описанные выше шаги были максимально простыми.