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

Как мне сбросить мою локальную ветку, чтобы она была похожа на ветку в удаленном репозитории?

Я сделал:

git reset --hard HEAD

Но когда я бегу git status,

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
      modified:   java/com/mycompany/TestContacts.java
      modified:   java/com/mycompany/TestParser.java

Подскажите, пожалуйста, почему у меня эти "модифицированные"? Я не трогал эти файлы? Если я это сделаю, я хочу удалить их.

29 ответов

Решение

Настройка вашей ветки в точном соответствии с удаленной веткой может быть выполнена в два этапа:

git fetch origin
git reset --hard origin/master

Если вы хотите сохранить текущее состояние вашей ветви перед этим (на всякий случай), вы можете сделать:

git commit -a -m "Saving my work, just in case"
git branch my-saved-work

Теперь ваша работа сохраняется в ветке "my-сохраненная работа" на тот случай, если вы решите, что хотите вернуть ее (или хотите посмотреть на нее позже или сравнить ее с обновленной веткой).

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

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

Мне нужно было сделать (решение в принятом ответе):

git fetch origin
git reset --hard origin/master

С последующим:

git clean -f

удалить локальные файлы

Чтобы увидеть, какие файлы будут удалены (без их фактического удаления):

git clean -n -f

Во-первых, сброс на ранее выбранный HEAD соответствующей восходящей ветви:

git reset --hard @{u}

Преимущество указания @{u} или его многословная форма @{upstream} является то, что имя удаленного репо и филиала не должны быть указаны явно.

Затем при необходимости удалите неотслеживаемые файлы, при необходимости также с -x:

git clean -df

Наконец, по мере необходимости, получите последние изменения:

git pull

git reset --hard HEAD фактически сбрасывается только до последнего совершенного состояния. В этом случае HEAD означает HEAD вашей ветки.

Если у вас есть несколько коммитов, это не сработает..

То, что вы, вероятно, хотите сделать, - это сбросить на исходную точку или как называется ваш удаленный репозиторий. Я бы, наверное, просто сделал что-то вроде

git reset --hard origin/HEAD

Будьте осторожны, хотя. Жесткий сброс не может быть легко отменен. Лучше сделать, как предлагает Дэн, и перед сбросом ответвьте копию ваших изменений.

Все вышеприведенные предложения верны, но часто, чтобы действительно сбросить ваш проект, вам также необходимо удалить даже файлы, которые находятся в вашем .gitignore,

Чтобы получить моральный эквивалент удаления каталога проекта и повторного клонирования с удаленного компьютера, выполните следующие действия.

git fetch
git reset --hard
git clean -x -d -f

Предупреждение: git clean -x -d -f является необратимым, и вы можете потерять файлы и данные (например, вещи, которые вы проигнорировали, используя .gitignore).

Пожалуйста, попробуйте следующие команды, он также удалит все неотслеживаемые файлы из локального Git

git fetch origin
git reset --hard origin/master
git clean -d -f

Вопрос смешивает два вопроса здесь:

  1. как сбросить локальную ветку до точки где удаленный
  2. как очистить вашу промежуточную область (и, возможно, рабочий каталог), чтобы git status говорит nothing to commit, working directory clean.

Единый ответ:

  1. git fetch --prune (необязательно) Обновляет локальный снимок удаленного репо. Дальнейшие команды только локальные.
    git reset --hard @{upstream} Помещает указатель локальной ветки, где находится снимок удаленного, а также устанавливает индекс и рабочий каталог в файлы этого коммита.
  2. git clean -d --force Удаляет неотслеживаемые файлы и каталоги, которые мешают git сказать "рабочий каталог чист".

При условии, что удаленный репозиторий originи что вы заинтересованы в branch_name:

git fetch origin
git reset --hard origin/<branch_name>

Кроме того, вы идете для сброса текущей ветви origin в HEAD,

git fetch origin
git reset --hard origin/HEAD

Как это устроено:

git fetch origin загружает последние с удаленного, не пытаясь объединить или перебазировать что-либо.

Тогда git reset сбрасывает <branch_name> переход к тому, что вы только что получили. --hard опция изменяет все файлы в вашем рабочем дереве в соответствии с файлами в origin/branch_name,

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

Я также добавил приглашение "Вы уверены" и вывод обратной связи?

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://stackru.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] || 
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
  git branch "auto-save-$branchname-at-$timestamp" 
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname

Вы можете получить источник и сбросить, чтобы решить проблему

       git fetch origin
 git reset --hard origin/main

