Как зафиксировать только файлы, которые отличаются от существующего удаленного репозитория github?

#git #github

#git #github

Вопрос:

Не уверен, как сделать этот вопрос более точным, поэтому я объясню.

У меня есть свой удаленный репозиторий на github с несколькими фиксациями. Я загрузил последний коммит и внес некоторые изменения в несколько файлов в моем локальном проекте, но я удалил репозиторий git в моем проекте.

Когда я хочу подключить свой локальный проект к существующему репозиторию github, используя :

 git init
git remote add origin git@github.com:User/UserRepo.git 
  

мои локальные файлы не будут сравниваться с последней фиксацией, но он хочет отправить каждый файл, который у меня есть в проекте (файлы, которые я не изменял, которые уже находятся в моей последней удаленной фиксации), а не только несколько файлов, которые я изменил.

Как сравнить мои локальные изменения с последней удаленной фиксацией и зафиксировать только те изменения, которые отличаются или являются новыми по сравнению с последней фиксацией?

Ответ №1:

Вот еще один способ сделать это :

если вы хотите зафиксировать свои файлы поверх ветки с именем mybranch :

  1. создайте локальную ветку без истории с именем mybranch :

     git branch mybranch
    git checkout mybranch
      
  2. запустите git fetch , чтобы обновить ваше представление о origin/mybranch

  3. выполнить git reset origin/mybranch
    важно: не используйте --hard опцию, это приведет к удалению ваших локальных изменений

Теперь вы вернулись к состоянию, когда :

  • активный коммит — это главный коммит mybranch
  • ваши локальные изменения сравниваются с этим фиксацией

Возможно, вы захотите добавить git branch -u origin/mybranch , чтобы ваша локальная ветка отслеживала удаленную ветку.

Ответ №2:

Простой ответ заключается в том, что git всегда будет сравнивать вашу рабочую копию с извлеченным вами коммитом, который обычно является вершиной какой-либо ветки. Итак, чтобы сравнить с каким-либо другим состоянием, вам нужно проверить это состояние и применить свои изменения поверх него.

Ситуация, которую вы описываете, немного необычна, потому что вы запустили git init (создание совершенно нового репозитория) там, где git clone было бы более естественно (запуск репозитория на основе удаленного).

Хорошо то, что git на самом деле не заботится об этом — хотя он часто используется с центральным сервером, он разработан для полного распространения, поэтому связать несвязанные репозитории вместе не проблема.

Вам нужно сделать несколько вещей:

  1. Извлеките содержимое удаленного репозитория с помощью git fetch origin ( git clone сделал бы это по умолчанию, но git remote add не делает).
  2. Уберите ваши локальные файлы с дороги — возможно, самый простой способ — это просто переместить все из них в совершенно другую папку на вашем локальном компьютере, поскольку git в настоящее время считает, что все они совершенно новые.
  3. Проверьте ветку, над которой вы хотите продолжить работу; вероятно, она называется master , или main , или develop , но это всего лишь условности.
  • Если вы запускаете, git checkout master и у вас еще нет ветки с именем master, git будет рассматривать ее как сокращение от git checkout -t origin/master , что означает «создайте локальную ветку, master связанную для push и pull с веткой с тем же именем на origin удаленном».
  • Если у вас уже есть локальная ветка с именем нужной вам ветки (например, она была создана для вас git init ), самым простым подходом будет удалить ее — проверьте любую другую ветку, затем запустите git branch -D branch_name .
  1. Теперь переместите ваши файлы обратно в рабочий каталог, и они будут сравнены с веткой, которую вы проверили.

Комментарии:

1. эй, большое спасибо, что помогли мне! У меня проблема с вашим решением, проект довольно большой, и в нем много локальных изменений / дополнений, о которых я не знаю, и я не могу переместить измененные файлы в другую папку, потому что я не уверен, какие из них изменены. Есть ли другой способ сделать это? Я могу просто удалить инициализированную мной папку git и сделать это другим способом, если это возможно. В принципе, я хочу подключиться к ветке origin, которая была зарегистрирована последней, без удаления моих локальных изменений. Возможно ли это вообще?

2. @PTK: IMSoP предлагает вам удалить все ваши файлы, запустить git checkout, затем переместить все из них обратно. Задача git определить, какие файлы были изменены.