マスターブランチに変更するときのエラー:ローカルの変更はチェックアウトによって上書きされます


127

この質問は、に似ているこのいずれかが、より具体的な。

2つのブランチ(stagingbeta)を持つプロジェクトがあります。

私はで開発しstagingmasterブランチを使用してバグを修正しています。したがって、ステージングで作業しているときにエラーが発生した場合は、masterブランチに変更します。

git checkout master

そして、ものを行います:

git add fileToAdd
git commit -m "bug fixed"

そして、私は両方のブランチとマージします:

git checkout staging
git merge master
git checkout beta
git merge beta

また、作業ツリーに他のファイルがあるかどうかは関係ありません。

しかし、今、私がmasterブランチに変更しようとすると、エラーが発生します

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

ステージング領域からファイルを削除する必要があると思いました。

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

しかし、同じエラーが発生します。もし私がgit status得るならNo changes to commit


4
試しましたreset --hardか?本当に変更を破棄したい場合。または、そうでない場合はstashを使用します。
ケルタール2014年

@keltar-いいえ。変更を破棄したくありません。後でコミットするために作業ツリーに置いておく
Manolo

1
コミットされていない変更を維持しながらブランチを切り替えることはできないと思いますが、私は簡単に間違っている可能性があります-私のフィールドではありません。試しgit add your-fileてコミットします。
ケルタール2014年

@keltar-以前はこの方法で働いたことがあります。staging現在、変更をコミットしたくありません。
Manolo

おそらく、以前に試みたときに、競合するファイルは変更されていません。変更があります。gitはそれらをどこかに保存して後で復元する必要があります。コミットなしでは可能性が非常に低いです。しかし、本当にしたくない場合は-stashを使用してください。
ケルタール2014年

回答:


128

エラーは、ファイルを変更し、切り替え先のブランチにこのファイルの変更(最新のマージポイントから)がある場合に表示されます。

私の知る限り、あなたのオプションは-コミットしてから、このコミットを追加の変更で修正します(コミットされていない限り、gitでコミットを変更できますpush)。または-stashを使用します。

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash save変更を含むスタッシュを作成しますが、コミットやブランチに関連付けられていません。git stash pop最新のstashエントリを現在のブランチに適用し、保存された変更を復元してstashから削除します。


3
ありがとうございました。これで作業ツリーが変更されないことを確認してください(追加されたファイルではありません)。私は自分の変更
Manolo

add実際にsave更新されたときにタイプミスしました。つまり、他のファイルについては?git stash save必要に応じて、ファイル名パラメーターを指定しないと、変更されたすべてのファイルが保存されます(最新のコミット済み状態に戻します)。また、ディレクトリツリーのコピーを追加しても問題はありませんが、私はいつもそれについて妄想的です。
ケルタール2014年

masterブランチに追加したいファイルを除いて、すべての変更されたファイルを保存します。また、オプションはpop他のブランチの変更でしょうか?
Manolo

どういう意味かわかりません。はい、別のブランチにstashを適用できますが、ファイルの内容を置き換えるだけで、マージすることはありません。
ケルタール2014年

1
@ハニーそれはブランチとは何の関係もありません、問題はコミットされていない変更です。チェックアウトは、定義上、ファイルをの状態にリセットする必要がありますが、リセットすると、master現在のコンテンツが失われます。また、このコンテンツはコミットされていないため、後でこの状態に戻すことはできず、エラーが発生します。失われた変更について後で動揺することはありません。
ケルタル

150

私は同じ問題に遭遇し、それを解決しました

git checkout -f branch

そしてその仕様はかなり明確です。

-f、-force

ブランチを切り替える場合、インデックスまたは作業ツリーがHEADと異なっていても続行します。これは、ローカルの変更を破棄するために使用されます。

インデックスからパスをチェックアウトするとき、マージされていないエントリで失敗しないでください。代わりに、マージされていないエントリは無視されます。


7
私のgitが詰まったとき(ローカルの変更はありませんが、それでもそのエラーです)、この解決策が役に立ちました!
lukyer

5
おかげで、あなたは私の画面を拳で通り抜けることを防いだ。
フクロウ

3
私はその方法で変更を失いました
Jacek Dziurdzikowski

1
はい、これを行うと変更が失われます。これには大きな注意が必要です。
Alexander Mills

逆にそれが欲しい。マスターは私のブランチの後ろにあり、マスターは最新ですが、ブランチを切り替えることができません。gitバグである必要があります。
jgmjgm

12

ローカルの変更をコミットしたくない場合は、ブランチを強制的にチェックアウトできます。

git checkout -f branch_name

1
これsudoは必要ありません。ファイルのアクセス許可を壊すだけです。これは1年前に@kiki_yuが投稿したgitコマンドと同じですが、さらに悪いです。
kenorb

2
私はその方法で変更を失いました
Jacek Dziurdzikowski、2018

2
@JacekDziurdzikowskiでは、ローカルの変更を破棄することがまさに目的であると明確に述べた解決策を適用することで、変更を2回失いました(kiki_yuの回答に関するコメントを参照)。皮肉検出器が壊れているのか、それとも本気なのか?
RomainValeri

@RomainValeriうーん、それは私がgitで初心者である他の人に警告する方法だったと思います(この投稿を読む場合は初心者でなければなりません)。あるブランチで行われた変更は、もう一度チェックアウトするまでそのブランチに留まるべきだと思いました。そのように考える初心者へのヒント:git stashを使用してください:)
Jacek Dziurdzikowski

理由はありませんが、答えが重複しています。最初の答えにはさらに多くの情報があります。
MAChitgarha

9

私は同じ問題に遭遇し、それを解決しました

git checkout -fブランチ

さて、-fスイッチに注意してください。-fスイッチを使用すると、コミットされていない変更は失われます。を使用すると便利なユースケースがいくつかありますが-f、ほとんどの場合、stash変更を加えてからswitch分岐したい場合があります。以上がstashing手順です。


0

現在のブランチでコミットし、別のブランチにチェックアウトし、最後にそのコミットをチェリーピックすることができます(マージの代わりに)。


これについてより多くの説明を提供することは、より役に立ちます。
MAChitgarha

-1

別のブランチをチェックアウトしようとしたときにこれが発生した場合:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

これは、チェックアウトしたブランチでコミットする必要があるいくつかの変更があることを意味します。または、上記のほとんどのポイントと同様に、それらをワイプまたはスタッシュする必要があります。20回のうち19回は、変更をコミットする可能性が高くなります。

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

これで、他のブランチをチェックアウトして、簡単に切り替えることができます。

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

git push origin $ {branch}コマンドを実行するときに、正しいブランチにいて、正しいブランチにプッシュしていることを確認してください。注:プロジェクトをIntellijに直接フックしている場合、メインウィンドウの右下隅でブランチを変更したことがわかります。

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