「マージする前に変更をコミットするか、隠しておく」というgitを解決するにはどうすればよいですか?


763

ローカルマシンでいくつかの更新を行い、それらをリモートリポジトリにプッシュしました。次に、サーバーに変更をプルしようとしていますが、メッセージが表示されます。

エラー:次のファイルに対するローカルの変更は、マージによって上書きされます:

wp-content / w3tc-config / master.php

マージする前に、変更をコミットするか、隠しておいてください。

だから私は走った、

git checkout -- wp-content/w3tc-config/master.php

もう一度試したところ、同じメッセージが表示されました。私はそれw3tcがサーバー上の設定ファイルで何かを変更したと仮定しています。ローカルコピーとリモートコピーのどちらがサーバーに移動するかは気にしません(リモートコピーが最適だと思います)。残りの変更(プラグインの更新)をマージできるようにしたいだけです。

何か案は?



11
これは、より詳細でより適切な回答を含む、より明確な質問です。これを持ち続けることは価値があると思います。はい、もう1つは技術的に最初に尋ねられましたが、これを削除すると、人々が探している答えを見つけるのが難しくなります。
Jo Sprague

回答:


1301

ローカルの変更とマージすることはできません。Gitは、潜在的に重要な変更を失うことからユーザーを保護します。

次の3つのオプションがあります。

  • を使用して変更をコミットします

    git commit -m "My message"
    
  • それを隠します。

    スタッシングはスタックとして機能し、変更をプッシュして、逆の順序でポップすることができます。

    隠しておくには、

    git stash
    

    マージを実行してから、スタッシュを引き出します。

    git stash pop
    
  • ローカルの変更を破棄する

    git reset --hard
    またはを使用してgit checkout -t -f remote/branch

    または:特定のファイルのローカル変更を破棄します

    を使用して git checkout filename


104
特定のファイルのローカル変更を破棄することもできます:git checkout filename
ckb

6
ありがとう。これに追加します。もしそうであれば、git reset --hard追跡されていないファイルも削除したいかもしれませんgit clean -dfx
Jo Sprague '29

13
デフォルトgit stashでは、履歴のないファイルは隠しません。したがって、まだ追加されていないが、マージによって上書きまたは「作成」されるファイルがある場合でも、マージはブロックされます。そのような状況では、git stash -uコミットされていないファイルを隠しておくためにも使用できます。または、それらを削除することもできます!
joeytwiddle 14年

25
走ることgit clean -dfxはひどい考えでした。実際に必要な.gitignoredファイルをいくつか削除しました。
ezuk 2014年

5
ユーザーがを実行した後git reset --hardも、まだマージされていない変更がある状況に遭遇しました!
Amedee Van Gasse、2015年

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

最初のコマンドは、変更を一時的にstashに保管し、作業ディレクトリーから削除します。

2番目のコマンドはブランチを切り替えます。

3番目のコマンドは、stashに保存した変更を復元します(この--indexオプションは、ステージングされたファイルがまだステージングされていることを確認するのに役立ちます)。



2
@vikramviのポイントを説明するために:のgit stash pop代わりに使用することもできgit stash applyます。前者は保管場所からそれを削除しますが、後者はそれを保持します
アヌパム

27

次のいずれかの方法を試すことができます。

リベース

単純な変更については、変更をプルしながら、その上にリベースしてみてください、例えば

git pull origin master -r

そのため、フェッチ後に現在のブランチを上流のブランチの上に適用します。

これは同等です:checkout masterfetchそしてrebase origin/mastergitのコマンド。

これは潜在的に危険な操作モードです。それは歴史を書き直しますが、あなたがすでにその歴史を公開したときは、それはうまくいきません。git-rebase(1)注意深く読んでいない限り、このオプションは使用しないでください。


チェックアウト

ローカルの変更を気にしない場合は、一時的に(強制的に)他のブランチに切り替えて、元に戻すことができます。

