Як я можу повернути 1 комітку?


127

У мене є 2 коміти, які я не натискав:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

Як я можу відкатати свою першу (найстарішу), а зберегти другу?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Звідси:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

Мені просто потрібно робити:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Це?


3
Це питання видається поза темою, оскільки йдеться про інструмент програмування. Він належить до Stack Overflow.
Пітер Мортенсен

@PeterMortensen Погодився. Це стосується
SuperUser

Відповіді:


95

Найбезпечніший і, мабуть, найчистіший шлях - це інтерактивна база даних.

git rebase -i HEAD^^

Або,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

Звідти ви можете робити скріш-коміти, що об'єднує один чи більше об'єктів у попередній коміт. Щоб повністю видалити комісію з історії, видаліть рядок зі списку.

Ви можете скасувати комісію, git revertале вона додасть більше повідомлень про фіксацію в історію, що може бути небажаним. Використовуйте -nпараметр, щоб сказати Git не здійснювати відновлення відразу. Ви можете робити інтерактивну базу даних і розминати їх на попередній комітет, щоб все було в чистоті.

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

Скидання сховища git reset --hardслід робити обережно, оскільки його не можна скасувати.

Переписування історії слід робити обережно.


Як я можу видалити комісію під час 'git rebase'? Існує лише 3 команди: підбирати, редагувати, сквош. Видалення AFAIK не існує.
n179911

8
повністю видаліть рядок зі списку, і він видаляє цю
команду

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

"Найбезпечніший і, мабуть, найпростіший шлях - це інтерактивна перезавантаження" Можливо, ні, якщо ви не використовуєте vim. Мені пощастило і зрозумів, як вийти з цього безладу. Проблема все ще є, тому що я повинен навчитися vim :-)
isimmons

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

52

Це якщо з http://nakkaya.com/2009/09/24/git-delete-last-commit/, і це працювало для мене

Git Видалити останній комітет

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

Якщо ви вчинили мотлох, але не натиснуті,

git reset --hard HEAD~1

HEAD ~ 1 - це скорочення для виконання перед головою. Крім того, ви можете звернутися до SHA-1 хешу, на який потрібно скинути. Зауважте, що при використанні --визначає будь-які зміни відслідковуваних файлів у робочому дереві з моменту втрати фіксації перед головою.

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

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

git revert HEAD

Це створить нове зобов’язання, яке скасовує все, що введено випадковим комітетом.


2
З опцією --soft він ідеально підходить для того, де ви перейменовуєте файл і випадково "git commit -a", а не спочатку використовуєте "git add".
Аарон Харун

8

Ні. git-reset - твердий поверне вас в історію. Те, що ви шукаєте, - це відновлення git, яке скасує будь-які дії.


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

6

Я щойно зробив це:

git rebase -i HEAD^^

Я це накрутив, так і зробив

git rebase --abort

Потім зробили це знову. Тоді мені довелося натиснути так:

git push origin master -f

І це зруйнувало комісії новіші, ніж зобов'язання, на яке я відкотився. Працювали чудово.


4

Ні, git reset --hard baf8d5eбуде видалено команду, 3368e1cі HEAD буде baf8d5eзгодом.

Якщо ви хочете зберегти 3368e1cфіксацію та видалити bad8d5eфіксацію, найпростіше рішення зробити " git rebase -i HEAD~2" (тобто інтерактивне відновлення останніх двох комітів). Ця команда запустить ваш редактор повідомлень про фіксацію, і ви побачите один рядок для кожного з останніх двох комітетів. Там ви просто видалите bad8d5eрядок фіксації та збережіть. git перепише вашу історію і 2-й комітет не буде.

Є й інші корисні команди , які можна використовувати в редакторі повідомлень , як squash, editі т.д. Інтерактивний перебазуватися є дуже потужним!

Не робіть цього, якщо хтось уже бачив ці зобов’язання (натисніть або витягніть з вашого сховища)!



1
git reset --hard {ref}

- це єдиний спосіб скасувати комісію, якщо в репо є лише одна інша фіксація (наприклад, початкова передача та ще 1). Решта способів (повернути, відновлювати) відмовляються працювати, принаймні, як від git 1.7.5.1.

Якщо ви будете слідувати git resetз git gcтодішнім мерзотником буде фактично видалити старий передати дані з репо повністю.


1
git checkout <treeish> -- /path/to/dir

Це поверне каталог із заданого "деревного" для / path / to / dir


0

Це я працюю, вручну редагуючи хеш-коди останніх комітів з файлів HEAD у папці репозиторію:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

До цього мені ніколи не вдалося підштовхнути до початку операцій ЮНМЕРЖ, які я робив на місцевому рівні. Продовжували говорити, що "не вдалося надіслати деякі відгуки" до Центрального сховища.

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