Скидання дистанційного доступу до певного коміту


709

Я хочу відкинути всі зміни, зроблені після фіксації <commit-hash>. Так я і зробив:

git reset --hard <commit-hash>

Тепер я хочу зробити те ж саме зі своїм пультом. Як я можу це зробити? Після цього я зробив деякі вчинки (і штовхає) <commit-hash>і просто хочу відкинути їх усі. Це просто щось жахливо пішло в дорозі, і я не хочу зробити це гірше, ніж це вже є. ; (

Я в принципі хочу , щоб перемотати мій origin/masterTo<commit-hash>


3
Ви впевнені, що вас origin/masterне потягнули та не підштовхнули інші користувачі? Зміна історії публічного (тобто нелокального) сховища - це те, чого ви хочете уникати у будь-який час.
Віндія

Відповіді:


1251

Якщо припустити, що ваша філія називається masterі тут, і віддалено, і що ви називається ваш віддалений, originви могли б зробити:

 git reset --hard <commit-hash>
 git push -f origin master

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

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

Оскільки з вашого запитання видно, що ви вже використовували git reset --hardдля скидання своєї masterфілії, можливо, вам доведеться почати, git reset --hard ORIG_HEADщоб перенести свою гілку назад, куди вона була раніше. (Як завжди git reset --hard, переконайтеся, що git statusце чисто, що ви знаходитесь на правій гілці, і що ви знаєте, git reflogяк інструмент для відновлення, очевидно, втрачених зобов'язань.) Ви також повинні перевірити, що ORIG_HEADвказує на правильну фіксацію, с git show ORIG_HEAD.

Вирішення проблем:

Якщо ви отримаєте повідомлення типу " ! [Віддалений відхилений] a60f7d85 -> master (попередній прийом гачок відхилений) "

тоді ви повинні дозволити переписання історії філій для конкретної гілки. Наприклад, у BitBucket сказано, що "Перезапис історії гілок заборонено". Існує прапорець під назвою, Allow rewriting branch historyякий потрібно перевірити.


21
Небезпека небезпеки: це скидання передбачає, що відповідна гілка ( відстеження ) наразі перевірена і немає жодних неспроможних змін, які ви хотіли зберегти. Використовувати git update-refзамістьreset --hard ; це дозволить вам зробити те ж саме , не маючи робоче дерево / Видано філія
sehe

3
Розумію. Його підштовхнули та змінили інші. Отже, я повинен використовувати, revert але скажемо, що хочу відновити останні 4 коміти, так що я повинен зробити git revert comit1; git push; git revert comit2; git push; ...або просто git revert commit4; git push?
nacho4d

1
@ nacho4d: не потрібно тиснути після кожного повернення - є хороший опис того, що робити у цій відповіді від Якуба Нарбського . Вам потрібно повернути кожну комісію, яка йде назад - просто це git revert commit4створює нове зобов’язання, яке скасовує лише ті зміни, які були введені в commit4. Як відповідь, на яку я посилався, я вказую, але ви можете їх об'єднати в один комітет.
Марк Лонгейр

1
@ Марк Я вже запустив, git reset --hardале я видалив свій локальний і знову витягнув з початкового сигналу, тому я можу зробити git revert ...свої сумніви в тому, що: чи потрібно повертати кожну команду та натискання (по черзі) чи просто повернути першу комісію після право здійснювати лише?
nacho4d

1
@sehe: це важко використовувати, оскільки вам потрібно використовувати повне ім'я посилання, і тому люди легко засмічують свій .gitкаталог рефлексами, які вони не мали намір створити. Я неправильно сказав, що немає жодних перевірок безпеки. Класифікацію команд "сантехніка" та "порцеляна" ви можете знайти на сторінці git man .
Марк Лонгейр

123

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

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

  1. Є НЕ робити будь - яких переустановку.
  2. Використовуйте git logдля пошуку комісії, яку ви хочете на віддаленому сервері. git log -pщоб побачити зміни або git log --graph --all --oneline --decorateпобачити компактне дерево.
  3. Скопіюйте хеш коміту або його тег або назву його гілки, якщо це підказка.
  4. Виконайте команду типу:

    git push --force <remote> <commit-ish>:<the remote branch>
    

    напр

    git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
    

    або

    git push --force staging v2.4.0b2:releases
    

Я використовую зручний псевдонім ( git go) для перегляду історії, як на кроці 2, який можна додати так:

    git config --global alias.go 'log --graph --all --decorate --oneline'`

3
Графік був дуже приємною підказкою, я тільки що додав -5, щоб отримати лише останні п яти комітетів, це було величезне дерево ще. Також уникати скидання - саме те, що я шукав. Великий
ОлександрD

@AlexanderD Ви також можете додати псевдонім до Git, а не до оболонки, тому він працює скрізь. Git розуміє ці псевдоніми та завершує вкладки з повної команди, щоб ви могли додавати аргументи. git config --global alias.graph 'log --graph --all --decorate --oneline'менш брудно, і ви все ще можете обмежити це, наприклад:git graph -5
Walf

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

1
У Windows введіть qдля виходу з журналу git. 2 хвилини я ніколи не повернусь.
dst3p

1
@ dst3p Це на кожній платформі, приятель. Програма пейджера, як правило , lessі qє нормальним способом вийти з неї. Git Bash - це як термін * nix.
Вальф

63

Я вирішив проблему, як і ваша, за допомогою цих команд:

git reset --hard <commit-hash> 
git push -f <remote> <local branch>:<remote branch> 

13

У GitLab вам, можливо, доведеться встановити свою філію незахищеною, перш ніж робити це. Це можна зробити в [repo]> Settings> Repository> Protected Branches. Потім працює метод відповіді Марка.

git reset --hard <commit-hash>
git push -f origin master

10

Якщо ви хочете попередню версію файлу, я рекомендую використовувати git checkout.

git checkout <commit-hash>

Це призведе до повернення вас у часі, це не вплине на поточний стан вашого проекту, ви можете прийти до магістралі git checkout mainline

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

git checkout <commit-hash> -- file_name
git add .
git commit -m 'file brought from previous time'
git push

Перевагою цього є те, що він не видаляє історію, а також не повертає конкретні зміни коду (git revert)

Перевірте більше тут https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout


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

8

Мої два центи на попередні відповіді: якщо

git push --force <remote> <the-hash>:<the remote branch>

все ще не працює, ви можете відредагувати <your-remote-repo>.git/configрозділ прийому файлу:

[receive]
  #denyNonFastforwards = true
  denyNonFastforwards = false

Корисно знати, як налаштувати пульт, щоб дозволити нешвидкісні перештовхування вперед, оскільки, здається, більшість відповідей передбачає віддалену службу, як github або bitbucket.
strongbutgood

2

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

git checkout 000000

(де 000000 - ідентифікатор комісії, куди ви хочете піти) у своїй проблемній гілці, а потім просто створіть нову гілку:

git remote add [name_of_your_remote]

Тоді ви можете створити новий піар і все буде добре!


1

Зробіть одне, дістаньте SHA комітету ні. наприклад 87c9808, а потім,

  1. перемістіть себе, це ваша голова до зазначеної фіксації (виконавши скидання git --hard 89cef43 // згадайте свій номер тут)
  2. Далі зробіть кілька змін у випадковому файлі, щоб git попросив вас зробити це локально, а потім віддалено. Отже, що вам зараз потрібно зробити. після застосування зміни git commit -a -m "пробний поступ"
  3. Тепер натисніть на наступну команду (якщо це було здійснено локально) майстром git push origin
  4. Тепер те, що git попросить у вас, це

Помилка: не вдалося надіслати деякі відгуки на підказку ' https://github.com/YOURREPOSITORY/AndroidExperiment.git ': оновлення було відхилено, оскільки кінчик поточної гілки знаходиться за підказкою: її віддалений аналог. Інтегруйте віддалені зміни (наприклад, підказка: 'git pull ...'), перш ніж натиснути знову. **

  1. Таким чином, зараз ви можете зробити це

git push --force origin master

  1. І таким чином, я сподіваюся, що це працює :)

1

Sourcetree: скидання дистанційного до певного коміту

  1. Якщо ви віддали погану передачу на віддалений пульт (походження / особливість / 1337_MyAwesomeFeature), як зображено нижче

Перейдіть до віддалених служб

  1. Перейдіть до пункту Віддалені> походження> функція> 1337_MyAwesomeFeature
  2. Клацніть правою кнопкою миші та виберіть "Видалити джерело / функцію / 1337_MyAwesomeFeature" (Або змініть ім'я, якщо ви хочете створити резервну копію та пропустіть крок 4.)
  3. Клацніть «Примусово видалити» та «ОК».

введіть тут опис зображення введіть тут опис зображення

  1. Виберіть старішу комісію та оберіть "Скинути поточну гілку до цього"
  2. Виберіть режим, який ви хочете мати (Важкий, якщо ви не хочете останніх змін) та "ОК".

введіть тут опис зображення введіть тут опис зображення

  1. Перемістіть цю комісію на нове походження / особливість / 1337_MyAwesomeFeature введіть тут опис зображення

  2. Ваша локальна філія функції та відділення віддалених функцій тепер перебувають на попередньому (на ваш вибір) дорученні введіть тут опис зображення

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