1. ホーム
  2. ギット

[解決済み] Git で最新のコミットを新しいブランチに移動する

2022-03-18 02:11:57

質問

master にコミットした最後の数回分のコミットを新しいブランチに移動して、master をそれらのコミットが行われる前に戻したいのですが、どうすればいいですか? 残念ながら、私のGit-fuはまだ十分に強くありません。

つまり、どうすればこの状態から

master A - B - C - D - E

を、これに変更しますか?

newbranch     C - D - E
             /
master A - B 

解決方法は?

既存のブランチへの移動

にコミットを移動させたい場合。 既存のブランチ の場合、次のようになります。

git checkout existingbranch
git merge master
git checkout master
git reset --hard HEAD~3 # Go back 3 commits. You *will* lose uncommitted work.
git checkout existingbranch

この操作を行う前に、コミットされていない編集をstashに保存するには、次のようにします。 git stash . 完了したら、隠したコミットされていない編集を取り出すには git stash pop

新しいブランチに移動する

警告 この方法は、最初のコマンドで新しいブランチを作成しているため、うまくいきます。 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 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

ただし、何コミットまで遡るかは確認してください。別の方法として HEAD~3 を指定する場合、単純にコミットのハッシュ(または オリジン/マスター に戻したいのですが。 マスター (/current)ブランチのようなものです。

git reset --hard a1b2c3d4

*1 あなたは のみ しかし、そのコミットは newbranch にも残りますので、ご安心ください!

警告 Git バージョン 2.0 以降では、後で git rebase の上に新しいブランチを作成し、元のブランチ ( master ) ブランチが必要な場合は、明示的に --no-fork-point オプションを指定することで、リベース時に引き継いだコミットを失わないようにすることができます。 このオプションは branch.autosetuprebase always を設定すると、この可能性が高くなります。 参照 John Mellorの回答 をご覧ください。