チェックインのために変更されたファイルを別のブランチに移動する


422

これはよく起こります。コードを書いて、自分の変更をチェックインしましたが、それらの変更をチェックインする適切なブランチにいないことに気づきました。ただし、変更を元に戻さない限り、別のブランチに切り替えることはできません。変更を別のブランチに移動してチェックインする方法はありますか?

回答:


751

git stash あなたの友だちです。

まだコミットしていない場合は、を実行してくださいgit stash。これにより、すべての変更が保存されます。

変更したいブランチに切り替えて実行しgit stash popます。

git stashには多くの用途があります。これは確かに、より有用な理由の1つです。

例:

# work on some code
git stash
git checkout correct-branch
git stash pop

122
コミットされていない変更を隠しておく必要はありません。ブランチをチェックアウトするときに一緒に移動します。Stashは、一時的なものを長期的に保存するためのものです(後で終了してコミットしたいものですが、今は別のことをする必要があります)。
Tekkub

2
わかった だから私は隠してブランチを切り替えてからポップする必要があります C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
IsmailS

3
@Tekkubは「一時的なものの長期保管」と言って、非常に扱いにくいと感じています。スタッシュを使用するもう1つのポイントは、スタックにプッシュするので、引き継いで他の作業をしたくない場合は、そのように役立つことです。 。はい、あなたはする必要はありませんが、ただよりクリーンでよりコントロールされていると感じます。
アテリオン2016

ブラボーベイビー!コミットした場合の
対処方法

2
@Tekkubこれは、切り替え先のブランチが現在のブランチで最新の場合にのみ当てはまります。たとえば、誤って製品ブランチで作業していて、ステージブランチに切り替える必要があるが、その間にステージが変更された場合、切り替えを行う唯一の方法はスタッシュです。
danielson317

248

まだ変更をコミットしていない場合は、を使用git checkoutして新しいブランチに移動し、通常どおりにコミットします。ファイルへの変更は、コミットするまで特定のブランチに関連付けられません。

すでに変更をコミットしている場合:

  1. git log移動するコミットのSHAを入力して覚えます。
  2. コミットの移動先のブランチを確認してください。
  3. git cherry-pick SHA上からSHAを置き換えて入力します。
  4. 元のブランチに切り替えます。
  5. git reset HEAD~1間違ったブランチのコミットの前にリセットするために使用します。

cherry-pick 指定されたコミットを取得して、現在チェックアウトされているヘッドに適用するため、コミットを新しいブランチにコピーできます。


9
ここでチェリーピックする必要さえありません。 git reset HEAD~N --softその後、git checkout -bすべて移動し、今新しいブランチにコミットされていないコードを。
アーロン、

19
ファイルへの変更は、コミットするまで特定のブランチに関連付けられません。<-これ。これで謎が解けました。ありがとう。
Tschallacka 2017年

8
ブランチを切り替えようとすると、次のエラーが発生します。「次のファイルへのローカルの変更は、チェックアウトによって上書きされます」。そのため、別のブランチに移動して通常どおりコミットすることができないようです。
Mischa

3
@Mischa履歴の異なる2つのブランチを切り替える場合は機能しません
watashiSHUN

1
@Aaron(コミット後のシナリオの場合)の方がずっといいです!別にお答えください。
Jacktose

16

悲しいことにこれはかなり頻繁に私にも起こります、そして私がgit stash前に私の間違いに気づいたら私は使用し、そうでなければgit commit使用しgit cherry-pickます、両方のコマンドは他の答えでかなりよく説明されています

説明を追加したいのですgit checkout targetBranchこのコマンドは、targetBranchに現在のブランチと同じ履歴がある場合にのみ、作業ディレクトリとステージングされたスナップショットを保持します

まだ変更をコミットしていない場合は、git checkoutを使用して新しいブランチに移動し、通常どおりコミットします。

@Amberのステートメントはfalseではありません。newBranchに移動するgit checkout -b newBranchと、新しいポインターが作成され、現在のブランチとまったく同じコミットを指します。
実際、たまたま現在のブランチと履歴を共有している別のブランチがある場合(両方とも同じコミットで)、次のようにして「変更を移動」できます。git checkout targetBranch

ただし、通常、異なるブランチは異なる履歴を意味します。Gitでは、ダーティな作業ディレクトリまたはステージング領域を持つこれらのブランチを切り替えることはできません。その場合git checkout -f targetBranch(クリーンで使い捨ての変更)またはgit stage+ git checkout targetBranch(クリーンで変更を保存)のいずれかを実行でき、単に実行git checkout targetBranchするとエラーが発生します。

エラー:次のファイルに対するローカルの変更はチェックアウトによって上書きされます:...ブランチを切り替える前に、変更をコミットするか、それらを隠してください。中止しています


5

ソフトgitのリセットは、コミットされた変更は、あなたのインデックスに戻されます。次に、コミットする予定のブランチをチェックアウトします。次に、新しいコミットメッセージでgit commitを実行します。

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

git docsから:

git reset [<mode>] [<commit>]このフォームは、現在のブランチヘッドをにリセットし、場合によってはインデックス(のツリーにリセットする)と作業ツリーを更新します。省略した場合のデフォルトは--mixedです。は次のいずれかである必要があります。

--softインデックスファイルや作業ツリーにはまったく触れません(ただし、すべてのモードと同様に、ヘッドをにリセットします)。これにより、変更されたすべてのファイルが「コミットされる変更」のままになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.