マスターを古いコミットに変更したいのですが、どうすればよいですか?


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
はい、これが私が賛成し、理解しやすい理由です。おそらく、より良い方法へのリンクを提示すべきでしたか?
Andrew Atkinson

1
SourceTreeを使用して同じことをしなければなりませんでした。プロセスは似ています。1)現在のマスター状態の新しいブランチを作成して、何も失わないようにします。2)マスターを削除します3)新しいマスターブランチを作成し、目的のコミットを選択します
Danilo Gomes

この後、マスターから「削除」したコミットはどうなりますか?
アーサーColombiniグスマン

1
リモートリポジトリがある場合は、これを回避する必要があります。最初のマスターのアドレスが最近作成した新しいマスターと異なるため、そうするとエラーが発生します。
MAChitgarha 2018

59

あなたの質問は不明確です。私あなたが求めているのはこれだと思います:

git push -f origin $old_commit_id:master

これは何をしますか?のブランチの新しいヘッドとして$old_commit_idコミットをプッシュします。originoriginmaster

それがあなたが望むものであるならば、あなたはあなたの地元のmaster支店に全く触れる必要はありません。


これmaster (non-fast-forward)は私にとって失敗を引き起こしました。@jtdubsソリューションが機能しました。
ボビーノートン

3
-f強制的に渡すだけですが、リモートリポジトリはそれを禁止するように構成されている場合があります。答えを更新しました。
アリストテレスパガルツィス2013

私にはうまく
いき

あなたはあなたが望むものやなぜそれが機能しなかったのかを正確に言っていなかったので、なぜそれが機能しなかったのか、そしてそれがどのように作られたのか(もしそうなら)は言えません。
アリストテレスパガルツィス2015年

このアプローチでは、リモートで過去の履歴を失うように見えますが、私にとっては問題ありませんでした。ただそれを呼び出す。
ショーン

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を、リポジトリで必要なコミットに置き換えます。

(最初の2行を組み合わせることができることは知っていますが、それでは何が起こっているのかがわかりにくくなると思います)

ここにそれはグラフィカルにあります:

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

c3とc4を効果的に削除し、プロジェクトをc2に戻します。ただし、c3とc4は、もう一度見たい場合は、プロジェクトの履歴で引き続き使用できます。


1
これは問題なく機能しました!ここまで来てこれを読んでいる場合、これはマスターをより深いコミットに戻すための最もクリーンな方法のようです。
ddisqq

私はこれについてあなたをどれだけ愛しているかを説明する言葉を見つけることができません。私は今6時間バグを抱えていて、私に多くの頭痛を引き起こした何かを修正するために言葉を超えて素晴らしいです。ありがとうございます!!!!!!!
Kostas Tsakalidis

9

次のようなコミットグラフを想定します。

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

最初にチェックアウトmasterして、master現在の場所を指すブランチを作成します。

git checkout master
git branch pointer master

今は次のようになります。

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

すでにオンmasterになっているので、masterブランチに1つのコミットを後方に移動するように指示します。

git reset master~1

ここで、master1スペース戻る必要がありますが、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
オリジン/マスターがCにあるgit push origin master場合、現在のブランチの先端がリモートのブランチの背後にあるため失敗します。また、-fフラグを渡す必要があります。
sassospicco 2016年

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

また、gitflowはお勧めできません。これにより、これらすべてが非常に簡単になります。


1

以前のバージョンに移動するには:

git checkout <version hash>

ここであなたの仕事をして、それをコミットしてください

git commit --amend

マスターに戻るには:

git checkout master


1
それはうまくいきません。 git reset --hard彼のマスターブランチを古いコミットに戻したので、git checkout master何もしません。
jtdubs 2010

確かに、訂正してくれてありがとう。+1すると、私の答えも削除されますが、このcommit --amend手順は十分に役立つと思います
Pablo Fernandez

なに--amend
Shafizadeh 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.