1. ホーム
  2. git

[解決済み] プル後にコミットした (プッシュしていない) 変更を新しいブランチに移動させる

2022-03-18 11:18:13

質問

私はかなりの量の作業 ("Your branch is ahead of 'origin/master' by 37 commits.") を行いました。 master . これらのコミットは、私のローカルマシンにのみ存在し origin にプッシュしているのですが、他の開発者が origin/master そして、私はその変更を撤回しました。

37のローカルコミットを新しいブランチに遡及して移動させるには? ドキュメントによると、どうやら git rebase --onto my-new-branch master または ...origin/master を実行する必要がありますが、どちらもエラー "fatal: Needed a single revision" が表示されるだけです。 man git-rebase には、リビジョンを提供することについては何も書かれていません。 rebase また、そのサンプルもそうなっていないため、このエラーを解決する方法がわかりません。

(なお、これは ではなく と重複している。 Git で、既存の未コミットの作業を新しいブランチに移動させる または ローカルの未コミットの変更を別の Git ブランチにマージするには? これらの質問は、ローカルでコミットされた変更ではなく、ローカルの作業ツリーのコミットされていない変更を扱っているからです)。

解決方法は?

まだどこにもコミットをプッシュしていないし、ブランチの履歴を書き換えるのも自由だからです。 origin/master . まず、私なら git fetch origin を確認するために origin/master が最新であることを確認します。 仮に現在 master が、できるはずです。

git rebase origin/master

にないすべてのコミットを再生します。 origin/master 上に origin/master . rebase のデフォルトの動作は、マージコミット (例えば、あなたの git pull を導入したのでしょう)、あなたの各コミットによって導入されたパッチを単に origin/master . (その結果に基づいて、新しいブランチを作成することができます。

git branch new-work

... そして master に戻す。 origin/master :

# Use with care - make sure "git status" is clean and you're still on master:
git reset --hard origin/master

でこのような枝の操作をする場合 git branch , git reset など。でコミットグラフを頻繁に見るのは便利だと思います。 gitk --all または同様のツールで、すべての異なる参照先がどこを指しているのかを理解しているかどうかを確認するためです。

あるいは、そもそも master の位置からトピックブランチを作成することもできます ( git branch new-work-including-merges をリセットし master と同じです。 しかし、トピックブランチには origin/master で、あなたはまだ変更をプッシュしていないので、履歴を整理するためにリベースをすることをお勧めします。 (また、最終的にトピックブランチを master にマージする際にも、変更がより明確になります)。