98

私はこれに関する同様の質問をすべて読みました。次のいずれも機能していないようです。

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

ほぼすべての組み合わせ、変更の隠蔽とリポジトリからのプルにより、マージできないファイルが生成されます。すべてのローカル変更を破棄してリモートを使用したいのですが、再度クローンを作成できません(開発者がこれを実行しようとすると、帯域幅とインターネットの使用制限があります)。どうすればよいですか?

試したばかり:

git stash
git pull

また、動作しませんでした。

より詳しい情報

ローカルコミットが1つあり、アップストリームにもコミットがあります。私はこのように試しましgit pull --rebaseたが、それでも正しく機能していません...それは私にエラーを与えます-「未解決の競合のために終了します」。そうするとgit stash, git reset --hard HEAD, git pull --rebase、「プルできません、マージされていない変更...」というエラーが表示されます。

4

9 に答える 9

218

リモートがoriginで、ブランチがmasterで、すでにmasterチェックアウトしたとします。次のことを試してみてください。

git fetch origin
git reset --hard origin/master

これは基本的に、現在のブランチを取得し、それをHEADリモート ブランチの にポイントするだけです。

警告: コメントに記載されているように、これはローカルの変更破棄し、origin にあるもので上書きします

または、配管コマンドを使用して、本質的に同じことを行うことができます。

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 は、origin/master が指すのと同じハッシュ値で現在のブランチを指します。次に、そのハッシュのファイル構造/コンテンツと一致するように作業ディレクトリを強制的に変更します。

これが機能していることを確認するには、次のことを試してください。

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
于 2013-02-28T06:51:05.853 に答える
7

私は運が良かった

git checkout -f <branch>

同様の状況で。

http://www.kernel.org/pub//software/scm/git/docs/git-checkout.html

GIT で削除を元に戻す

于 2013-02-28T03:52:17.890 に答える
7

次のコマンド セットを使用して解決しました。

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

トリックは変更をリベースすることです... 1 つの些細なコミットをリベースするのに問題があったため、(ファイルをコピーした後) git rebase --skip を使用して単純にスキップしました。

于 2013-02-28T04:24:51.103 に答える
1

マージされていないファイルをローカルで削除することで解決しました。

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

後で git commit を送信すると:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
于 2016-06-01T05:55:07.310 に答える
1

行った変更をすべて破棄する場合は、まず の出力を確認してくださいgit status。横に「マージされていません」と表示されているファイルについては、 を実行しますgit add <unmerged file>。その後、 でフォローアップしgit reset --hardます。これにより、追跡されていないファイルを除いて、ローカルの変更がすべて削除されます。

于 2013-02-28T03:58:23.550 に答える