Как я могу сбросить репозиторий Git в его недавно клонированное состояние? - PullRequest
0 голосов
/ 25 октября 2018

Есть ли оператор git, который имеет тот же результат, что и свежий клон git?

Так что, даже если есть дополнительные ветви, дополнительные файлы, другие файлы, локальные теги, что угодно ... какая команда может выполнить это

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

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

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

          D - F [feature]
         /
A - B - C [origin/master]
         \
          G - H [master]

Вы можете получить очень похожий вид с git log --graph --decorate --all, хотя это будет сбоку.

Вы внесли некоторые изменения в оба masterи новая ветвь с именем feature.У вас уже есть чистые версии удаленной работы.origin/master отслеживает удаленную работу на удаленной ветви master.

Это не обновляется автоматически.Вы можете обновить его и все другие удаленные ветви отслеживания с помощью git fetch -p (-p удалит все старые удаленные ветви).

git fetch -p

          D - F [feature]
         /
A - B - C - I - J - K [origin/master]
         \
          G - H [master]

Теперь, когда ваш origin/master обновлен, вы можете посмотретьв ней, как и в любой другой ветке, можно посмотреть последние работы.

Вы можете обновить любую другую локальную ветку с помощью последних изменений с помощью git rebase origin/master.Это воспроизведет любые локальные изменения поверх origin/master.Например, чтобы обновить ветку feature ...

git checkout feature
git rebase origin/master

                      D1 - F1 [feature]
                     /
A - B - C - I - J - K [origin/master]
         \
          G - H [master]

Или, если ветка вас больше не интересует, вы можете удалить ее.

git branch -D feature

A - B - C - I - J - K [origin/master]
         \
          G - H [master]

Наконецесли вы просто хотите выбросить свои изменения на master, используйте git reset --hard, чтобы заставить master перейти на origin/master.

git checkout master
git reset --hard origin/master

                      D1 - F1 [feature]
                     /
A - B - C - I - J - K [origin/master]
                      [master]

И теперь вы в курсе.


Чтобы ответить на вопрос о стирании репозитория ...

Репозитории Git, как правило, очень малы (если их нет, это вызовет другие проблемы).Предполагая, что у вас есть приличное сетевое соединение, самое простое, чтобы гарантировать действительно чистый сброс, это клонировать его снова.

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

клонируйте свой существующий клон и очистите его локальные ветви и теги.Это гарантирует, что такие вещи, как .git/hooks и .git/config будут сброшены.

Сначала клонируйте локальное грязное хранилище.

git clone /path/to/the/dirty/repo /path/to/the/new/new_repo
cd /path/to/the/new/new_repo

Затем удалите все локальные ветви и теги.

Git не позволит вам удалить текущую ветку, поэтому проверьте origin/master, исходную версию master.

git checkout origin/master

Получите все ваши локальные ветви и удалите их.

git for-each-ref --format '%(refname:short)' refs/heads

Получите все ваши локальные теги и удалите их.

git for-each-ref --format '%(refname:short)' refs/tags | xargs git tag -d

Создайте новый локальный master из origin/master и проверьте его.

git checkout -b master origin/master

Установите свойПроисхождение должно быть исходным хранилищем.Вы можете получить это из git remote -v в грязном хранилище.

git remote set-url origin <original origin url>

Наконец, выполните git pull, чтобы получить последнюю версию восходящего хранилища, его веток и обновить master.

git pull

Как видите, проще разложить существующий клон в саду.

0 голосов
/ 26 октября 2018

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

git clone --reference existing-clone -dissociate URL new-clone
0 голосов
/ 25 октября 2018

Лучшим вариантом для удаления всех локальных артефактов является создание нового клона .

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

Чтобы избавиться от всех неотслеживаемых файлов, используйте git clean с любым количеством включенных флагов, чтобы уничтожить все:

git clean -fd

Теперь положите все свои ветви наудаленную версию (git reset) или удалите их, если они только локальные (git branch):

git checkout master
git reset --hard origin/master

git branch -d local-branch

То же самое касается тегов.Вы можете удалить все локальные теги следующим образом:

git tag -d $(git tag -l)

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

Как видите, git clone гораздо более простой вариант.

...