Хочете змінити свого майстра на старіший коміт, як я можу це зробити?


91

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

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

Як я можу це зробити?

Відповіді:


99

Якщо ви хочете зробити це і повернути майстер до попереднього коміту:

git checkout master~1            # Checkout previous commit on master
git checkout -b new_master       # Create branch for new master
git branch -D master             # Delete old master
git branch -mv new_master master # Make new_master master

В якості альтернативи:

git reset --hard master~1        # Reset current branch to one commit ago on master

1
Тож через рік я дивлюсь на це і думаю, що це жахливий спосіб це зробити. Ну добре, принаймні це дещо легко зрозуміти.
Тайлер Брок,

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

1
Мені довелося зробити те саме за допомогою SourceTree. Процес подібний. 1) створіть нову гілку для поточного основного стану, щоб ви нічого не втратили. 2) видалити master 3) створити нову гілку master, вибравши бажаний коміт
Danilo Gomes

Що відбувається з комітом, який ми "видалили" з master після цього?
Arthur Colombini Gusmão

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

59

Ваше запитання незрозуміле. Я думаю, що ви просите про це:

git push -f origin $old_commit_id:master

Що це буде робити? Вона буде штовхати себе $old_commit_idзобов'язання в originякості нового глави origin«S masterгалузі.

Якщо це те, що ви хотіли, вам взагалі не потрібно торкатися вашого місцевого masterвідділення.


Це спричинило master (non-fast-forward)для мене невдачу. Рішення @jtdubs спрацювало.
Боббі Нортон,

3
Просто перейдіть, -fщоб змусити його - хоча віддалений репо може бути налаштований на заборону цього. Я оновив відповідь.
Арістотель Пагальціс

у мене не працює, прийнята відповідь працює
MobileMon

Ви не сказали, що саме хотіли або чому це не спрацювало, тому я не можу сказати, чому це не так, і як це можна було зробити (якщо могло).
Арістотель Пагальціс

Здається, ви втратили минулу історію на пульті дистанційного керування за допомогою цього підходу, це було добре для мене. Просто закликаю це.
Шон

43

використання git reset --hard <old commit number>

він скине HEAD до цього старого коміту.

крім того, вам потрібно використовувати git push -f originдля зміни віддаленого репо.


34

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

git checkout 307a5cd        # check out the commit that you want to reset to 
git checkout -b fixy        # create a branch named fixy to do the work
git merge -s ours master    # merge master's history without changing any files
git checkout master         # switch back to master
git merge fixy              # and merge in the fixed branch
git push                    # done, no need to force push!

Готово! Замініть 307a5cd будь-яким комітом, який ви хочете у своєму репо.

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

Ось це графічно:

c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
        \              /
         '------------'

Ви ефективно видаляєте c3 і c4 і встановлюєте свій проект назад на c2. Однак c3 і c4 все ще доступні в історії вашого проекту, якщо ви захочете їх побачити знову.


1
Це спрацювало без проблем! Якщо ви зайшли так далеко і читаєте це - здається, це найчистіший спосіб повернути майстра на більш глибокий коміт.
ddisqq

Я не можу знайти слів, щоб пояснити, наскільки сильно я тебе люблю за це, я просто чудовий, щоб не виправити щось, що мене прослуховувало вже 6 годин і викликало стільки головного болю. Спасибі пане!!!!!!!
Костас Цакалідіс

Це просто врятувало мені життя! дякую
Бред,

9

Якщо припустити, що такий графік коміту:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                              (master)

Ви хочете спочатку замовити masterі створити гілку, яка вказує на те, де masterзараз знаходиться:

git checkout master
git branch pointer master

Має виглядати ось так:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                       (HEAD, master, pointer)

Тепер, коли ви вже працюєте master, ми скажемо masterгілці повернутися назад на один коміт:

git reset master~1

Тепер masterслід перемістити назад на один пробіл, але pointerгілка все ще виконує найновіший коміт:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|           (HEAD, master)    (pointer)

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

git push origin master
git merge --ff-only pointer
git branch -D pointer

Фінал:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|         [ origin/master ]    (HEAD, master)

1
Якщо origin / master знаходиться на рівні C, git push origin masterне вдасться, оскільки кінчик вашої поточної гілки знаходиться позаду віддаленого аналога . Ви також повинні передати прапор -f.
sassospicco

8

git checkout <commit-id>Тоді ви можете просто робити все, що вам потрібноgit checkout master щоб повернутися до нового коду.

Якщо вам насправді потрібно змінити старий код, щоб випустити його, то, ймовірно, слід:

git checkout -b my_release <commit-id>
... prepare code for release ...
... release code ...
git checkout master
git merge my_release

Крім того, я не можу рекомендувати git flow досить. Це робить все це досить легким.


1

Щоб перейти до попередньої версії:

git checkout <version hash>

робіть свою роботу тут і виконуйте її за допомогою

git commit --amend

Щоб повернутися до майстра :

git checkout master


1
Це не спрацює. git reset --hardвказав свою головну гілку назад на старий коміт, тому git checkout masterнічого не зробить.
jtdubs

Правда, дякую за виправлення. +1 до вас, я б також видалив мою відповідь, але я вважаю, що цей commit --amendкрок досить корисний
Пабло Фернандес

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