Как мне сбросить мою локальную ветку, чтобы она была похожа на ветку в удаленном репозитории?
Я сделал:
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
Подскажите, пожалуйста, почему у меня эти «модифицированные»? Я не трогал эти файлы? Если я это сделаю, я хочу удалить их.
git status
ваша вторая командаgit reset --hard HEAD
не удалась. Вы не вставили его вывод, хотя. → Неполный вопрос.git status
говоритсяnothing to commit, working directory clean
. - Пожалуйста уточни!Ответы:
Настройка ветки в точном соответствии с удаленной веткой может быть выполнена в два шага:
Если вы хотите сохранить текущее состояние вашей ветви перед этим (на всякий случай), вы можете сделать:
Теперь ваша работа сохраняется в ветке "my-сохраненная работа" на тот случай, если вы решите, что хотите вернуть ее (или хотите посмотреть на нее позже или сравнить ее с обновленной веткой).
Обратите внимание, что в первом примере предполагается, что имя удаленного репо - «происхождение» и что ветвь с именем «master» в удаленном репо совпадает с извлеченной в данный момент веткой в вашем локальном репо.
Кстати, эта ситуация, в которой вы находитесь, очень похожа на обычный случай, когда в текущую извлеченную ветвь непрошедшего репозитория был сделан переход. Вы недавно продвигались в свой локальный репо? Если нет, то не стоит беспокоиться - что-то еще должно было привести к изменению этих файлов. В противном случае вы должны знать, что не рекомендуется загружать в не-пустой репозиторий (и, в частности, не в извлеченную ветку).
источник
git reset FETCH_HEAD --hard
то же самое.Мне нужно было сделать (решение в принятом ответе):
С последующим:
удалить локальные файлы
Чтобы увидеть, какие файлы будут удалены (без их фактического удаления):
источник
git clean -d -f
если есть неотслеживаемые каталоги.git clean -fdx
git clean -f
была необходимая вещь, которая мне была нужна. Спасибо!Сначала вернемся к ранее выбранной
HEAD
соответствующей ветви восходящего направления:Преимущество указания
@{u}
или его подробной формы@{upstream}
заключается в том, что имя удаленного репо и филиала не нужно указывать явно.Затем, при необходимости, удалите неотслеживаемые файлы, при необходимости также с помощью
-x
:Наконец, по мере необходимости, получите последние изменения:
источник
origin/master
@{upstream}
очень удобно и может использоваться в псевдонимах:alias resetthisbranch="git reset --hard @{upstream}"
git reset --hard
требует коммита, иначе он не будет знать, на что вас сбросить.@{u}
указывает на конкретный коммит - голову отслеживаемой ветви, с момента, когда вы в последний раз делали agit fetch
.git reset --hard
хотя он не будет сброшен в удаленную ветвьgit reset --hard "@{u}"
). Мне понадобилось время, чтобы понять это.git reset --hard HEAD
фактически сбрасывается только до последнего совершенного состояния. В этом случае HEAD означает HEAD вашей ветки.Если у вас есть несколько коммитов, это не сработает ..
То, что вы, вероятно, хотите сделать, - это сбросить на исходную точку или как называется ваш удаленный репозиторий. Я бы, наверное, просто сделал что-то вроде
Будьте осторожны, хотя. Жесткий сброс не может быть легко отменен. Лучше сделать, как предлагает Дэн, и перед сбросом отправьте копию своих изменений.
источник
Все вышеперечисленные предложения верны, но часто, чтобы действительно сбросить ваш проект, вам также нужно удалить даже файлы, которые есть в вашем
.gitignore
.Чтобы получить моральный эквивалент удаления каталога проекта и повторного клонирования с удаленного компьютера, выполните следующие действия .
Предупреждение :
git clean -x -d -f
это необратимое и вы можете потерять файлы и данные (например , вещи , которые вы игнорировали использование.gitignore
).источник
git clean -xdf
это равноgit clean -x -d -f
.Используйте команды ниже. Эти команды также удаляют все неотслеживаемые файлы из локального git
источник
git clean -d -f
у нас все еще были некоторые вещи старой ветки в локальном каталоге. Спасибо чувак.Вопрос смешивает два вопроса здесь:
git status
говоритnothing to commit, working directory clean.
Единый ответ:
git fetch --prune
(необязательно) Обновляет локальный снимок удаленного репо. Дальнейшие команды только локальные.git reset --hard @{upstream}
Помещает указатель локальной ветки туда, где находится снимок удаленного устройства, а также устанавливает индекс и рабочий каталог для файлов этого коммита.git clean -d --force
Удаляет неотслеживаемые файлы и каталоги, которые мешают git сказать «рабочий каталог чист».источник
@{upstream}
Синтаксис требует вверх по течению , чтобы быть множество , которое происходит по умолчанию , если вамgit checkout <branchname>
. - В противном случае замените его наorigin/<branchname>
.-x
чтобыgit clean
удалить все, что не входит в коммит (то есть даже файлы, игнорируемые механизмом .gitignore).С этим я регулярно сталкиваюсь, и я обобщил приведенный выше скрипт Вольфганга для работы с любой веткой.
Я также добавил приглашение «Вы уверены» и вывод обратной связи?
источник
При условии, что удаленный репозиторий есть
origin
, и что вас интересуетbranch_name
:Кроме того, вы идете для сброса текущей ветви
origin
вHEAD
.Как это работает:
git fetch origin
загружает последние с удаленного, не пытаясь объединить или перебазировать что-либо.Затем
git reset
сбрасывает<branch_name>
ветку к тому, что вы только что получили.--hard
Опция изменяет все файлы в вашем рабочем дереве , чтобы соответствовать файламorigin/branch_name
.источник
Я сделал:
полностью сбросить ветку
обратите внимание, вы должны оформить заказ в другую ветку, чтобы иметь возможность удалить нужную ветку
источник
Вот скрипт, который автоматизирует то, что предлагает самый популярный ответ ... См. Https://stackoverflow.com/a/13308579/1497139 для улучшенной версии, которая поддерживает ветви
источник
Если у вас была проблема со мной, что вы уже совершили некоторые изменения, но теперь, по любой причине, вы хотите от нее избавиться, самый быстрый способ - использовать
git reset
вот так:У меня было 2 не нужных коммита, отсюда и номер 2. Вы можете изменить его на свое количество коммитов для сброса.
Итак, отвечая на ваш вопрос - если вы на 5 коммитов опережаете заголовок удаленного хранилища, вам нужно выполнить следующую команду:
Обратите внимание, что вы потеряете внесенные изменения, поэтому будьте осторожны!
источник
Предыдущие ответы предполагают, что ветвь, которая будет сброшена, является текущей веткой (проверено). В комментариях OP hap497 пояснил, что ветка действительно проверена, но это не требуется явно в исходном вопросе. Поскольку существует хотя бы один «повторяющийся» вопрос, полностью сбросьте ветвь в состояние хранилища , что не предполагает, что ветвь извлечена, вот альтернатива:
Если ветвь "mybranch" в настоящее время не извлечена, чтобы сбросить ее до заголовка удаленной ветки "myremote / mybranch", вы можете использовать команду низкого уровня :
Этот метод оставляет проверенную ветку такой, какая она есть, и рабочее дерево нетронутым. Он просто перемещает голову mybranch на другой коммит, независимо от того, что указано в качестве второго аргумента. Это особенно полезно, если необходимо обновить несколько веток до новых удаленных голов.
При этом соблюдайте осторожность и используйте
gitk
или аналогичный инструмент для двойной проверки источника и назначения. Если вы случайно сделаете это в текущей ветке (и git не помешает вам), вы можете запутаться, потому что новое содержимое ветки не соответствует рабочему дереву, которое не изменилось (чтобы исправить, обновите ветку снова, туда, где это было раньше).источник
Это то, что я часто использую:
Обратите внимание , что это хорошая практика , чтобы не вносить изменения в свой местный мастер / развивать отрасль, но вместо того, чтобы фотографии на другую ветку для каких - либо изменений, с именем ветви предварённого по типу изменения, например
feat/
,chore/
,fix/
и т.д. Таким образом , вам нужно только тянуть изменения, а не выдвигать изменения от мастера. То же самое для других отраслей, которым способствуют другие. Таким образом, вышеприведенное следует использовать только в том случае, если вы зафиксировали изменения в ветке, в которую зафиксировали другие, и вам необходимо выполнить сброс. В противном случае в будущем избегайте нажатия на ветку, к которой другие подталкивают, вместо этого извлекайте и переходите к указанной ветке через извлеченную ветку.Если вы хотите сбросить свою локальную ветвь до последнего коммита в ветке upstream, у меня пока работает:
Проверьте свои пульты, убедитесь, что ваш апстрим и источник - это то, что вы ожидаете, если не так, как ожидалось, тогда используйте
git remote add upstream <insert URL>
, например, оригинальное репозиторий GitHub, с которого вы ответили, и / илиgit remote add origin <insert URL of the forked GitHub repo>
.В GitHub вы также можете извлекать ветку с тем же именем, что и у локальной, чтобы сохранить там работу, хотя в этом нет необходимости, если в origin development есть те же изменения, что и в локальной ветке сохраненной работы. Я использую ветвь разработки в качестве примера, но это может быть любое существующее имя ветки.
Затем, если вам нужно объединить эти изменения с другой веткой, когда возникают конфликты, сохраняя изменения в разработке, используйте:
Во время использования
чтобы сохранить конфликтующие изменения branch_name. В противном случае используйте mergetool с
git mergetool
.Со всеми изменениями вместе:
Обратите внимание, что вместо upstream / development вы могли бы использовать хеш коммита, другое имя ветки и т. Д. Используйте инструмент CLI, такой как Oh My Zsh, чтобы проверить, что ваша ветвь имеет зеленый цвет, указывая, что нет ничего для фиксации, а рабочий каталог чистый ( что подтверждается или также проверяется
git status
). Обратите внимание , что это может на самом деле добавить фиксации по сравнению с выше по течению развиваться , если есть что - то автоматически добавляет фиксацию, например , UML диаграммы, лицензионные заголовки и т.д., так что в этом случае, вы могли бы тянуть изменения на ,origin develop
чтобыupstream develop
, в случае необходимости.источник
Ответ
был недооценен ( -d для удаления каталогов). Спасибо!
источник
git clean -xdf
. Это удалит все файлы, которые git не знает, и сделает вашу папку точно совпадающей с тем, что находится в списке объектов git. Обратите внимание, что вы можете добавить-n
(напримерgit clean -nxdf
) выполнить «что-если», и он скажет вам, что он удалит, фактически ничего не делая. ( git clean )Если вы хотите вернуться в
HEAD
состояние как для рабочего каталога, так и для индекса, то вам лучшеgit reset --hard HEAD
вместо этогоHEAD^
. (Это может быть опечатка, точно так же, как для одиночного или двойного тире--hard
.)Что касается вашего конкретного вопроса относительно того, почему эти файлы появляются в статусе измененного, похоже, что вы сделали мягкий сброс вместо полного сброса. Это приведет к тому, что файлы, которые были изменены в
HEAD
коммите, будут выглядеть так, как если бы они были размещены, что, вероятно, то, что вы видите здесь.источник
Похоже, что никакие перезагрузки и очистки не оказали никакого влияния на неотслеживаемые и измененные файлы в моем локальном git-репо (я перепробовал все варианты выше). Мое единственное решение этого состояло в том, чтобы восстановить локальное хранилище и повторно клонировать его с пульта.
К счастью, у меня не было других ветвей, о которых я заботился.
xkcd: Git
источник
Единственное решение, которое работает во всех случаях, которые я видел, это удалить и откинуть. Может быть, есть другой путь, но, очевидно, этот путь не оставляет шансов на то, что старое государство останется там, поэтому я предпочитаю это. Bash one-liner вы можете установить как макрос, если вы часто путаетесь в git:
* предполагает, что ваши .git файлы не повреждены
источник
Вы забыли создать функциональную ветвь и по ошибке совершили прямой переход на мастер?
Теперь вы можете создать ветку компонентов и вернуть master обратно, не затрагивая рабочее дерево (локальную файловую систему), чтобы избежать запуска сборок, тестов и проблем с блокировками файлов:
источник
Только 3 команды сделают это
источник
Если вы не против сохранить свои локальные изменения, но все же хотите обновить свой репозиторий, чтобы он соответствовал origin / HEAD, вы можете просто сохранить свои локальные изменения и затем нажать:
источник