Git-間違ったブランチで作業する-既存のトピックブランチに変更をコピーする方法


333

私はプロジェクトに取り組んできましたが、残念ながら、私は忘れてしまった私のブランチに切り替えるには、そのようにマスターに取り組んでいます

ここで行った作業(3ファイル)をマスターから、マスターにコミットせずにブランチ(たとえば、branch123と呼ばれる)にコピーするにはどうすればよいですか?

回答:


540

必要なのは次のとおりです。

git stash
git checkout branch123
git stash apply

その後、マスターブランチに触れずに自分のブランチに戻る必要があります。


6
ok-私はそれを実行しましたが、マスター(git checkout master)に切り替えてgit statusを実行すると、同じファイルがまだ「変更」されています-それは期待されていますか?
アレックス

5
現在のブランチ(マスター)とトピックブランチ(branch123)の違いがローカルで変更したどのファイルにもない場合は、実際に隠しておく必要はありません。その場合、Gitを使用するとトピックブランチをチェックアウトできます。
カスカベル

3
@アレックス:はい、そうです。これにはコミットは含まれません。stashローカルの変更を保存してからstash apply元に戻します。
カスカベル、

6
どうすればマスターブランチからそれらを「取り除く」ことができます。
アレックス、

7
git reset --hard HEADそして、あなたはあなたのマスターブランチに行った最後のコミットに戻ります。
gnab

46

受け入れられた答えは最も完全ですが、単純化できる特別な場合があります。作業ディレクトリで変更したファイルが両方masterで同一であり、branch123簡単に実行できる場合

git checkout branch123

のデフォルトの動作はcheckout作業ディレクトリ内の変更されたファイルを上書きしないため、何も失われることがないため、何も隠しておく必要はありません。(これは実際にCascabelによって最初にコメントで言及されました)

他の人がコメントで述べたように、branch123まだ存在しない場合は、行うことができます

git checkout -b branch123

私がここで見つけたものに基づいています


3
または、新しいブランチを作成する場合は、git checkout -b newbranch
Phil Mitchell

2
これはstashよりもうまく機能し、はるかに簡単です。ありがとう!
Matthias

31
いいえ、これは機能しません。Gitは次のメッセージを表示します。「ブランチを切り替える前に、変更をコミットするか、それらを隠してください。」
dsharew

1
@DegenSharew:はい、あなたが作業ディレクトリに変更したファイルはで同一でない場合、すなわち、右のいくつかのケースであるmasterbranch123。私の編集した答えを見てください。
Russel Dirks、

1
これは私にとってはうまくいきました。私はまだブランチを作成していなかったので、これを行いました:git checkout -b newbranchname。私の変更は自分でそのブランチに現れました。
dex3703


0

新しいブランチを作成することは可能ですが、ファイルをチェックアウトしているときに既存のブランチをチェックアウトすることはできないため、一時的なブランチを使用して機能する次のトリックが見つかりました。

このシナリオは、少なくともVS 2015 Gitプラグインで機能しますが、ほとんどのgitツールで機能します。

  1. マスターのファイルをチェックアウトして変更します(ups !、間違ったブランチ)
  2. マスターから新しいブランチ「temp」(または選択した未使用の名前)を作成します。チェックアウトされたファイルは、マスターではなく一時的にチェックアウトされるようになりました。
  3. tempの変更をチェックインします(マスターは変更されません)
  4. すべてがチェックインされ、既存のブランチをチェックアウトすることができます。必要なブランチ(最初に変更を加えたかったブランチ)を確認してください。3.5Git Rebase
  5. tempを必要なブランチにマージします。これで、変更は正しいブランチにあります。
  6. 不要になった一時ブランチを削除します

編集:私は、マージを実行する前に、tempブランチのリベース(git rebase --onto)を実行する必要があることを発見しました。そうでない場合、マスターの変更はマージに含まれます。上記の追加のステップ3.5。リベースの詳細については、こちらをご覧くださいhttps : //git-scm.com/book/en/v2/Git-Branching-Rebasing


提供するソリューションについてもう少し説明を追加して、回答を詳しく説明していただけませんか?
abarisone 2015年

ご意見をいただきありがとうございます。解決策は非常に単純ですが、「stash」ソリューションと同じ原則に従いますが、stashの代わりに一時的なブランチが使用されます。stashはGITプラグインでサポートされていないため、これは少なくともVisual Studioユーザーにとってより便利です
Pasi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.