З огляду на зміну, яку було здійснено за допомогою commit
, а потім було повернено за допомогою revert
, який найкращий спосіб скасувати це відновлення?
В ідеалі це слід зробити з новим зобов’язанням, щоб не переписувати історію.
З огляду на зміну, яку було здійснено за допомогою commit
, а потім було повернено за допомогою revert
, який найкращий спосіб скасувати це відновлення?
В ідеалі це слід зробити з новим зобов’язанням, щоб не переписувати історію.
Відповіді:
Якщо ви ще не натиснули цю зміну, git reset --hard HEAD^
В іншому випадку повернення ревертування ідеально добре.
Інший спосіб - це git checkout HEAD^^ -- .
і тоді git add -A && git commit
.
git cherry-pick
або, як альтернатива git revert
, це найбільш прямі способи повернення реверсу.
Otherwise, reverting the revert is perfectly fine.
, а потім також пояснити, що git checkout HEAD^^ -- .
робиться.
git add -A
... якщо ви не хочете додати кожен файл до контролю версій, що, швидше за все, не є тим, що ви хочете.
git cherry-pick <original commit sha>
Зробить копію оригіналу зобов’язання, по суті повторно застосувавши зобов’язання
Повернення відновлення зробить те ж саме, з повідомленням messier commit:
git revert <commit sha of the revert>
Будь-який із цих способів дозволить вам git push
не перезаписувати історію, оскільки це створює нове зобов’язання після відновлення.
Вводячи команду sha, вам зазвичай потрібні лише перші 5 або 6 символів:
git cherry-pick 6bfabc
Повторне виконання так само, як і будь-яке інше в git. Це означає, що ви можете повернути його, як у:
git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746
Це, очевидно, має сенс лише після того, як зміни були натиснуті, і особливо, коли ви не можете змусити натиснути на цільову гілку (що є хорошою ідеєю для вашої ведучої гілки). Якщо зміна не була застосована, просто зробіть вишню, скасуйте або просто видаліть комісію для відновлення відповідно до інших публікацій.
У нашій команді у нас є правило використовувати повернення до повернення комітетів, які були здійснені в головній галузі, насамперед, щоб зберегти історію в чистоті, щоб ви могли бачити, який виклик скасовує, що:
7963f4b2a9d Revert "Revert "OD-9033 parallel reporting configuration"
"This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
...
a0e5e86d3b6 Revert "OD-9055 paralel reporting configuration"
This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
...
Merge pull request parallel_reporting_dbs to master* commit
'648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'
Таким чином, ви можете простежити історію і розібратися з цілою історією, і навіть ті, хто не знає спадщини, могли б розробити це для себе. Тоді як, якщо ви збираєте вишні або обновлюєте речі, ця цінна інформація втрачається (якщо ви не включите її до коментаря).
Очевидно, якщо комісія повертається та повертається не раз, то це стає досить безладним.
Повернення відновлення виконає трюк
Наприклад,
Якщо abcdef
ваша фіксація і ghijkl
це зобов'язання, яке ви мали, коли ви скасували комісію abcdef
, виконайте:
git revert ghijkl
Це відновить відновлення
Мені це виглядає дурно. Але я опинився в тій же ситуації, і я повернувся за скасовані зобов'язання. Я зробив кількість ревертів, тому мені довелося робити повернення для кожного "повернення".
Тепер моя історія подій трохи дивно виглядає.
Це проект для домашніх тварин, так що це нормально. Але для проекту в реальному житті я б віддав перевагу перейти до останньої фіксації перед поверненим відновленням всього поверненого коду разом в один комітет і більш розумний коментар.
Ось як я це зробив:
якщо гілка my_branchname
була включена в об'єднання, яке було повернене. І я хотів скасувати ревертування my_branchname
:
Я спочатку роблю git checkout -b my_new_branchname
з my_branchname
.
Тоді я роблю, git reset --soft $COMMIT_HASH
де $COMMIT_HASH
є хеш на виконання прямого зобов’язання перед першим фіксуванням my_branchname
(див. git log
)
Потім я роблю нове зобов’язання. git commit -m "Add back reverted changes"
Потім я натискаю нову гілку. git push origin new_branchname
Потім я робив запит на нову гілку.
Якщо вам не подобається ідея "повернення відновлення" (особливо якщо це означає втрату інформації про історію для багатьох комісій), ви завжди можете перейти до документації git про "Повернення несправного злиття". .
З огляду на наступну вихідну ситуацію
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E <-- fixed-up topic branch
(W - ваше первісне відновлення злиття M; D і E - це виправлення до вашої початково розбитої гілки функції / комісії)
Тепер ви можете просто повторити переходи від A до E, щоб жоден з них не «належав» до поверненого злиття:
$ git checkout E
$ git rebase --no-ff P
Нова копія вашої філії тепер може бути master
знову об’єднана :
A'---B'---C'------------D'---E' <-- recreated topic branch
/
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E