git checkout origin/master -f
git checkout master -f

リセット

ローカルの変更を気にしない場合は、HEAD(元の状態)にリセットしてみてください。たとえば、

git reset HEAD --hard

上記の方法で問題が解決しない場合は、git正規化ファイル(.gitattributes)のルールである可能性があるため、内容をコミットすることをお勧めします。または、ファイルシステムが権限をサポートしていないためfilemode、git設定で無効にする必要があります。

関連:「git pull」でローカルファイルを強制的に上書きするにはどうすればよいですか?


1
機能しません。「最初に変更を隠しておく」のような同じメッセージが表示されます。「git stash」と入力して「git pull」と入力すると、「エラー:変更が保存されていません。最初にstashを実行してください」。私のコンピューターを破壊する直前
trinity420

@ trinity420それはあなたのファイルのアクセス許可でgit statusある可能性があります。回答がない場合は、新しい質問を追加することを検討してください。
ケノーブ2018年

ありがとうしかし、私の問題は... PHPStormに「変更をコミット」「マージ」をクリックして、I unstashed変更をし、それが働いた後、何も働いていない、ここですべてを試み、解決
trinity420


13

だから私が遭遇した状況は次のとおりでした:

エラー:次のファイルに対するローカルの変更は、マージによって上書きされます:wp-content / w3tc-config / master.phpマージする前に、変更をコミットするか、それらを隠してください。

ただし、その直前はリモートでしたが、実際には次のようになっています。

リモート:エラー:次のファイルに対するローカルの変更は、マージによって上書きされます:some / file.extマージする前に、変更をコミットするか、それらを隠してください。

起こっていたのは(100%ポジティブではないと思う)git post receiveフックが実行を開始し、リモートサーバーリポジトリの移動の変更が原因で台無しになっていたことです。

ですから、post-receiveフックをたどって追跡し、これを見つけたのは、サーバーのリモートリポジトリに移動する必要があり、変更がありました(実際には、ローカルリポジトリにはありませんでした)一致している、変更なし、コミットするものがない、最新などであると言いました)したがって、ローカルでは変更はありませんでしたが、サーバーで変更git checkout -- some/file.extを行い、ローカルとリモートのリポジトリを実際に一致させて、引き続き作業し、展開します。この状況がどのように発生したかは完全にはわかりませんが、数十人の開発者とITの変更が関係している可能性があります。


2
質問ですか、それとも回答ですか。
stdcall 2013年

2
@stdcall-両方のビット。質問に記載されているようにこの状況に遭遇したとき、これはそれを修正するために私がしなければならなかったものです。それは間違いなく通常のgitの解決ではなく、質問から、それは同じ異常な状況である可能性があるように見えます(つまり、サーバーの構成変更ですが、ローカルには変更がありません)。これがなぜ(またはどのように)起こったのかについて誰かがもっと考えを持っているなら、私はどんな洞察も歓迎します。
Mike

7

警告:これは追跡されていないファイルを削除するので、この質問に対する良い答えではありません。

私の場合、ファイルを保持したくなかったので、これは私にとってはうまくいきました:

Git 2.11以降:

git clean  -d  -fx .

古いGit:

git clean  -d  -fx ""

参照: http //www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -xは、無視されたファイルとgitに認識されていないファイルも削除されることを意味します。

  • -dは、追跡されていないファイルに加えて、追跡されていないディレクトリを削除することを意味します。

  • 強制的に実行するには-fが必要です。


4

この問題を解決しながら、新しく作成したファイルの記録を保持するには:

あなたが持っている場合は、新しく作成されたファイルを、あなたは、ローカルな変更のパッチを作成して、リモート・マージでプルとリモートマージした後、あなたの地元のパッチを適用することができ、以下のステップで定義されたステップとして完了です。

  1. ローカルの変更をステージングします。(コミットしないでください)。新しく作成されたファイルのパッチを作成するにはステージングが必要です(まだ追跡されていないため)。

