Как сбросить локальную ветвь на удаленный? [Дубликат]

Посмотрите на документацию здесь , что вы хотите:

intent.setClassName("com.x.y", "className");

2533
задан isherwood 19 February 2016 в 19:18
поделиться

17 ответов

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

git fetch origin
git reset --hard origin/master

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

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

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

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

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

4491
ответ дан Dan Moulding 15 August 2018 в 22:35
поделиться
  • 1
    Спасибо за ваш ответ. Вы сказали: «Обратите внимание, что в первом примере предполагается, что имя удаленного репо -« источник »; и что ветвь с именем "master" в удаленном репо соответствует ветке в вашем локальном репо ». Как я могу дважды проверить имя удаленного репо и имя моего филиала, прежде чем выполнить «git reset --hard»? Еще раз спасибо. – hap497 27 October 2009 в 03:57
  • 2
    Если вы не указали явным образом пульт, то это имя, скорее всего, просто «origin». (по умолчанию). Вы можете использовать & quot; git remote & quot; для получения списка всех удаленных имен. Затем вы можете использовать & quot; git remote & lt; name & gt; & quot; чтобы увидеть, какие ветви нажимаются / вытягиваются друг с другом (например, если ваша «главная» ветвь была клонирована из «master» в удаленном названии «origin», тогда вы получите строку, которая гласит, что «master» сливается с удаленным мастер & Quot;). – Dan Moulding 27 October 2009 в 14:51
  • 3
    & quot; не рекомендуется вставлять в не-голый репозиторий (а не в текущую выделенную ветвь, в частности "Почему это? – LeeGee 20 March 2013 в 13:00
  • 4
    Сразу после извлечения, я считаю, что вы можете сделать git reset FETCH_HEAD --hard, а также, это то же самое. – Jean 30 April 2013 в 22:21
  • 5
    Жаль, что я могу только перенести это однажды. Я пришел к этому точному ответу, как 20 раз. Наверное, больше. – frosty 6 September 2017 в 23:07

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

git reset --hard HEAD~2

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

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

git reset --hard HEAD~5

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

121
ответ дан A-B-B 15 August 2018 в 22:35
поделиться
  • 1
    Это кажется лучшим ответом, чем принятый, поскольку он динамически сбрасывается в текущую ветвь вверх, а не всегда статическую, такую ​​как origin/master – Jon z 22 September 2015 в 15:10
  • 2
    Это должно быть отмечено как принятый ответ – Gangadhar Jannu 15 August 2018 в 11:08

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

git fetch origin
git reset --hard origin/master

Далее следуют:

git clean -f

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

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

git clean -n -f
250
ответ дан Akavall 15 August 2018 в 22:35
поделиться
  • 1
    также, git clean -d -f, если имеются нетрадиционные каталоги. – garg 23 January 2015 в 19:09
  • 2
    также git clean -fdx – Swapnil Kotwal 28 September 2015 в 06:32
  • 3
    Если вам нужна точная копия удаленной ветки, вам нужно следовать git clean -fdx. Заметим, что существует два f. – Trismegistos 22 February 2016 в 15:51
  • 4
    git clean -f был необходимой частью, в которой я нуждался. Благодаря! – dgo 26 April 2016 в 22:51
  • 5
    будьте осторожны, используя команду clean. он может удалять игнорируемые файлы из других ветвей. – mikoop 9 January 2017 в 09:23

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

0
ответ дан Bilal Hamid 15 August 2018 в 22:35
поделиться

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

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

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

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

57
ответ дан Charlie Collins 15 August 2018 в 22:35
поделиться
  • 1
    Предупреждение: «git clean -x -d -f» является необратимым, и вы можете потерять файлы и данные в .gitignore – Akarsh Satija 16 February 2016 в 07:20
  • 2
    лучший ответ; Благодарю. – Bob Baxley 1 August 2016 в 03:27

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

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

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

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

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

11
ответ дан Community 15 August 2018 в 22:35
поделиться

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

11
ответ дан eigenharsha 15 August 2018 в 22:35
поделиться

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

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

5
ответ дан Emil Sit 15 August 2018 в 22:35
поделиться

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

Проверьте свои пульты, убедитесь, что ваш восходящий поток и источник - это то, что вы ожидаете, если не так, как ожидалось, используйте 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;

Или:

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

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

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

сохранить конфликтующие изменения ветви_имя. В противном случае используйте 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 / develop вы можете использовать хеш-фиксацию, другое имя ветки, и т. д. Используйте инструмент CLI, такой как Oh My Zsh, чтобы проверить, что ваша ветка зеленая, указывает, что ничего не зафиксировано, и рабочий каталог является чистым (что подтверждено или также проверено git status). Обратите внимание, что это может фактически добавить фиксации по сравнению с восходящим потоком, если есть что-либо, автоматически добавленное фиксацией, например. UML-диаграммы, заголовки лицензий и т. Д., Поэтому в этом случае вы могли бы потянуть изменения на origin develop на upstream develop, если это необходимо.

0
ответ дан James Ray 15 August 2018 в 22:35
поделиться

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

git stash
git pull
-2
ответ дан John Peyton 15 August 2018 в 22:35
поделиться

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

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

xkcd: Git

3
ответ дан Martin 15 August 2018 в 22:35
поделиться

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

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

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

git reset --hard origin/HEAD

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

92
ответ дан Mikael Ohlson 15 August 2018 в 22:35
поделиться
  • 1
    В моем ответе было неверное предположение, что Дэн поймал раньше. Я отредактировал его, так как я не хочу никого вводить в заблуждение. Что касается материала origin / master или origin / HEAD, я ожидаю, что это зависит от того, действительно ли вы на самом деле делаете выборку. Если вы просто клонировали происхождение, и у него не было других ветвей, которые, как мне кажется, довольно распространены, тогда он должен полностью сбрасывать его. Но, конечно, Дэн прав. – Mikael Ohlson 27 October 2009 в 10:58

В этом вопросе смешиваются два вопроса:

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

. Один-стоп-ответ:

  1. git fetch --prune (необязательно) Обновляет локальный снимок удаленного репо. Дальнейшие команды являются только локальными. git reset --hard @{upstream} Помещает указатель локальной ветви, где находится моментальный снимок удаленного, а также задает индекс и рабочий каталог файлам этого коммита.
  2. git clean -d --force Удаляет неподготовленные файлы и каталоги, которые [gg]
29
ответ дан Robert Siemer 15 August 2018 в 22:35
поделиться
  • 1
    Синтаксис @{upstream} требует установки восходящего потока, который будет выполняться по умолчанию, если вы git checkout <branchname>. - В противном случае замените его на origin/<branchname>. – Robert Siemer 31 January 2016 в 02:31
  • 2
    Добавьте -x в git clean, чтобы удалить все, что не происходит в фиксации (т. Е. Даже файлы игнорируются с помощью механизма .gitignore). – Robert Siemer 31 January 2016 в 02:34

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

git fetch origin
git reset --hard origin/master
-5
ответ дан Sarang A 15 August 2018 в 22:35
поделиться
  • 1
    Может кто-нибудь сказать мне, что с этим не так, потому что много времени я использую для сброса моей локальной ветви с помощью пульта. – Sarang A 12 July 2017 в 12:51
  • 2
    Главный ответ уже включает ваш ответ. – Velda 16 August 2017 в 11:39

Единственное решение, которое работает во всех случаях, которые я видел, - это удаление и повторное использование. Может быть, есть и другой способ, но, очевидно, этот путь не оставляет шансов на то, что старое государство останется там, поэтому я предпочитаю это. 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-файлы не повреждены

0
ответ дан sudo 15 August 2018 в 22:35
поделиться

Я сделал:

git branch -D master
git checkout master

, чтобы полностью сбросить ветвь


note, вы должны проверить на другую ветку, чтобы удалить нужную ветку

10
ответ дан user2846569 15 August 2018 в 22:35
поделиться
  • 1
    Вы должны снова прочитать вопрос, ничего не влияют на удаленный доступ, но устанавливаются так же, как удаленный, поэтому вы ничего не должны делать с помощью пульта дистанционного управления, и это помогло в моем случае и не выше. – user2846569 14 May 2014 в 11:43
  • 2
    Если вы хотите установить его на то же, что и на пульте дистанционного управления, вы должны хотя бы сделать выборку в какой-то момент, не согласны ли вы? – Tim Castelijns 14 May 2014 в 11:50
  • 3
    вы должны хотя бы попробовать это или прочитать документы: kernel.org/pub/software/scm/git/docs/git-checkout.html – user2846569 14 May 2014 в 12:04
  • 4
    Нет другой ветки ;-) Я думаю, что дополнительный шаг - это то, что вы должны отредактировать в своем ответе, и если вы это сделаете, я сниму нижний уровень (не могу сейчас, потому что он заблокирован) – Tim Castelijns 14 May 2014 в 12:15
  • 5
    Так создайте временную. – qaisjp 14 July 2014 в 15:29

Это то, с чем я сталкиваюсь регулярно, & amp; Я обобщил приведенный выше сценарий Вольфганг для работы с любой ветвью

. Я также добавил приглашение «вы уверены», & amp; выход обратной связи

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://stackoverflow.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
20
ответ дан Wolfgang Fahl 15 August 2018 в 22:35
поделиться
  • 1
    вы можете использовать «git remote», чтобы получить имя пульта. В некоторых случаях это не будет «происхождение». – Yurik 7 October 2014 в 23:54
Другие вопросы по тегам:

Похожие вопросы: