Как мне синхронизировать два проверенных репозитория git? - PullRequest
0 голосов
/ 01 марта 2020

У меня есть все мои данные в моем доме P C в репо git.

Этот дом P C (и, следовательно, репо git) доступен только из местного Локальная сеть, в которой включен домашний P C. Поместить репо git на доступный для облака облачный сервер inte rnet или сделать мой домашний P C доступным через inte rnet не представляется возможным. Это ограничение важно упомянуть в приведенном ниже вопросе, поскольку в противном случае очевидным решением будет «просто поставить репо git на облачный сервер».

У меня есть ноутбук, с которым я путешествую, и который называется Laptop-A. Прежде чем уехать в путешествие, я проверяю репо на ноутбуке-A из моего дома P C, используя: git clone s sh: // main-PC / ... Во время своих путешествий я делаю локальные изменения на ноутбуке-A, и я фиксирую их локально, но я не могу их sh, поскольку основной репо на моем домашнем компьютере P C недоступен через inte rnet. Мои изменения могут быть отправлены только по возвращении домой, когда я нахожусь в той же локальной сети, что и мой дом. P C.

Все это работает, но теперь я добавляю Laptop-B во время путешествий. Этот ноутбук также имеет основной репо, клонированный, как это делает Laptop-A. На самом деле два ноутбука в основном идентичны, но это две отдельные машины. Я делаю это в случае, если один из ноутбуков имеет аппаратную неисправность. В этом случае у меня все еще есть другой ноутбук.

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

Что я хочу сделать, это зафиксировать изменение на ноутбуке-А а затем синхронизировать его с ноутбуком-B, чтобы я мог получить sh (в основной репо) с любого ноутбука, как только я вернусь домой.

Как я могу выполнить sh это?

1 Ответ

1 голос
/ 01 марта 2020

Нет Git хранилище является «особенным» или «более важным», чем любое другое хранилище Git, если только вы сами этого не считаете.

Когда вы git clone ssh://main-PC/... на ноутбуке А, Git при запуске на ноутбуке A создается Git репозиторий, который является равноправным из Git на main-PC. Вы рассматриваете только основную версию P C как «более мастер-у», потому что именно так вы ее используете, и на самом деле, во время путешествий, версия ноутбука «более мастер-у», потому что она получает новые коммиты.

В хранилище вашего ноутбука A используется имя origin для запоминания URL ssh://main-PC/.... Имя origin является удаленным . Ваш ноутбук-A Git использует имена для удаленного слежения в форме origin/*, чтобы запомнить имена филиалов в других Git.

На вашем ноутбуке-B вы можете клонируйте ваш ноутбук-клон или ваш основной клон P C. Ваш ноутбук-B запомнит любой URL, который вы используете здесь под своим именем origin, и будет использовать имена для удаленного отслеживания origin/*, чтобы запомнить имена веток, скопированные в процессе клонирования.

You Можно добавить больше удаленных имен для любого ноутбука. Например, при условии, что оба ноутбука A и B работали git clone ssh://main-PC/..., так что на обоих origin означает ssh://main-PC/..., вы можете сделать это на ноутбуке A:

git remote add laptop-b ssh://ip.address/path/to/repo.git

, например (из Конечно, IP-адрес может со временем меняться, поэтому вам придется удалить и повторно добавить или использовать git remote set-url, чтобы исправить это иногда). Теперь ноутбук-A имеет имя для ноутбука-B, и вы можете git fetch или git push от A до B, чтобы получить (получить) или отправить (pu sh) любые коммиты, которые находятся на B, но не A (выборка) или A, но не B (pu sh). Аналогично, на ноутбуке B:

git remote add laptop-a ssh://ip.address/path/to/repo.git

создаст удаленное имя laptop-a на ноутбуке B, и теперь вы можете git fetch или git push, используя это имя.

Подтверждает, что На одном ноутбуке теперь легко переносятся на другой. Обратите внимание, что имя для удаленного слежения , например, laptop-b/master на ноутбуке A - это то, как один ноутбук будет помнить, что другой ноутбук имеет некоторую фиксацию - так что теперь вы захотите иметь тот ноутбук, который есть " позади »обновите свои локальные имена веток, чтобы запомнить новые коммиты.

Ключевым понятием является то, что все три репозитория равноправны . Ни один из них не имеет особого статуса, кроме тех случаев, когда вы лично решаете, что у вас есть особый статус. Вместо того, чтобы принимать решение о состоянии c, вы можете принять решение на основе идентификаторов коммитов ha sh, записанных под именами удаленного отслеживания, такими как origin/master, laptop-a/master и laptop-b/master.

The имена ветвей в каждом из этих одноранговых репозиториев различны. commit ha sh ID одинаковы при условии, что все они имеют одинаковые коммиты. Когда в одном репозитории отсутствуют какие-либо коммиты, git fetch будет их возвращать (из репозитория, которому нужны коммиты, в тот, в котором они есть), и / или git push отправит их (из репозитория, в котором есть коммиты). фиксирует тот, который нуждается в них.)

Эти две операции - выборка и нажатие - почти симметрии c, за исключением одного другого ключевого различия. Операция fetch принимает имена ветвей исходного репозитория и переименовывает их , чтобы они входили под именами удаленного отслеживания, такими как origin/master. Операция pu sh отправляет коммиты, а затем либо:

  • запрашивает у цели pu sh указать несколько названий его ветвей (это вежливо non-принудительное pu sh) или
  • дает команду целевому элементу pu sh установить одно из имен его ветвей (принудительный pu sh).

Поскольку цель пу sh устанавливает свои имена branch , выполняется несколько специальных условий:

  1. Ветвь не должна быть извлечена в рабочее дерево. Это хорошо работает, если репозиторий сделан из --bare, так как в нем никогда не извлекается ветвь в рабочем дереве.
  2. Или ветвь может быть извлечена в рабочем дереве, но затем Git получающий пу sh должен получить разрешение на такие операции пу sh (и другие условия должны выполняться). См. Например, Git получать. denyCurrentBranch updateInstead терпит неудачу [Edit: или ваша лучшая ссылка, Что это за предупреждение Git при отправке изменений в удаленный репозиторий? .

По этим причинам иногда лучше использовать весь процесс работы; но затем вам нужно использовать вторую команду Git, чтобы объединить новых коммитов в локальный репозиторий. Многим нравится использовать для этого команду git pull, так как сначала она запускает git fetch, а затем запускает вторую команду Git для включения извлеченных коммитов.

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