Вы можете сохранить свои изменения перед выполнением сброса, как показано ниже,

      git stash

И после сброса, если вы хотите вернуть эти изменения, вы можете просто запустить,

      git stash apply

Я сделал:

git branch -D master
git checkout master

полностью сбросить ветку


обратите внимание, вы должны оформить заказ в другую ветку, чтобы иметь возможность удалить нужную ветку

Вот скрипт, который автоматизирует то, что предлагает самый популярный ответ... См. /questions/45361113/sbrosit-vetku-lokalnogo-repozitoriya-tak-chtobyi-ona-byila-pohozha-na-zagolovok-udalennogo-repozitoriya/45361183#45361183 для улучшенной версии, которая поддерживает ветви

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see https://stackru.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  git branch "auto-save-at-$timestamp" 
fi
git fetch origin
git reset --hard origin/master

Ответ

git clean -d -f

был недооценен (-d для удаления каталогов). Благодарность!

2023 простое решение:

      git fetch
git reset --hard @{u}

Сброс доorigin/HEADне всегда будет работать, поскольку это не обязательно последний коммит вашей текущей ветки.

Если у вас была проблема со мной, что вы уже совершили некоторые изменения, но теперь, по любой причине, вы хотите от нее избавиться, самый быстрый способ - это использовать git reset как это:

git reset --hard HEAD~2

У меня было 2 не нужных коммита, отсюда и номер 2. Вы можете изменить его на свое количество коммитов для сброса.

Итак, отвечая на ваш вопрос - если вы на 5 коммитов впереди HEAD удаленного репозитория, вы должны выполнить эту команду:

git reset --hard HEAD~5

Обратите внимание, что вы потеряете внесенные изменения, поэтому будьте осторожны!

Предыдущие ответы предполагают, что ветвь, которая должна быть сброшена, является текущей веткой (проверено). В комментариях OP hap497 пояснил, что ветка действительно проверена, но это не требуется явно в исходном вопросе. Поскольку существует хотя бы один "дублирующий" вопрос, полностью сбросьте ветвь до состояния хранилища, что не предполагает, что ветвь извлечена, вот альтернатива:

Если ветвь "mybranch" в настоящее время не извлечена, чтобы сбросить ее до заголовка удаленной ветки "myremote/mybranch", вы можете использовать эту команду низкого уровня:

git update-ref refs/heads/mybranch myremote/mybranch

Этот метод оставляет проверенную ветку такой, какая она есть, и рабочее дерево нетронутым. Он просто перемещает голову mybranch на другой коммит, независимо от того, что указано в качестве второго аргумента. Это особенно полезно, если необходимо обновить несколько веток до новых удаленных голов.

Будьте осторожны при этом, и используйте gitk или аналогичный инструмент для двойной проверки источника и назначения. Если вы случайно сделаете это в текущей ветке (и git не будет вас об этом предупреждать), вы можете запутаться, потому что новое содержимое ветки не соответствует рабочему дереву, которое не изменилось (чтобы исправить, снова обновите ветку, туда, где это было раньше).

Это то, что я использовал регулярно, хотя и для других отраслей:

git fetch upstream master;
git reset --hard upstream/master;
git clean -d --force;

Обратите внимание, что хорошей практикой является не вносить изменения в локальный мастер, а вместо этого извлекать изменения в другую ветвь с именем ветки, начинающимся с типа изменения, например feat/, chore/, fix/и т. д. Таким образом, вам нужно только извлекать изменения, а не выталкивать изменения из мастера. То же самое для других отраслей, которым способствуют другие. Таким образом, вышеприведенное следует использовать только в том случае, если вы зафиксировали изменения в ветке, в которую зафиксированы другие, и вам необходимо выполнить сброс. В противном случае в будущем избегайте нажатия на ветку, к которой другие подталкивают, вместо этого извлекайте и проталкивайте к указанной ветке через извлеченную ветку.

Если вы хотите сбросить локальную ветвь до последнего коммита в ветке upstream, у меня пока работает:

Проверьте свои пульты, убедитесь, что ваш апстрим и источник соответствуют вашим ожиданиям, если не соответствуют ожиданиям, используйте git remote add upstream <insert URL>Например, оригинального репозитория GitHub, с которого вы ответили, и / или git remote add origin <insert URL of the forked GitHub repo>,

git remote --verbose

git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force

На GitHub вы также можете извлекать ветку с тем же именем, что и у локальной, чтобы сохранить там работу, хотя в этом нет необходимости, если у origin development есть те же изменения, что и у локальной ветки сохраненной работы. В качестве примера я использую ветвь разработки, но это может быть любое существующее имя ветки.

