2013-02-28 2 views
61

私はこれに関するすべての同様の質問を読みました。Git Pullが可能でない、結合されていないファイル

Delete offending files 
git reset --hard HEAD 
git stash 
git pull 

ほぼすべての組み合わせを、unmergableファイルに結果を変更しスタッシュ、リポジトリから引っ張っ:次のどれも働いていないようです。私はすべてのローカルの変更を破棄し、リモートを使用したいと思いますが、私は再びクローンできません(帯域幅とインターネットの使用制限がこれをしようとしている開発者にあります)。これはどうすればいいですか?

ちょうど試してみました:

git stash 
git pull 

も動作しませんでした。

詳細

ありローカルコミット1であり、上流にもコミットしています。私はこのようにしてgit pull --rebaseを試しましたが、まだ正常に動作していません...それは私にエラーを与えます - "解決されていない紛争のために終了"。私はgit stash, git reset --hard HEAD, git pull --rebaseをすれば、私はエラー「プルが可能、マージされていない変更はない...」を取得私は似たような状況に

git checkout -f <branch> 

で運を持っていた

答えて

146

がリモートでoriginで、分岐がmasterで言うと、あなたはすでにmasterがチェックアウトしたと言う、次のことを試してみてください:

git fetch origin 
git reset --hard origin/master 

これは、基本的には現在のブランチをとり、のHEADにそれを指し示しますリモートブランチ

WARNING:コメントで述べたように、これはローカルの変更を捨て起源上にあるものは何でもして上書きされます。

それとも、配管を使用することができ、本質的に同じことを行うためのコマンド:

git fetch <remote> 
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>) 
git reset --hard 

編集:私はこの作品理由を簡単に説明したいと思います。

.gitフォルダは、任意の数のリポジトリのコミットを保持できます。コミットハッシュは実際には、ランダムに生成された値だけでなく、コミットの内容の検証メソッドなので、リポジトリ間のコミットセットの照合に使用されます。

ブランチは、指定されたハッシュの名前付きポインタに過ぎません。ここで設定する例を示します

$ find .git/refs -type f 
.git/refs/tags/v3.8 
.git/refs/heads/master 
.git/refs/remotes/origin/HEAD 
.git/refs/remotes/origin/master 

これらの各ファイルは、コミットを指しているハッシュが含まれています

$ cat .git/refs/remotes/origin/master 
d895cb1af15c04c522a25c79cc429076987c089b 

これらは内部のgitストレージメカニズムのすべてであり、作業ディレクトリとは独立して動作します。以下にすることにより:

git reset --hard origin/master 

Gitはその起源/マスターポイントに同じハッシュ値で、現在のブランチを指します。次に、強制的に作業ディレクトリを変更して、そのハッシュのファイル構造/内容と一致させます。

git checkout -b test-branch 
# see current commit and diff by the following 
git show HEAD 
# now point to another location 
git reset --hard <remote>/<branch> 
# see the changes again 
git show HEAD 
+0

私はテストできませんこれはうまくいきませんでした。しかし、私は良い解決策を立てました。 –

+3

@timothyovこれは事実ですが、私はそれが暗示されたと感じていました。 –

+1

最近承認された編集から、冒頭に大量の警告が追加されました。すでに言及したように、「次に[git]は強制的に作業ディレクトリを変更して、そのハッシュのファイル構造/コンテンツに一致させます。しかし、それは十分に明白ではなかったと推測する。 –

3

。最初に、あなたが持っているすべての変更を捨てgit statusの出力を確認したいと仮定すると、

Undo delete in GIT

1

http://www.kernel.org/pub//software/scm/git/docs/git-checkout.html。ファイル名の横に「unmerged」と表示されている場合は、git add <unmerged file>を実行してください。その後、git reset --hardにフォローアップしてください。これは、追跡されていないファイルを除いて、ローカルの変更を取り除きます。

+0

さらに詳しい情報を追加しましたが、これはまだうまく機能していません。 –

+0

ああ、そうです。それは "unmerged"とは言わないかもしれません。それはまた、「改造された」か、あるいはおそらく1つまたは2つの他のものとも言える。 'git status'の出力は何ですか? –

+0

http://prntscr.com/ufyqw –

3

が解決、次のコマンドセット使用:

git reset --hard 
git pull --rebase 
git rebase --skip 
git pull 

はトリックが変更をリベースすることです...私たちはいくつかのトラブル些細なコミット1をリベースしていた、と私たちは単にgitのは--skipリベース使用して、それをスキップ(ファイルをコピーした後)。

1

私はローカルでマージされていないファイルを削除するにgitで解決しまった:先に行くと、以下を試してみるの仕事でこれを確認するには

$ git rm <the unmerged file name> 
$ git reset --hard 
$ git pull --rebase 
$ git rebase --skip 
$ git pull 
Already up-to-date. 

私はgitのを送って、その後コミット:

$ git commit . -m "my send commit" 
On branch master 
Your branch is up-to-date with 'origin/master'. 
nothing to commit, working directory clean 
0

ライアン・スチュワートの答えはほとんどなかったです。あなたが実際には、ローカルの変更を削除したくない場合は、マージするために使用できるワークフローがあります:

  • 実行git statusが。結合されていないファイルのリストが表示されます。
  • (など、手で)それらをマージ
  • 実行git commit

Gitは新しいにコミットだけマージをコミットします。 (私の場合は、ディスク上にファイルを追加しましたが、コミットに集中しませんでした。)

Gitはマージが成功したとみなし、前進することができます。

0

あなたはgit fetchを実行して、Gitはあなたが原因マージ競合(両方の変更/マージされていないファイルgit pullを実行するために、そしてあなたがより多くの不満を加えることができないされた後に、この問題を取得するために起こる場合は、それは勝ちましたまだマージされていないので、ファイル内の競合マーカーを表示しません)。仕事を失いたくない場合は、次のことができます。

ファイルをステージングします。

$ git add filename 

次にローカル変更を隠します。

$ git stash 

プルして更新作業ディレクトリ

$ git pull 

ローカルの変更されたファイル(それは、そうでない場合は、それを解決できる場合にgitが自動的にマージします)

$ git stash pop 

はそれに役立つことを願っを復元します。

関連する問題