2016-01-25 9 views
7

"git pull"を実行している間、gitは上書きしたいファイルのリンクを解除することができなかったので、操作を中止しました。私は、アプリケーションを閉じて、再実行「gitのプル」と次のエラーメッセージを取得しようとするとGitはプルの間にファイルのリンクを解除できませんでした - どうやってリポジトリの状態が矛盾しますか?

は:

"Error: Your local changes to the following files would be overwritten by merge: ..." 

明らか
"Error: The following untracked working tree files would be overwritten by merge: ..." 

、gitがちょうどロールを行わずプル中止され今すぐ引っ張られた変更が私のローカルな変更だと思っています。

どのようにしてこの状態から抜け出すことができますか?私たちはたくさんのファイルについて話しています。 "git revert"を実行する前に、私の側からローカルな変更があった場合、手動で各ファイルをチェックする必要があります。

注:gitは、クライアントとサーバーのような設定で使用されています。分散開発者は中央のbitbucketリポジトリに頻繁に "プル"し、 "&をコミット"します。

+0

誰かがこの質問に回答しました(jan 25th)、答えは消えましたか? stash - > pullを使用して提案された解決策は実行できませんでしたか? – Stiefel

+1

'git merge --abort'はどうなっていますか? – Vorac

+0

私は受け入れられる解決策を見つけました(私の答えは下記参照)。また、このgitの動作をバグと見なしますか? – Stiefel

答えて

3

上記の方法のどれも私のために働いていないので、私は完全に自動ではありませんが、手作業で選択したいくつかのファイル(50ではなく私の場合)に手間を軽減します。

そして、今、単純にすべてのファイルを上書きするスタッシュからチェックアウトを

git pull       

を使用して、以前に失敗したことを、プルをやり直す

git stash save --all    

を使用してまずスタッシュ(人跡未踏と無視を含む)すべてのファイル、最初のプル(差し込みの試行なし)で変更されたもの:

git checkout stash -- .   

今すぐ1つの問題が残っています。サーバーで失敗したプルと2番目のプルの間の変更が上書きされるようになりました。しかし、それらはほんの数ファイル(2つの 'プル'の時間が短い場合)でなければなりません。自分で作った作業の変更のリストで識別するのがはるかに簡単です。最後のコミットを行う前に、それらを単に "元に戻す"(私はTortoise GITコミットダイアログを使用しました)。

git commit 
git stash drop 
0

git reset --merge 
git fetch --all 
git reset --hard origin/master 

を試すか、あなたには、いくつかの他のブランチ上にある場合

git reset --hard origin/your_branch 

説明:

git fetchをマージしたり、何かをリベースしようとせずに、リモートからの最新情報をダウンロードします。

次に、git resetは、先ほどフェッチしたものにマスターブランチをリセットします。 --hardオプションは、原点/マスター内のファイルを一致させる作業ツリー内のすべてのファイルを変更し、リセットする前masterからブランチを作成することにより、現在のローカルコミットを維持することが可能であることは注目に値します

git checkout master 
git branch new-branch-to-save-current-commits 
git fetch --all 
git reset --hard origin/master 
+0

私は最初の3つのコマンドを試しました - 私のローカル(コミットされていない)変更はなくなりました。 – Stiefel

2
git reset --hard 

そのコミットの状態にすべての追跡ファイルをリセットします。

git clean -df 

は、残りのすべての人跡未踏、unignoredファイルを一掃します。

次に、プルをやり直すことができます。プレーンマージがそれを行います、あなたはすでにフェッチをしました。


私は行動の原因Windowsがファイルが動作するように望んでいるかの違いにかなり確信しています。 Unix-landでは、ファイルを開いたらディレクトリエントリが解放されます。あなたが見ているエラーはUnixシステムでは起こりません。開いているファイルは一時的になり、何らかのプロセスに開いたままである限り、存在します。 Unixのやり方には欠点があります。あなたはWindowsの欠点を見ています。回避策は十分に簡単で、リセットしてクリーンアップするのは、あなたの建設現場のクリーンアップクルーです。それは名誉ある仕事であり、彼らを知り、彼らのことを知っています。

+0

しかし、 "git reset --hard"を使用すると、私のローカルの未変更の変更はすべて無くなります。 – Stiefel

+0

git cleanは、すべてのuntrackedファイルを削除します。私がこの権利を理解すれば、この答えは私が達成しようとしていることとは反対のものです。 – Stiefel

+0

明確にするには:すべてのファイルに対してコミットを行う前に "git pull"を行うのはおそらく私たちの間違いであり、悪い習慣です。 – Stiefel

関連する問題