Питання Скинути локальну гілку сховища як таку, як віддалене сховище HEAD


Як скинути локальну гілку, щоб вона була подібною до гілки у віддаленому сховищі?

Я зробив:

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

Чи можете ви, будь ласка, сказати мені, чому я їх "модифікую"? Я не торкнувся цих файлів? Якщо я це зробив, я хочу вилучити їх.


2524
2017-10-27 00:27


походження


За даними випуску git status твоя друга команда git reset --hard HEAD не вдалося Однак ви не вставляли його в вивід. → Неповне питання. - Robert Siemer
Тут ми змішуємо два питання: 1) як скинути локальну гілку до точки, де знаходиться пульт дистанційного керування, і 2) як очистити область обробки (і, можливо, робочу директорію), щоб git statusкаже nothing to commit, working directory clean. - Будь ласка уточніть! - Robert Siemer
@ Роберт Сімер Це саме те, що я хочу. Як скинути мій місцевий репо, щоб бути таким, як останній фікс на віддаленому репо, але я також хочу очистити моє місцеве репо, не хочу, щоб зміни, які я маю зараз, не знаходяться в віддаленому репо. Я просто хочу, щоб моя локальна репо була точно така ж, як на пульті дистанційного керування. Чи можете ви сказати мені, як це зробити? - Alex Ventura


Відповіді:


Встановлення гілки точно відповідає віддаленій галузі може бути виконане у два етапи:

git fetch origin
git reset --hard origin/master

Якщо ви хочете зберегти стан поточної гілки перед тим, як це зробити (у всякому разі), ви можете зробити це:

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

Тепер ваша робота зберігається в розділі "my-saved-work", якщо ви вирішите, що ви хочете його повернути (або хочете подивитися на це пізніше або порівняти його з вашою оновленою гілкою).

Зауважте, що в першому прикладі передбачається, що ім'я віддаленого репо є "походженням" і що гілка, названа "master" у віддаленому репо, відповідає поточній відібраній гілці у вашому місцевому репо.

До речі, така ситуація, в якій ви знаходитесь, виглядає дуже жахливо, подібно до загальної ситуації, коли було здійснено натискання у поточну вилучену гілку небулочного сховища. Ви нещодавно просунули місцеву репо? Якщо ні, то не хвилюйтеся - щось інше, можливо, несподівано призвело до зміни цих файлів. В іншому випадку, ви повинні знати, що не рекомендується вставляти в нерозбитий репозиторій (а не в поточну вилучену гілку).


4473
2017-10-27 01:44



Спасибі за вашу відповідь. Ви сказали: "Зауважте, що на першому прикладі передбачається, що ім'я віддаленого репо є" походженням "і що філія" master "у віддаленому репо відповідає гілці у вашому місцевому репо". Як я можу перевірити моє віддалене ім'я репо та назву своєї філії, щоб переконатися, перш ніж виконувати команду 'git resethard'? Знову дякую. - hap497
Якщо ви не називаєте пульт дистанційним явно, то його назва, ймовірно, просто "походження" (за замовчуванням). Ви можете використовувати "git remote" для отримання списку всіх віддалених імен. Потім ви можете використовувати "git remote <name>", щоб побачити, які філіали штовхають / тягнуть один з одним (наприклад, якщо ваша "master" гілка була клонована з "master" у віддаленому імені "origin", то ви отримаєте лінію що "майстер зливається з віддаленим майстром"). - Dan Moulding
"не рекомендується вводити в нерозбитий репозиторій (а не в поточну перевірену гілку, зокрема" Чому це? " - LeeGee
Одразу після отримання, я вірю, що можете зробити це git reset FETCH_HEAD --hard Натомість це теж саме значення. - Jean
Дуже погано, я можу лише одухотворити це раз. Я прийшов до такої точної відповіді, як 20 разів. Напевно, більше. - frosty


Мені потрібно було (рішення в прийнятій відповіді):

git fetch origin
git reset --hard origin/master

