ローカルの変更を無視しながらGitをプルしますか?


489

git pullディレクトリを削除せずにローカルファイルの変更を無視して、実行する必要がある方法はありますgit cloneか?


17
「無視する」とは「上書きする」という意味ですか?
Cascabel 2010

@Cascabelこれは、すべてのローカルの変更を元に戻し、すべてのローカルコミットをコミット解除し、すべてのローカルの新しいファイルとディレクトリを削除し、すべてのローカルに削除されたファイルとディレクトリを元に戻すなどを行うことを意味しますrm -rf local_repo && git clone remote_url
ビクター

回答:


820

ローカルの変更をプルで上書きしたい場合は、作業ツリーがクリーンであるかのようにマージを実行して、作業ツリーをクリーンにします。

git reset --hard
git pull

追跡されていないローカルファイルがある場合git cleanは、それらを削除するために使用できます。使用しgit clean -f、人跡未踏のファイルを削除するために-df追跡されていないファイルやディレクトリを削除すると、-xdf人跡未踏または無視されたファイルやディレクトリを削除します。

一方、ローカルの変更をなんとかして保持したい場合は、プルする前にstashを使用してそれらを非表示にし、後で再適用します。

git stash
git pull
git stash pop

文字通り変更を無視しても意味がないと思いますが、プルの半分はマージであり、コミットされたコンテンツのバージョンとフェッチしたバージョンをマージする必要があります。


4
後にした場合git reset、あなたのファイルがまだリモート、読み取りと異なる stackoverflow.com/questions/1257592/...
大佐はパニック

3
Gitはこれまでで最も奇妙なものです。Gitのリセット-完了しました。それからgitステータス:あなたのブランチは2コミット進んでいます。
Shailen 2013年

21
@shailenTJここでの「ローカル変更」とは、ローカルコミットではなく、コミットされていない変更を意味します。git reset --hard後者ではなく前者に影響します。リモートの状態に完全にリセットしたい場合git reset --hard origin/<branch>-しかし、多くの場合、この場合、発生する前の2つのコミットは、実行した作業であり、破棄したいものではありません。
Cascabel 2013年

2
これは、ローカルリポジトリを破棄して再ダウンロードすることと同じですよね?便利なように、プルと強制変更を強制できるようにしたいだけです。99%の確率でこのエラーメッセージが表示されるのは、ローカルで何かを誤って変更して、リポジトリからやり直したい場合です。
sudo

もしあなたが地元の変化と頭をもつことができないならどうでしょうか?たとえば、リポジトリは大文字と小文字を区別するファイルシステムで作成され、大文字と小文字を区別しないファイルシステムに複製され、同じ名前の大文字と小文字が異なる2つのファイルがあるとします。
xster 2014年

305

私にとっては、以下がうまくいきました:

(1)最初にすべての変更をフェッチします。

$ git fetch --all

(2)次に、マスターをリセットします。

$ git reset --hard origin/master

(3)プル/更新:

$ git pull

22
トップアンサーで多くの問題を抱えていたとき、私にとってはうまくいきました。ありがとう!
0x0

6
これは、ローカルでの変更をコミットした後でも元に戻したい場合に機能します
agsachin

16
これがトップの答えになるはずです:)
Purus

5
@Marco Servetto:最初にすべてのgit変更をフェッチしますが、まだ適用していません。次に、マスターを最後の状態(更新済み)にリセットします。最初のステップをスキップすると、変更を古いマスター(ローカル)に戻します。私の経験から、私がそれを説明した方法は、決して問題を引き起こしません。他のすべての試みは最後に行います。
Artur Barseghyan 2017

1
これは私にとってはうまくいきました、私は削除されたファイルの回復を含む私のローカルな変更をすべて無視したいと思いました
Neri

28

あなたはちょうどと同じ結果を与えるコマンドが欲しいだけですrm -rf local_repo && git clone remote_urlよね?この機能も欲しい。私はgitのは、このようなコマンドを提供していない理由(のような不思議ではないgit reclonegit sync)、どちらのsvn(のようなそのようなコマンドを提供しませんsvn recheckoutsvn sync)。

次のコマンドを試してください。

git reset --hard origin/master
git clean -fxd
git pull

削除したいローカルコミットがすでにある場合でも、これが実際に機能します。
Yuri Ghensev

5
みんなに警告!git clean -fxdから.gitignoreもファイルを削除します。
Ramesh Navi

@RameshNavi確かに。これがまさに求められていることです。必要なのは、それを再クローンするためのより速い方法、つまりローカルリポジトリ全体を削除してからそれをクローンすることです。
ビクター

27

以下のコマンドは常に機能しません。あなただけの場合:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

等々...

本当にただやる、thebranchをダウンロードし、すべてのローカルの変更を上書きし、やり直します:


$ git checkout thebranch
$ git reset --hard origin/thebranch

これは問題なく動作します。

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
はい。これが究極の「ローカルなことについてFを与えない」アプローチに必要なものです。ありがとう。:)
アダムビーン2016年


8

git stashを見て、ローカルの変更をすべて「stashファイル」に入れ、最後のコミットに戻します。その時点で、隠しておいた変更を適用するか、破棄することができます。


8

Linuxを使用している場合:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

forループは、ローカルリポジトリで変更されたすべての追跡ファイルを削除するためgit pull、問題なく動作します。
これの最も良い点は、追跡されたファイルのみがリポジトリ内のファイルによって上書きされ、他のすべてのファイルは変更されないままになることです。


私はあなたが「追跡されたファイル」を意味していたと思います。
Ali

Powershellに相当するものはありますか?
Earlee

8

それを行うための最短の方法は次のとおりです。

git pull --rebase --autostash

--autostash以前は知りませんでした、ありがとう!
shiro

7

これは私のために働いた

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

受け入れられた回答では、競合エラーが発生します


これは2015年のArtur Barseghyanの回答と非常によく似ています...しかし、3番目のコマンドの目的が何であるかを知りたいのです。2番目のコマンドの後に作業ファイルが変更され、3番目のコマンドは「すでに最新です"
マイクげっ歯類

それが私の環境で機能した唯一の組み合わせです。多分あなたは別のものを見ているかもしれません。私にとって、私は3つのコマンドが必要でした
Pablo Pazos

面白い。バージョンのものかもしれません。私はgit 2.7.4を使用しています。しかし、Artur Barseghyanからの新しいコメントも見ました。「それ以外の場合、誤って古いマスターに取り組んでいる可能性があります。」
マイクげっ歯類

それは他の人を助けるかもしれないので、多分、私が言うことができる唯一のことは、「他の解決策がなかったとき、これは私のために働いた」さ
パブロPazos


2

これにより、現在のブランチがフェッチされ、マスターに早送りされます。

git fetch && git merge --ff-only origin/master

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