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

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

Я сделал:

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

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

Ответы [ 19 ]

5531 голосов
/ 27 октября 2009

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

git fetch origin
git reset --hard origin/master

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

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

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

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

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

325 голосов
/ 27 декабря 2014

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

git fetch origin
git reset --hard origin/master

Далее:

git clean -f

для удаления локальных файлов

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

git clean -n -f
203 голосов
/ 10 февраля 2015

Сначала вернемся к ранее выбранному HEAD соответствующей восходящей ветви:

git reset --hard @{u}

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

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

git clean -df

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

git pull
101 голосов
/ 27 октября 2009

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

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

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

git reset --hard origin/HEAD

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

67 голосов
/ 23 июля 2015

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

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

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

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

34 голосов
/ 31 января 2016

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

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

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

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

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

Я также добавил приглашение «Вы уверены» и некоторые отзывы

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see /1087983/sbrosit-vetku-lokalnogo-repozitoriya-chtoby-ona-byla-pohozha-na-zagolovok-udalennogo-repozitoriya
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
13 голосов
/ 08 мая 2017

При условии, что удаленный репозиторий 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.

13 голосов
/ 15 октября 2012

Вот скрипт, который автоматизирует то, что предлагает самый популярный ответ ... См. https://stackoverflow.com/a/13308579/1497139 для улучшенной версии, которая поддерживает филиалы

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see /1087983/sbrosit-vetku-lokalnogo-repozitoriya-chtoby-ona-byla-pohozha-na-zagolovok-udalennogo-repozitoriya
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
11 голосов
/ 14 мая 2014

Я сделал:

git branch -D master
git checkout master

для полного сброса ветки


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

...