Як користуватися Git Revert


107

Як git revertзастосовується?

Це може здатися повторюваним запитанням, але коли люди задають його, відповідь часто, використовуйте git resetвідповідно до Повернення до зобов'язання хешем SHA в Git?

Потім, коли хтось запитує, як користуватися git resetлюдьми, відповідають, говорячи, що ви повинні використовувати git revertвідповідно до Git - як відкатати

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

Тож давайте спробуємо дотримуватися короткого запису та написати довідник для манекенів git revert.

Сценарій: ви двічі взяли на себе майстер і його поганого. Ви підштовхнули та інші люди змінили свої погані зміни

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

Це те, що стосується управління джерелами. Я впевнений, що це легко.

Гаразд, ти збираєшся використовувати, git revertале як?

А після бігу git revertчи потрібно ще щось робити? Чи доводиться вам вносити зміни, які були здійснені, або повернення безпосередньо здійснює репо або щось ??

Очевидно, що вам потрібно буде натиснути ще раз і, ймовірно, оголосити свої м'ячі команді.

Відповіді:


119

git revert робить нове зобов’язання

git revert просто створює новий комітет, протилежний існуючому.

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

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

У цьому прикладі історія фіксування має два коміти, а останній - помилка. Використання відновлення git:

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

У журналі буде 3 коміти:

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

Отже, є послідовна історія того, що сталося, але файли начебто поганого оновлення ніколи не відбувалися:

cat README.md 
Initial text

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

Закривальні запитання

вам доведеться робити щось інше після?

A git revert- це ще одна фіксація, тому, наприклад, натисніть на пульт, щоб інші користувачі могли витягнути / взяти / об'єднати зміни, і ви закінчите.

Чи потрібно здійснити зміни, які були здійснені, чи повернення безпосередньо здійснюється до репо?

git revert є фіксація - немає зайвих кроків, які б припускали, що повернення однієї комісії - це те, що ви хотіли зробити.

Очевидно, що вам потрібно буде знову натиснути і, ймовірно, оголосити команду.

Дійсно - якщо пульт дистанційного управління перебуває у нестабільному стані, - правильно повідомити решті команди, що їх потрібно витягнути, щоб отримати виправлення (повернення, що повертається) :).


Для підтвердження, як до першого заяви тут, так і до тих, хто цікавиться тим же, що я просто замислився про те, як це працює, ви можете повернути відновлення, де є кілька нових комітетів з моменту повернення, яке ви переглядаєте. Тож повернення справді - це лише вчинення, протилежне відверненому. У вас, звичайно, можуть виникнути конфлікти ... але це вже інша історія.
GG2

Я завжди вважаю, що краще уникати з цим зобов’язань, просто спочатку переглянути зміни, які я використовую, git revert -n <commitToRevet> або git revert --no-commit <commitToRevet>
Eklavyaa

2
Просто хотів сказати, що через роки, коли я перебуваю у стаковому потоці, я думаю, що це може бути однією з найкращих відповідей, з якими я коли-небудь стикався. Чудовий приклад та пояснення. Дякую.
user3344977

Я потрапив сюди, очікуючи отримати більше інформації, щось на зразок TLDR цього raw.githubusercontent.com/git/git/master/Documentation/howto/…
wviana

1
@wviana Якщо знайдена вами інформація недостатня, напишіть відповідь. Зауважте, що переповнення стека не замінює офіційну документацію (на яку, здається, ви посилаєтесь, і охоплює набагато ширший обсяг, ніж це питання).
AD7six

35

Використовуйте відновлення git так:

git revert <insert bad commit hash here>

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

Етапи після є такими ж, як і будь-які інші дії.


Різниця між "повернути команду" та "повернути до комісії" є достатньо тонкою, що я боровся з цією командою роками. Ваше пояснення вирішило це для мене миттєво. Дякую!
клавіска

24

Причина resetі, revertяк правило, часто зустрічаються в одних і тих же розмовах, тому що різні системи управління версіями використовують їх для позначення різних речей.

Зокрема, люди, які звикли до SVN або P4, які хочуть викинути невідомі зміни до файлу, часто звертаються revertдо того, як їм скажуть, що вони насправді хочуть reset.

Аналогічно, revertеквівалент в інших VCSes часто називають rollbackчи чимось подібним - але "відкат" також може означати "я хочу повністю відкинути останні кілька комісій", що підходить, resetале ні revert. Отже, існує велика плутанина, коли люди знають, що хочуть робити, але не зрозуміло, яку команду вони повинні використовувати для цього.

Що стосується ваших актуальних питань щодо повернення ...

Гаразд, ти будеш використовувати git revert але як?

git revert first-bad-commit..last-bad-commit

А після запуску git revert вам потрібно зробити щось інше після? Чи доводиться вам вносити зміни, які були здійснені, або повернення безпосередньо здійснює репо або щось ??

За замовчуванням git revertзапрошує повідомлення про фіксацію, а потім виконує результати. Це можна відмінити. Я цитую чоловічу сторінку :

--edit

За допомогою цієї опції git revert дозволить вам редагувати повідомлення про фіксацію до того, як здійснити відновлення. Це за замовчуванням, якщо ви запускаєте команду з терміналу.

- не вчиняти

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

Це корисно при поверненні ефекту до вашого індексу декілька послідовно.

Зокрема, за замовчуванням це створює нову комісію для кожного комітету, який ви скасовуєте. Ви можете використовувати revert --no-commitдля створення змін, що повертають їх усі, не вводячи ці зміни як окремі зобов'язання, а потім здійснювати їх у вільний час.


git revert first-bad-commit..last-bad-commit: Я думаю, що це має бути git revert parent-of-first-bad-commit..last-bad-commit.
користувач1071847

9

Питання досить старе, але повернення все ще бентежить людей (як я)

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

  • git revertпотрібен ідентифікатор комітету, який ви хочете видалити, зберігаючи його в історії

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

Тобто, якщо ви будете використовувати revertз першим ідентифікатором фіксації, ви опинитесь у порожній папці та додатковому фіксації в історії, тоді як із скиданням ваш каталог буде повернутий до початкової фіксації, і ваша історія стане так, ніби останніх зобов'язань ніколи не відбулося.

Щоб бути ще більш зрозумілим, з таким журналом:

# git log --oneline

cb76ee4 wrong
01b56c6 test
2e407ce first commit

Використовуючи git revert cb76ee4волю за замовчуванням принести свої файли назад в 01b56c6 і додасть ще зробити свою історію:

8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit

git reset 01b56c6 замість цього поверне ваші файли до 01b56c6 і очистить будь-які інші комісії після цього з вашої історії:

01b56c6 test
2e407ce first commit

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


Я спостерігав те саме. це дійсно заплутано, але так важливо знати. зовсім недавно мені довелося допомогти колезі і забув про це. Це було трохи бентежно.
ExOfDe

1

Я повернув назад кілька комітетів, запустивши "git revert commit id", наприклад:

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

Тоді мені було запропоновано здійснити відновлення (так само, як це було б під час виконання "git commit"). Моя термінальна програма за замовчуванням - Vim, і я побіг:

:wq 

Нарешті я пересунув зміни до сховища за допомогою:

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