Як видалити перший комікт в git?


179

Мені цікаво, як зняти першу фіксацію в git.

Що таке перегляд перед вчиненням будь-якої речі? Чи має ця редакція ім'я чи тег?


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

@Shahbaz Так, це найкращий спосіб, дивіться тут наприклад: ariejan.net/2011/07/05/git-squash-your-latests-commiss-into-one
timaschew

5
Можна використовувати git rebase -i --root. Дивіться наступний SO відповідь Подробиці: stackoverflow.com/questions/2246208 / ...
MKroehnert


Ця відповідь має правильне рішення для видалення кореневого комітету поточної гілки:git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD
Джоді Брюшон

Відповіді:


320

Для мене найбільш безпечним способом є використання update-refкоманди:

git update-ref -d HEAD

Це видалить названу посилання HEAD, тож вона скине (м'яко, ви не втратите роботу) всі ваші зобов’язання поточної галузі .

Якщо ви хочете об'єднати першу команду з другою, ви можете скористатися rebaseкомандою:

git rebase -i --root

Останнім способом може стати створення осиротілої гілки, гілки з тим самим вмістом, але без будь-якої історії фіксації, та введення нового вмісту в неї:

git checkout --orphan <new-branch-name>

7
Дуже погано, що це не прийнята відповідь. Це також занадто погано, що більшість звернень у Google більш-менш говорять, що "ви не можете скасувати перше виконання". Це зробило для мене трюк. Дякую!
danielpops

1
Дякуємо @danielpops за вашу підтримку! Добре помітити, що я відповів на це запитання через 3 роки. Гіт тим часом озвався.
tzi

Я скористався базою даних, позначив другу команду як "сквош", а потім зробив - примусовий натиск на початок. Дякую!
Філіп Атц

1
git update-ref -d HEAD - це найбезпечніший спосіб видалити всю історію, а не лише початкову комісію.
користувач1767316

Я це зробив, і він видалив усі мої файли, які я додав до першого комітету. Сумно. Принаймні, це було не так багато
В’ячеслав Цівіна

42

Перед першим вчиненням нічого немає, оскільки кожне зобов’язання посилається на батьківське зобов'язання. Це робить перший вчинення особливим (сирітський вчинок), тому немає ніякого способу посилання на попередній "стан".

Отже, якщо ви хочете виправити комісію, ви можете просто git commit --amend: це змінить комісію, не створюючи іншого.

Якщо ви просто хочете почати все спочатку, видаліть .gitсховище та зробіть ще один ізgit init


7
Ця відповідь є невірною: існує спосіб повернення до стану до першого введення. Дивіться відповідь ци нижче.
Девід Нельсон

2
--amendТакож не буде оновлювати автор правильно , якщо він спочатку був неправильно налаштований. Ось що мені було потрібно, тому я використав прийняту відповідь, а потім просто зробив нове зобов’язання замість цього.
Марк Едінгтон

11
# Check out to a temporary branch:
git checkout --orphan TEMP_BRANCH

# Add all the files:
git add -A

# Commit the changes:
git commit -am "Initial commit"

# Delete the old branch:
git branch -D master

# Rename the temporary branch to master:
git branch -m master

# Finally, force update to our repository:
git push -f origin master

3
Не відповідь: Питання полягало в тому, як "видалити першу фіксацію", а не "як видалити все, крім останнього".
петерх

1
Я шукав саме це. Дякую!
Кшиштоф Томашевський

6

Ви можете просто відредагувати свою першу комісію (оскільки у git repo завжди є перша фіксація). Подумайте про використання git commit --amend --reset-authorзамість звичного git commit --amend.


1
Не відповідь: запитанням хотілося видалити перший фіксатор, а не змінювати властивості останнього.
peterh

@ peterh-ReinstateMonica Для уточнення: Коміти можна змінювати під час інтерактивної бази, щоб повністю змінити їхній вміст, але - потрібно змінити автора також для зміни автора. З цим ви можете повністю замінити перше зобов’язання на свій смак. Дивіться також відповідь CharlesB.
Макс Бейкірх

3

Я шукав спосіб скасувати всі git-файли від репо, як ніколи не бували.

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

Жодна з цих відповідей зовсім не вирішила мене. Але після багатьох пошуків та спроб та помилок я виявив, що це працює!

git update-ref -d HEAD
git push origin master -f

Сподіваюся, це вам допоможе. Гарного дня.


1
Щоб було зрозуміло для кожного, хто читає цю відповідь: це видаляє кожне зобов’язання, але ОП хоче лише видалити перше зобов’язання, зроблене репо; не запускайте це, щоб видалити першу комісію, оскільки вона видалить ВСІ коміти.
Джоді Брюшон

2

Ще один спосіб зробити це:

  1. Оформити замовлення на відділення, яке ви хочете зберегти (скажімо, dev) git checkout dev
  2. Тепер видаліть гілку, яку потрібно скинути git branch -D master
  3. Тепер створіть порожню гілку з такою ж назвою git checkout --orphan master

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


3
Після цього вам доведеться видалити гілку віддалено перед натисканням. Інакше при спробі натиснути ви отримаєте цю помилку:! [відхилено] master -> master (не швидкий перехід вперед) - помилка: не вдалося надіслати деякі відхилення на 'git@github.com: r1 / r2.git' - підказка: Оновлення відхилено, оскільки підказка вашої поточної гілки позаду - підказка: його віддалений аналог. Інтегруйте віддалені зміни (наприклад, підказка: 'git pull ...'), перш ніж натискати знову ... - Якщо ви зробите git, усі коміти повернуться.
dxvargas

2

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

cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster

Це створює newmasterгілку в старому сховищі з історією, яка не є загальною для жодної з інших гілок. Звичайно, ви можете просто перезаписати masterа також, з git push -f.

Якщо ви хочете знищити всі гілки та весь існуючий вміст, просто запустіть

rm -rf .git/

1
Не відповідь: ОП хотіла зняти першу команду, а не запускати нову git repo з поточним робочим деревом як початковою командою.
peterh

@peterh Я згоден git rebase --root- це, мабуть, те, що хотіла ОП, але, враховуючи, що ця відповідь має два обґрунтування, я утримаюсь від її видалення, якщо хтось все-таки вважатиме її актуальною.
user1338062

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

0

Якщо ви тільки що зробили це, але не натиснули його, тоді просто видаліть .git каталог і git initзнову ...


@peterh Так. Ви припускаєте (я думаю), що питання ОП полягає у бажанні видалити перше зобов'язання, але зберігати наступні зобов'язання. Іншою можливістю (яка, на мою думку, ідеально відповідає на питання ОП - і на яку ця відповідь є відповіддю) - це хочуть видалити перше і лише виконувати зобов'язання з гілки, повернувши його до повного спорожнення.
MikeBeaton

@MikeBeaton Ви маєте рацію. Я видаляю свій коментар, але тоді мені потрібно проголосувати, щоб закрити питання як незрозуміле. Зауважте, хоча тільки я зробив цей коментар, але позаду мене 40000 відвідувачів, і значна частина з них знайшла це запитання в google - і вони не отримали те, що хотіли.
петерх

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

0

Відповідь на питання залежить від того:

  • Ви хочете видалити перше І ТІЛЬКО зафіксувати на гілці (поки залишаєте інші гілки такими, якими вони були), або чи

  • Ви хочете видалити першу комісію на якійсь гілці, а "залишити на місці" наступні коміти (та інші гілки).

Друга з них порівняно простіша. По суті, ви повинні перезавантажитись на root - більшість відповідей тут стосується способів цього зробити.

Зробити друге (видалити перше і зробити лише фіксацію з гілки, поки інші гілки залишити в спокої) складніше. Або, принаймні, особливо важче, якщо ви хочете, щоб це сталося і щоб зміна була відображена назад у GitHub або Bitbucket. У Git (наскільки я можу сказати) взагалі немає способу натиснути або змусити натиснути гілку без жодних зобов'язань. І також (наскільки я бачу) взагалі немає способу створити нову, порожню гілку без жодних комісій на ні в GitHub, ні в Bitbucket. Таким чином, вам потрібно створити нове сховище, щоб створити повністю порожню гілку, а потім додати назад гілки, які ви хочете (включаючи комітети, які ви хочете) - відповідно до відповіді @ user1338062.

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

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