Як я можу відкатати сховище github до певної комісії?


431

У мого github зараз 100 комісій. Мені потрібно відкатати сховище, щоб здійснити 80, і видалити всі наступні.

Чому? Це репо, можливо, призначене для об'єднання з різними користувачами. Купа злиття ввійшла як комітет у мене через надмірне редагування. Це було пов’язано з неправильним маркуванням моїх віддалених відділень, де 3 розробники були позначені як один одного. Мені потрібно скинути до цього моменту, а потім потягнути вперед.

Мені хотілося відновити базу даних, як у цьому прикладі: Як я можу видалити комісію на GitHub?

Однак, git хоче, щоб я дуже багато вирішував конфлікти. Чи є простіший спосіб?

Відповіді:


882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Примітка. Як написано в коментарях нижче, використання цього небезпечно в умовах спільної роботи: ви переписуєте історію


43
люди, робіть git push -f origin branch. Мені просто було погано, бо я це пропустив.
Суміт М Асок

21
ПЕРЕБУЙТЕ це! ви втратите всі свої зобов’язання на місцевому рівні, і якщо натиснути, шляху назад не буде
Thomas

8
Це неправда, ви можете отримати старі комісії за допомогою git reflog
Jan Schaefer

27
вам може знадобитися зробити git push origin HEAD --forceзамість того git push -f origin branch, що ставило мені error: src refspec branch does not match any.помилку
sprocket12

1
Так, спасибі, хлопці Мені вдалося зробити те, що я хотів. Я спершу створив окрему гілку від тієї, що передує виконанню, яку я хотів відкатати. Клонували його локально. Тоді застосувавши свої рекомендації до цієї копії, таким чином я не скомпрометував свою основну галузь ...
Готьє Боаліо

21

Щоб скасувати останнє зобов'язання, я роблю це:

Спочатку:

git log

скасуйте найновіший ідентифікатор SHA.

git revert SHA

Це створить нову комісію, яка буде точно протилежно вашому виконанню. Тоді ви можете підштовхнути це нове зобов’язання, щоб привести ваш додаток до стану, в якому він був раніше, і ваша історія git покаже ці зміни відповідно.

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

Як зазначив Майк, ви також можете це зробити:

git revert HEAD

8
git revert HEADповерне останню команду без необхідності шукати хеш.
Майк Баранчак

Це рішення, якщо ви зовсім не хочете видаляти комісії. Однак у цьому випадку всі сміттєві комісії все ще будуть там, і дозволити клонувальнику скинути або оформити їх. Якщо ви хочете цього не допустити, ВИ ВИНАГАЙТЕ змусити натиснути.
cst1992

19

Інший спосіб:

Оформіть гілку, яку ви хочете відновити, а потім відновіть свою локальну робочу копію назад до зобов’язання, яке ви хочете бути останньою на віддаленому сервері (все після цього пройде до побачення). Для цього в SourceTree я клацнув правою кнопкою миші на і вибрав "Скинути BRANCHNAME до цього зобов'язання".

Потім перейдіть до локального каталогу вашого сховища та запустіть цю команду:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Це видалить усі комісії після поточного у вашому локальному сховищі, але лише для цієї гілки.


1
FYI "REPOSITORY_NAME" буде чимось на зразок https: /me@github.com/me/repo_name.git
час

3
Було б корисніше, якби ви розбили цю команду і пояснили її.
cst1992

3

Більшість пропозицій припускають, що потрібно якось знищити останні 20 комісій, тому це означає "переписання історії", але цього не потрібно.

Просто створіть нову гілку з комітету №80 і працюйте над цією гілкою вперед. Інші 20 комітетів залишаться на старій осіротій гілці.

Якщо ви абсолютно хочете, щоб ваша нова філія мала те саме ім’я, пам’ятайте, що ця філія є лише мітками. Просто перейменуйте свою стару гілку на щось інше, а потім створіть нову гілку на комітці №80 з потрібним ім'ям.


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

2

Роблячи оновлення гілок від головного, я помічаю, що іноді я клацну над кліками, і змушую гілку зливатися в головний. Знайшов спосіб скасувати це.

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

git revert -m 1 ГОЛОВА


1

У github найпростішим способом є видалення віддаленої гілки в інтерфейсі github під вкладкою гілок. Ви повинні переконатись у видаленні наступних налаштувань, щоб зробити гілку видаленою:

  1. Не гілка за замовчуванням
  2. Немає запитів на відкриття опитування.
  3. Відділення не захищене.

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

git checkout -b master 734c2b9b   # replace with your commit point

Потім натисніть локальну гілку на віддалений

git push -u origin master

Додайте назад захист гілки та гілки за замовчуванням тощо.

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