master
最近のコミットを新しいブランチに移動し、それらのコミットが行われる前の状態にマスターをリセットするにはどうすればよいですか? たとえば、次のようになります:
master A - B - C - D - E
これに対して:
newbranch C - D - E
/
master A - B
ベストアンサー1
警告:これを行う前に、 を使用して、コミットされていない編集内容をスタッシュに保存する必要がありますgit stash
。完了したら、 を使用して、スタッシュされたコミットされていない編集内容を取得できますgit stash pop
。git reset hard コマンドはすべての変更を削除します。
既存のブランチへの移動
コミットを既存のブランチに移動する場合は、次のようになります。
git checkout existingbranch
git merge branchToMoveCommitFrom
git checkout branchToMoveCommitFrom
git reset --hard HEAD~3 # Go back 3 commits. You *will* lose uncommitted work.
git checkout existingbranch
新しいブランチへの移行
警告:この方法は、最初のコマンドで新しいブランチを作成しているため機能します: 。コミットを既存のブランチgit branch newbranch
に移動する場合は、実行する前に変更を既存のブランチにマージする必要があります(上記の「既存のブランチへの移動」を参照)。最初に変更をマージしないと、変更は失われます。git reset --hard HEAD~3
他の状況が関係していない限り、これは分岐とロールバックによって簡単に実行できます。
# Note: Any changes not committed will be lost.
git branch newbranch # Create a new branch, saving the desired commits
git checkout master # checkout master, this is the place you want to go back
git reset --hard HEAD~3 # Move master back by 3 commits (Make sure you know how many commits you need to go back)
git checkout newbranch # Go to the new branch that still has the desired commits
ただし、いくつのコミットを戻すかは必ず確認してください。 の代わりに、マスター(/current) ブランチで「戻す」HEAD~3
コミットのハッシュ (またはorigin/masterのような参照) を指定することもできます。例:
git reset --hard a1b2c3d4
注:マスター ブランチからのコミットが「失われる」だけですが、心配しないでください。それらのコミットgit log -n4
は newbranch に残ります。これを確認する簡単な方法は、上記の 4 ステップのコマンド シーケンスを完了した後、 を確認することです。これは、newbranch の履歴で実際に 3 つのコミットが保持されていることを示します (その理由は、それらの変更がマスターにコミットされた時点で newbranch が作成されたためです)。それらはマスターからのみ削除され、git reset
実行時にチェックアウトされたブランチ、つまりマスターにのみ影響しました (を参照)。git リセット説明:現在のHEAD を指定された状態にリセットします。git status
ただし、newbranch のチェックアウトは表示されません。最初は驚くかもしれませんが、これは実際には予想どおりです。
最後に、あなたが必要があるかもしれません最新の変更をメインリポジトリに強制的にプッシュするには:
git push origin master --force
警告: Gitバージョン2.0以降では、git rebase
新しいブランチを元の()ブランチに後から追加する場合、持ち越されたコミットが失われないように、リベース中にmaster
明示的なオプションが必要になる場合があります。setを使用すると、これがより起こりやすくなります。--no-fork-point
branch.autosetuprebase always
ジョン・メラーの答え詳細については。