6

ラップトップでローカル Git リポジトリを作成し、ソースを Heroku にプッシュしてリモート ブランチを作成しました。コミットとプッシュの数日後、以前のコミットにロールバックする必要があります。これが私がしたことです。

cd <app root>
git checkout 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73 

チェックアウトを実行すると、ブランチ自体ではなく、新しい作業ツリーが作成されたので、ロールバックの変更を Heroku にプッシュすると、すべてが最新であり、何もプッシュされていないと誰かに言われました。この状況を修正するにはどうすればよいですか? 事前にご協力いただきありがとうございます。

4

2 に答える 2

8

ブランチ名をチェックアウトする代わりに、(コミット オブジェクトの SHA-1 ハッシュを使用して) 直接コミット名をチェックアウトすると、「切り離された HEAD」になります。HEAD は、現在チェックアウトされているものを追跡する「参照」です。ブランチではなくコミットを直接チェックアウトすると、デタッチされます (どのブランチにもアタッチされません)。リポジトリの HEAD を切り離しても、ブランチは更新されません。デタッチされたヘッドの状態は、匿名のブランチをチェックアウトしたかのように考えることができます。


リポジトリの HEAD を再アタッチするには、現在の HEAD をブランチとして保存し、そのブランチをチェックアウトします。

  1. 現在の HEAD を新しいブランチに保存するには、次のようにします。

    git branch <new-branch-name>
    
  2. 既存のブランチを上書きするには、次を使用する必要があります--force

    git branch --force <existing-branch-name>
    
  3. 次に、新しい/更新されたブランチをチェックアウトして、リポジトリの HEAD を再アタッチします。

    git checkout <branch-name>
    

    (上記の 2 つのコマンドのどちらを使用したかに応じて、 はまたは<branch-name>と同じです)<new-branch-name><existing-branch-name>

このシーケンス ( git branchref を現在の HEAD コミット、次にgit checkoutその更新されたブランチへの参照ポイントにする) は、作業インデックスおよび/またはツリーにある可能性のあるコミットされていないコンテンツをすべて転送します。


将来、現在のブランチを以前のコミットに「ロールバック」したい場合は、リポジトリの HEAD をデタッチする代わりにこれを使用する必要があります。

git reset --hard <commit>

これにより、現在のブランチ (または、既にデタッチされている場合はデタッチされた HEAD) が名前付きコミットにリセットされ、インデックスと作業ツリーにそのコミットが反映されます (つまり、指定されたコミット以降のコミットと、コミットされていないコンテンツが破棄されます)。 )。

切り離された HEAD 状態は、古い状態を再訪する場合や、保持するかどうかわからない短期間の作業に役立つ場合があります。それ以外は、おそらく避けたいと思うでしょう。

于 2010-03-18T04:41:19.907 に答える
2

リセットしたい:

git reset --hard 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73
于 2010-03-18T04:11:18.020 に答える