特定のブランチで 2 つの異なるプロジェクトに取り組んでいる状況があります。プロジェクト「A」を終了し、変更をコミットし、変更をリモートにプッシュしました。この変更「A」は現在レビュー中のため、まだブランチにマージされていません。その間、私は同じブランチの別のプロジェクトの無関係な変更に取り組み始めました。この変更を「B」と呼びます。この変更のコーディングも完了し、これをコミットしてプッシュする準備が整いました。しかし、変更「A」はまだマージされていないため、これをどのように行うべきかわかりません。これら 2 つの変更 "A" と "B" を、互いに依存しない個別の変更としてプッシュするにはどうすればよいですか?
2 に答える
最初に、変更 A と B の共通の親になるコミットを識別する必要があります。説明したように、これはコミット A の親です。Agit log
の前のコミットのハッシュを見つけるために使用します。入力するだけでよいことに注意してください。コミット ハッシュの最初の数文字/数字。「parent_commit」であるとしましょう
このコミットをチェックアウトして、変更 B の新しいブランチのヘッドとして使用します。
git checkout parent_commit
次に、そこから新しいブランチを作成し、B の変更をコミットします。
git checkout -b changeB
最後に、 と を使用git add
しgit commit
て、この新しいブランチで変更 B をコミットします。完了したら、 aを実行git push
して、変更 A から独立した新しいブランチからコミット B をプッシュします。または、既に変更 B をコミットしている場合は、 then を使用git cherry-pick commitB
しgit pull
ます。
これで、元のブランチに A があり、新しいブランチに B があり、A の親までの履歴を共有します。
結びのコメント: すでに B をコミットしてそのブランチを作成している (そしてチェックアウトしていた) 場合は、他の回答で言及されているリベースのワンライナーを実行できたはずです:
git rebase --onto master commit_A_sha
基本的に、Shelhamer の回答と同じ結果です。ただしgit rebase --onto
、単一のコマンドで同じ結果を得るために使用できます。「古い」親の SHA ID (例では A) と、新しい親の SHA ID ( masterなど) を見つけます。次に、問題のブランチ (B) をチェックアウトしたと仮定して、次を実行します。
git rebase --onto <new parent> <old parent>
これは基本的に、ブランチ B から A までのすべてを「ピックアップ」し、マスターに基づくように移動します。あとgit push
は通常通り。