Слідом за:

git clean -f

видалити локальні файли

Щоб побачити, які файли будуть видалені (без їх фактичного видалення):

git clean -n -f

250
2017-12-27 06:20



також git clean -d -f якщо присутні невідслідувані каталоги. - garg
також git clean -fdx - Swapnil Kotwal
Якщо вам потрібна точна копія віддаленої гілки, вам слід дотримуватися git clean -ffdx. Зауважте, що є два ф. - Trismegistos
The git clean -f був найважливішою частиною, яку я потребував. Дякую! - dgo
будьте обережні, використовуючи чисту команду. він може видалити ігноровані файли з інших гілок. - mikoop


По-перше, скинути на попередньо отримані HEAD відповідної гілки верхів'я:

git reset --hard @{u}

Перевага уточнення @{u} або його докладна форма @{upstream} це те, що ім'я віддаленого репо та філії не потрібно чітко вказати.

Далі, за потреби, видаліть не відстежені файли, за бажанням також і з -x:

git clean -df

Нарешті, за потреби, отримуйте останні зміни:

git pull

119
2018-02-10 20:27



Це, здається, краща відповідь, ніж прийнята, оскільки вона динамічно скидає поточну гілку, а не завжди статичну, таку як origin/master - Jon z


git reset --hard HEAD фактично скидає лише останню вчинену державу. У цьому випадку HEAD відноситься до HEAD вашої галузі.

Якщо у вас кілька команд, це не спрацює ..

Те, що ви, мабуть, хочете зробити, це скинути на голову походження або те, що ви називаєте віддаленим сховищем. Я, мабуть, просто зробив щось на зразок

git reset --hard origin/HEAD

Будьте обережні, однак. Жорсткі скидання неможливо легко відновити. Краще робити, як пропонує Ден, і відокремити копію ваших змін до скидання.


91
2017-10-27 01:08



У моїй відповіді була помилкова пропозиція, яку Дан знайшов раніше. Я відредагував його, тому що я не хочу когось збити з ладу. Що стосується матеріалу origin / master або origin / HEAD, я сподіваюсь, що це залежить від того, чи дійсно ви насправді робите вибір. Якщо ви просто клонули походження, і у нього не було інших гілок, які, як я вважаю, досить поширені, то це слід відновити. Але, звичайно, Ден правий. - Mikael Ohlson


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

Щоб отримати моральний еквівалент стирання каталогу вашого проекту та повторне клонування з пульта дистанційного керування:

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

УВАГА: git clean -x -d -f є незворотний і ви можете втратити файли та дані (наприклад, те, що ви проігнорували, використовуючи .gitignore)


57
2017-07-23 17:48



Попередження: "git clean -x -d -f" незворотний, і ви можете втратити файли та дані в .gitignore - Akarsh Satija
найкраща відповідь; Дякую. - Bob Baxley


Питання поєднує два питання тут:

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

Один-стоп-відповідь:

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

29
2018-01-31 01:29



The @{upstream} Синтаксис вимагає встановлення поточного потоку, який відбувається за замовчуванням, якщо ви git checkout <branchname>. - Інакше замінити його origin/<branchname>. - Robert Siemer
Додати -x до git clean щоб видалити все, що не входить до фіксації (тобто навіть файли, проігноровані механізмом .gitignore). - Robert Siemer


Це те, що я регулярно стикаюся, і я узагальнив скрипт Вольфганга, викладений вище, для роботи з будь-якою гілкою

Я також додав "Ви впевнені" підказки та деякий відгук виходу

#!/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
2017-11-09 13:01



ви можете використати "git remote", щоб отримати назву пульта дистанційного керування. У певних випадках це не буде "походженням" - Yurik


Ось скрипт, який автоматизує те, що пропонує найпопулярніша відповідь ... Побачити https://stackoverflow.com/a/13308579/1497139 для покращеної версії, яка підтримує гілки

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see https://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"`
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
2017-10-15 08:50