Як повернути початковий git?


357

Я вперше зобов'язуюсь до сховища git; Тоді я шкодую про скоєне і хочу повернути його. я спробую

# git reset --hard HEAD~1

Я отримую це повідомлення:

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.

Ця комісія є першою фіксацією сховища. Будь-яка ідея, як скасувати початковий прихильність git?

Відповіді:


565

Вам просто потрібно видалити гілку, на якій ви перебуваєте. Ви не можете використовувати, git branch -Dоскільки це перевірка безпеки щодо цього. Ви можете використовувати update-refдля цього.

git update-ref -d HEAD

Ви НЕ використовувати rm -rf .gitабо що - небудь подібне , так як це буде повністю знищити весь репозиторій , включаючи всі інші галузі, а також галузі , яку ви намагаєтеся скинути.


1
Спробував це, перебуваючи в базі даних, - хотів розділити першу фіксацію - тоді зробив git status, і на мій подив, сказав git fatal: Not a git repository (or any parent up to mount point ...)!
Метт Фенвік

1
це не спрацювало для мене. Створіть файли, включаючи такі, які слід ігнорувати, але ні .gitignore. git add ., git commit -m "initial commit", git update-ref -D HEAD, Створити .gitignore, повідомлення , що мерзотник все ще бачить файли, додані раніше , що слід ігнорувати. Іншими словами git update-ref -d HEAD, не повернув мене до держави до первинного вчинення.
gman

1
Але в цьому і полягає вихідний питання. Повернення до держави безпосередньо перед початковим зобов'язанням.
gman

2
git reset --hard HEAD~1видалить додані файли для всіх інших комітетів. Зрозуміло, що питання полягає в тому, як дійти до того ж стану, який працює в усіх інших випадках. Перегляньте цей суть для підтвердження того, що ваше рішення не працює gist.github.com/greggman/522fa69a21d6cfb3ff0b
gman

11
У випадку, якщо хтось заплутається у коментарях gman: git update-ref -d HEAD чи справді повертає початкове зобов’язання, але зберігає всі раніше скоєні зміни, додані до індексу. Якщо ви також хочете видалити ці зміни, просто виконайте такі дії git reset --hard. Навіть якщо вона неповна, ця відповідь справді найкраща, тому уникайте використання rm -fr .git(якщо ви не знаєте, що робите).
rsenna

62

Ви можете видалити HEAD і відновити сховище до нового стану, де ви зможете створити нову початкову комісію:

git update-ref -d HEAD

Після створення нового комітету, якщо ви вже натиснули на віддалений, вам потрібно буде примусити його до віддаленого, щоб перезаписати попередню початкову комісію:

git push --force origin

1
Варто зазначити ... це правильна команда, але вона не видаляє HEAD ... вона видаляє ref (розташований під .git \ refs \ heads), що перевірив файл .git \ HEAD. Після запуску цієї команди ви все ще можете знайти файл HEAD, який вказує на файл refs / heads / <name>, який ви видалили, але якщо ви дотримуєтесь цього шляху, ви побачите, що ref ref не існує більше.
DanK

15

Це питання було пов’язане з цим повідомленням у блозі, і було запропоновано альтернативне рішення для нових версій Git:

git branch -m master old_master
git checkout --orphan master
git branch -D old_master

Це рішення передбачає, що:

  1. У вас є лише одна комісія у вашому masterвідділенні
  2. Жодної гілки не називається, old_masterтому я вільний використовувати це ім'я

Він буде перейменовувати існуючу гілку в old_masterта створить нову, осиротілу гілку master (як це створено для нових сховищ), після якої ви можете вільно видалити old_master... чи ні. До вас.

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


11

За умов, передбачених питанням:

  • Команда - це перша комісія в сховищі.
  • Що означає, що було виконано дуже мало команд:
    • a git init,
    • імовірно, деякі git addоперації,
    • і a git commit,
    • і це все!

Якщо ці передумови будуть дотримані, то найпростішим способом скасувати початковий запис буде:

rm -fr .git

з каталогу, де ви це робили git init. Потім ви можете повторно git initвідновити репозиторій Git і повторно доповнити всі зміни, які ви не пошкодували про те, що ви не зробили перший раз, і повторити початкову комісію.

НЕБЕЗПЕЧНО! Це видаляє каталог сховища Git.

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

Це також безпечно зробити для видалення небажаного клонованого сховища; це не завдає шкоди сховищу, з якого його клонували. Він викидає все, що ви зробили зі своєю копією, але не впливає на оригінальний сховище в іншому випадку.

Будьте обережні, але це безпечно та ефективно, коли виконуються передумови.

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


9
Це погана порада. Що робити, якщо в репо є інші речі, які ви не хочете втрачати?
Метт Фенвік

5
Тоді це не буде початковим зобов'язанням, чи не так. Є лише одна початкова комісія.
Джонатан Леффлер

9
"Тоді це не було б початковим зобов'язанням" - насправді, так. Ви нехтуєте дуже поширеним випадком декількох гілок. Дивіться відповідь Чарльза.
Метт Фенвік

2
Однак корисно, але повинно бути попереджено.
Саймон Бенгтссон

5
Це насправді працює. Прийнята відповідь не відповідає. Дивіться коментар
gman


3

Я кину те, що працювало для мене, врешті-решт. Мені потрібно було видалити початковий комісій у сховищі, оскільки дані з карантину були заміщені, комісія вже була відхилена.

Переконайтеся, що ви зараз на правій гілці.

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

Це вдалося вирішити проблему.

Важливо

Це було у внутрішньому сховищі, яке не було загальнодоступним, якщо ваше сховище було загальнодоступним, будь ласка, припустіть, що все, що потрібно для відновлення, вже було знято кимось іншим.


1

Мені цікаво, чому "поправка" не передбачає, і це було закреслено @damkrat, оскільки поправка здається мені лише правильним способом вирішити найефективнішу проблему виправлення помилкової комісії, оскільки немає ніякої мети не мати початкового вчинити. Як підкреслювали деякі, ви повинні змінювати "публічну" гілку, як майстер, якщо ніхто не клонував ваш репо ...

git add <your different stuff>
git commit --amend --author="author name <author.name@email.com>"-m "new message"

- автор вимагається лише в тому випадку, якщо хтось виправить авторство комітету
Річард

0

git reset --важко внести зміни, потім зробіть

git add -A
git commit --amend --no-edit 

або

git add -A
git commit --amend -m "commit_message"

і потім

git push origin master --force

--force перепише цю команду, яку ви перезаписали на першому кроці.

Не робіть цього, тому що ви збираєтеся суперечити всій ідеї систем VCS та зокрема git. Єдиний хороший метод - створити нову та видалити непотрібну гілку. Дивіться git help branchінформацію.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.