git:ブランチを切り替え、コミットせずに変更を無視する


318

私はgitブランチで作業していて、変更をコミットする準備ができていたので、有用なコミットメッセージでコミットを行いました。その後、ぼくはぼんやりとコードにマイナーな変更を加えた。ここでブランチを変更したいのですが、gitを使用すると、

エラー:「X」のローカル変更があります。ブランチを切り替えることはできません。

コミットせずにブランチを変更できますか?もしそうなら、これをどのように設定できますか?そうでない場合、どうすればこの問題を回避できますか?コミットせずにマイナーな変更を無視して、ブランチを変更したい。


1
これは、変更がコミット用にステージングされているがコミットされていない場合にのみ発生すると思いますか?git addoutなどを使用してまだファイルをステージングしていない場合、ブランチを変更するためにgit checkoutは問題なく機能します。
ジェレミーウォール

1
こんにちはジェレミー、「ステージング」とはどういう意味ですか?ブランチを変更する前にユーザーにファイルをコミットさせることは、素晴らしいワークフローのようには思えません。たとえば、私がマスターリポジトリにいて、ブランチの何かをすぐにチェックしたい場合。最初にコードをマスターにコミットする必要があります。コードが半分書かれている場合でも!確かに、この状況でブランチをチェックアウトできるはずだと言っていますか?
ダニエルファレル

@boyfarrell 'Git stash'を使用して、コミットせずに一時的に変更を保存できます。
Howiecamp


1
古いブランチの変更をコミットせずにブランチに切り替えると、gitは変更を新しいブランチのファイルにマージしようとします。マージが競合なしで行われた場合、ブランチの切り替えは成功し、新しいブランチで変更を確認できます。しかし、競合が発生した場合、error: You have local changes to '<filename>'; cannot switch branches.ブランチは変更されません。あなたが行うことができますgit checkout -m <branch-name>ブランチと決意紛争に自分自身を競合し、チェックアウトをマージする、またはgit checkout -f <branch-name>変更を無視します。
samad montazeri

回答:


400

ブランチを変更するには、クリーンな状態が必要です。ブランチのチェックアウトは、「ダーティファイル」に影響を与えない場合にのみ許可されます(Charles Baileyがコメントで述べているように)。

それ以外の場合は、次のいずれかを行う必要があります。

  • 現在の変更を隠す
  • reset --hard HEAD (これらのマイナーな変更を失ってもかまわない場合)または
  • checkout -f (ブランチを切り替えるときは、インデックスまたは作業ツリーがHEADと異なっていても続行します。これは、ローカルの変更を破棄するために使用されます。)

または、最近:

インデックスまたは作業ツリーがHEADと異なっていても続行します。
インデックスと作業ツリーの両方が切り替えターゲットに一致するように復元されます。

これはとは異なります。これはgit switch -m <branch-name>、現在のブランチ、作業ツリーの内容の間で3者間マージをトリガーし、新しいブランチが実行されます。そのようにして進行中の作業を失うことはありません。


34
「ブランチを変更するには、クリーンな状態が必要です。」ブランチの変更が「ダーティファイル」に影響を与える場合にのみ当てはまります。
CBベイリー

10
stashメソッドについては、「git stash save」、「git checkout otherbranch」、最後に「git stash pop」と入力しました。
Venkat D.11年

1
現在、このエラーメッセージは表示されません。「git status」を実行すると、あるブランチで行った変更が別のブランチに表示されます。何か変わった?
Senthil A Kumar

2
ありがとう。チェックアウト-fは私が必要としたものでした。私はgit resetを実行しました--hard git clean -f git checkout mybranch -f
nologo

1
これは、ブランチの基本的な定義に違反することでGitが完全に間違った1つの大きなことです。gitブランチとは異なり、リポジトリから分岐した2つのまったく異なるワークスペースを意味します。
ニーム

125

変更を破棄したい場合は、

git checkout -- <file>
git checkout branch

変更を保持したい場合は、

git stash save
git checkout branch
git stash pop