git add .

  1. 記録を残すパッチを作成する

git diff --cached > mypatch.patch

  1. ローカルの変更を破棄し、新しいローカルファイルを削除する

git reset --hard

  1. 変更をプル

git pull

  1. パッチを適用する

git apply mypatch.patch

Gitは変更をマージし、マージされていない変更の.rejファイルを作成します。

Anuが提案したように、パッチの適用に問題がある場合は、以下を試してください。

git apply --reject --whitespace=fix mypatch.patch この回答git:パッチはこの問題に関する詳細な話を適用しません

機能の継続的な作業を楽しんで、完了したらローカルの変更をコミットします。


新しい変更でコードの一部をプッシュしたかったので、1.ローカルの開発ブランチからパッチを作成しました2.ハードリセットを実行しました3.マスターからdevに新しい変更をプルします(マージの競合を回避するため)4 。ローカルerror: patch failed: yourfile.py:33 error: yourfile.py: patch does not applyの開発5.で小さな変更を行いました5.リモートの開発6.にプッシュしました6.パッチを適用しました->エラーが発生しました:まだmypatch.patchがありますが、適用されない理由がわからず、変更を失いました!
Anu

私はそれを手に入れました、正しいコマンドはgit apply --reject --whitespace=fix mypatch.patch、私の変更を元に戻しました!!! [おかげで](stackoverflow.com/a/15375869/6484358
Anu

1
Anu、コマンドgit apply mypatch.patchはパッチを適用するのに正しいです、これは私がいつも使用するものです、作成されたパッチ自体にいくつかの問題があるかもしれません、そしてあなたがパッチを手に持っていれば変更を失うことはありません、それ統合されたすべての変更が含まれています。
Manpreet

2

プルする前にコミットを要求する

  • git stash
  • git pull origin <<ブランチ名>>

必要に応じて :

  • git stash apply

1
作業ディレクトリとインデックスの現在の状態を記録したいが、クリーンな作業ディレクトリに戻りたい場合は、git stashを使用してください。このコマンドは、ローカルの変更を保存し、HEADコミットに一致するように作業ディレクトリを元に戻します。
Pushpak Sharma

2

私にとっては git reset --hard働いたです。

コミットするものがなかったので、コミットすることは選択肢ではありませんでした。

隠しておくものがなかったので、隠しておくことは選択肢ではありませんでした。

除外されたファイル.git/info/excludeや、git update-index --assume-unchanged <file>いくつかのファイルを削除したことが原因である可能性があります。


0

私の場合、Gitが不平を言っていたファイルをバックアップしてから削除してコミットしたところ、ようやく別のブランチをチェックアウトすることができました。

次に、ファイルを置き換え、内容をコピーして戻し、何も起こらなかったかのように続けました。



0

私は最初の答えを試しました: git stash最高のスコアでエラーメッセージがポップアップしましたが、この記事で「Reluctant Commit」の代わりに変更をコミットすることがわかりました

そしてエラーメッセージがついに消えました:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

その後、うまくいきました。この回答がお役に立てば幸いです。


0

Git拡張機能を使用している場合は、Working directory以下に示すようにでローカルの変更を見つけることができるはずです。

ここに画像の説明を入力してください

変更が表示されない場合は、おそらく間違ったサブモジュールを使用していることが原因です。以下に示すように、潜水艦のアイコンが付いたすべてのアイテムを確認してください。

ここに画像の説明を入力してください

コミットされていない変更を見つけた場合:

で行を選択し、[ 差分 ]タブWorking directoryに移動します。鉛筆(またはまたは)アイコンで行を右クリックし、[ リセット ]を選択して、最初にコミットするか、コミットするか、隠しておくか、またはそれを使用して行います。+-


0

私にとってこれはうまくいきました:

git reset --hard

その後

git pull origin <*current branch>

その後

git checkout <*branch>


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