git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop

Затем, если вам нужно объединить эти изменения с другой веткой, когда возникают конфликты, сохраняя изменения в разработке, используйте:

git merge -s recursive -X theirs develop

Во время использования

git merge -s recursive -X ours develop

чтобы сохранить конфликтующие изменения branch_name. В противном случае используйте mergetool с git mergetool,

Со всеми изменениями вместе:

git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;

Обратите внимание, что вместо upstream/development вы можете использовать хеш коммита, другое имя ветки и т. Д. Используйте инструмент CLI, такой как Oh My Zsh, чтобы проверить, что ваша ветвь зелёная, что означает, что нечего коммитить, а рабочий каталог чистый (что подтверждается или также проверяется git status). Обратите внимание, что на самом деле это может добавить коммиты по сравнению с исходной разработкой, если что-то автоматически добавляется коммитом, например диаграммы UML, заголовки лицензий и т. Д., Так что в этом случае вы можете затем внести изменения origin develop в upstream develop, если нужно.

Всего 3 команды заставят его работать

git fetch origin
git reset --hard origin/HEAD
git clean -f

Ответ с самым высоким рейтингом здесь не сбросил мой локальный код, как ожидалось.

  1. в настоящее время мастер обычно главный
  2. он ничего не делает с неотслеживаемыми файлами, которые у вас могут лежать

Вместо:

  1. проверьте имя вашей удаленной ветки по умолчанию (это не git, поэтому проверьте в GitHub), затем замените main или master на шаге 4 ниже этим

  2. сохранить текущий материалgit stash -u

  3. обновление с удаленногоgit fetch origin

  4. сбросить на удаленную ветку по умолчанию (но см. шаг 1 выше)git reset --hard origin/main

Если вы хотите вернуться к HEAD указать рабочий каталог и индекс, а затем git reset --hard HEADвместо того, чтобы HEAD^, (Это может быть опечатка, так же, как одиночная или двойная черта для --hard.)

Что касается вашего конкретного вопроса относительно того, почему эти файлы появляются в статусе как измененные, похоже, что вы сделали программный сброс вместо аппаратного сброса. Это приведет к тому, что файлы, которые были изменены в HEAD сделайте так, чтобы они выглядели так, как будто они были поставлены, что вполне вероятно, что вы видите здесь.

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

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

xkcd: Git

Во-первых, проверьте сgit statusесли у вас есть какие-либо локальные изменения. Если да, спрячьте их.

Затем выполните:

      git fetch
git reset --hard @{push}

Он сбросит текущую локальную ветку на ту же удаленную ветку, которая будет использоваться дляgit push. Это особенно полезно, когдаgit config push.default currentнастроен. Например, когда ваш филиалabcи удаленныйorigin, он сбросит его наorigin/abc.

Дополнительные сведения о@{push}

Единственное решение, которое работает во всех случаях, которые я видел, это удалить и откинуть. Может быть, есть и другой путь, но, очевидно, этот путь не оставляет шансов на то, что старое государство останется там, поэтому я предпочитаю это. Bash one-liner вы можете установить как макрос, если вы часто путаетесь в git:

REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH

* предполагает, что ваши.git файлы не повреждены

Вы забыли создать функциональную ветку и по ошибке сделали коммит прямо на мастере?

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

git checkout -b feature-branch
git branch -f master origin/master
  • Выдает ошибку из-за незафиксированных изменений.
  1. Итак, вы можете использовать git stash
  • Это сохраняет незафиксированные изменения для последующего использования, а затем возвращает их из вашей рабочей копии.
  • Если вы хотите снова внести эти изменения, вы можете использовать git stash apply
  1. Затем вы можете использовать git pull
  • Это берет последний код из удаленного репо.

Используйте reset --soft origin/ это вернет к исходному заголовку и даст вам возможность работать с изменениями. они могут быть отброшены или

      git fetch origin
git checkout main
git reset --hard origin/main
# Local `master` branch is now up to date with remote `main`

Если вы не возражаете против сохранения своих локальных изменений, но все же хотите обновить свой репозиторий, чтобы он соответствовал origin/HEAD, вы можете просто спрятать свои локальные изменения и затем нажать:

git stash
git pull

Если вы хотите, чтобы текущие изменения использовались позже, то сохраните изменения, иначе вы можете использовать эти две команды,

git fetch origin
git reset --hard origin/master
Другие вопросы по тегам