10
実際、何Romerunが言う(完全なものにする):git stash save(branchY作業中)、その後git checkout branchX何かやるgit add/commit -mなどgit checkout branchYgit stash popスタッシュを取り戻すために
Highmastdon

2
多分そう。スタッシュの変更、XのYからスイッチし、変更をポップし、X上でそれらをコミット:私は答えが言う何をしたい場所のに、私は右のそれを理解していた場合、私は、状況を持っている
ベン・クライン

1
git stash save現在、非推奨となっていることに注意してくださいgit stash push
アルジェント

このエイリアスは、ブランチを変更するときに変更を保持するケースを簡素化します。
トム・ヘイル

62

まあ、それは

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
はい、スタッシュはグローバルであり、ブランチ固有ではありません。ブランチを切り替えた後にポップ
Aditya Mittal

6
注意git stashする必要がありますデフォルトになりますgit stash save
チャーリー-グリーンマン

ありがとう、それは私にとって非常に役に立ちます
Govind Kumar


16

リモートブランチをマージした場合、またはローカルコミットがあり、リモートHEADに戻りたい場合は、次のようにする必要があります。

git reset --hard origin/HEAD

HEAD 単独ではローカルのコミット/マージのみを参照します-すべての変更/コミットを完全にnukeしてリモートブランチに戻るつもりだったときに、リセットして「リポジトリはXコミット先です...」になると何度か忘れてしまいました。


9

ブランチを切り替えるときにGitも変更する必要があるファイルに変更を加えた場合、それはできません。作業中の変更を破棄するには、次を使用します:

git reset --hard HEAD

その後、ブランチを切り替えることができます。


9

リセットして隠した後でも、追跡されていないファイルが残っていたため、これらの回答はどれも役に立ちませんでした。私がしなければなりませんでした:

git reset --hard HEAD
git clean -d -f

4

変更を失って新しいブランチに切り替える:

git checkout -b YOUR_NEW_BRANCH_NAME --force

変更を失う既存のブランチに切り替える:

git checkout YOUR_BRANCH --force

4

簡単な答え:

ブランチを強制的にチェックアウトすることです

git checkout -f <branch_name>

ブランチを強制的にチェックアウトすることは、現在のブランチで行ったすべての変更を取り除き、必要なものをチェックアウトするようにgitに指示することです。

またはあなたがコミットをチェックアウトしている場合

git checkout -f <commit-hash>


「コミットせずにブランチを変更できると思いました。もしそうなら、どうすればこれを設定できますか?そうでなければ、どうすればこの問題を回避できますか?」

その答えは「いいえ」です。これは文字通りすべての変更を追跡するというGitの哲学であり、各ノード(つまり、コミット)は、あなたが行っていない限り、行った最新の変更で最新でなければなりませんもちろん新しいコミットをしました。


変更を続けることにしましたか?

次に、それらを使用して隠します

git stash

次に、目的のブランチで変更をアンスタッシュするには、次を使用します

git stash apply

これにより、変更が適用されますが、変更はstashキューにも保持されます。それらをスタッシュスタックに保持したくない場合は、

git stash pop

それはapply次に同等ですdrop


2

ターミナルを閉じ、プロジェクトがあるフォルダーを削除してから、プロジェクトとボイラーを再度複製します。


2
gitは、プロジェクトを削除して再度複製するように設計されていません!オリジンから最新バージョンを入手したい場合は、ただreset --hard
Ahmed Nour Jamal El-Din


1

コミットされていない変更を新しいブランチに移動する

.gitconfigこれのエイリアスを作成しました:

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

に変更するにはnew-branch-name、次を使用します。

git spcosp new-branch-name

また、コミットされていないファイルとインデックスの変更は保持されます。


1

git checkout -f your_branch_name

git checkout -f your_branch_name

変更を元に戻すのに問題がある場合:

git checkout .

追跡されていないディレクトリとファイルを削除する場合:

git clean -fd

0

git stashが機能しないときに、変更をコミットせずに他のブランチに切り替える。以下のコマンドを使用できます。

git checkout -fブランチ名

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