Хотите изменить мой мастер на более старый коммит, как я могу это сделать? - PullRequest
72 голосов
/ 05 декабря 2010

Я хочу выполнить откат к предыдущему коммиту, а затем опубликовать этот код, а затем вернуться к последнему коммиту.

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

Как я могу это сделать?

Ответы [ 7 ]

88 голосов
/ 17 октября 2012

Если вы хотите сделать это и вернуть мастер к предыдущей фиксации:

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
47 голосов
/ 06 декабря 2010

Ваш вопрос неясен.Я думаю , что вы просите, это:

git push -f origin <i>$old_commit_id</i>:master

Что это будет делать?Это подтолкнет $old_commit_id коммит к origin в качестве новой главы origin master ветви.

Если это то, что вы хотели, вам не нужно прикасаться к вашему локальному master ветка вообще.

25 голосов
/ 10 июня 2017

использование git reset --hard <old commit number>

сбросит ГОЛОВУ на этот старый коммит.

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

8 голосов
/ 29 августа 2014

Предполагая, что граф фиксации выглядит так:

| (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)
8 голосов
/ 05 декабря 2010

Вы можете просто 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 достаточно.Это делает все это довольно простым.

2 голосов
/ 05 декабря 2010

Чтобы перейти к предыдущей версии:

git checkout <version hash>

сделайте свою работу здесь и передайте ее с

git commit --amend

Чтобы вернуться к master :

git checkout master

0 голосов
/ 22 июня 2019

Если вы хотите избежать принудительного нажатия, вот как вернуть репо к более старому коммиту и сохранить всю промежуточную работу:

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 по-прежнему доступны в истории вашего проекта, если вы когда-нибудь захотите увидеть их снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...