「gitpull」でローカルファイルを上書きするにはどうすればよいですか?

2009年07月14日に質問されました。  ·  閲覧回数 5.3M回  ·  ソース

Jakub Troszok picture
2009年07月14日

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

シナリオは次のとおりです。

  • チームメンバーが、作業中のWebサイトのテンプレートを変更しています
  • 彼らはいくつかの画像を画像ディレクトリに追加しています(ただし、ソース管理下でそれらを追加するのを忘れています)
  • 彼らは後で私にメールで画像を送っています
  • ソース管理下で画像を追加し、他の変更と一緒にGitHubにプッシュしています
  • Gitはファイルを上書きしたくないため、GitHubから更新をプルすることはできません。

これは私が得ているエラーです:

エラー:追跡されていない作業ツリーファイル 'public / images /icon.gif'はマージによって上書きされます

Gitにそれらを上書きさせるにはどうすればよいですか? その人はデザイナーです-通常、私はすべての競合を手作業で解決するので、サーバーには、コンピューターで更新する必要がある最新バージョンがあります。

回答

RNA picture
2012年01月17日
10735

•重要:ローカルで変更を加えると、それらは失われます。 --hardオプションの有無にかかわらず、プッシュされていないローカルコミットはすべて失われます。 [*]

Gitによって追跡されないファイル(アップロードされたユーザーコンテンツなど)がある場合、これらのファイルは影響を受けません。


まず、フェッチを実行して、すべてのorigin/<branch>参照を最新のものに更新します。

git fetch --all

現在のブランチをバックアップします。

git checkout -b backup-master

次に、2つのオプションがあります。

git reset --hard origin/master

または他の支店にいる場合:

git reset --hard origin/<branch_name>

説明:

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

次に、 git resetは、マスターブランチをフェッチしたものにリセットします。 --hardオプションは、作業ツリー内のすべてのファイルを変更して、 origin/master内のファイルと一致させます。


現在のローカルコミットを維持する

[*] :リセットする前にmasterからブランチを作成することで、現在のローカルコミットを維持できることに注意してください。

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

この後、古いコミットはすべてnew-branch-to-save-current-commits保持されます。

コミットされていない変更

ただし、コミットされていない変更は(ステージングされていても)失われます。 必要なものはすべて隠してコミットしてください。 そのために、以下を実行できます。

git stash

そして、これらのコミットされていない変更を再適用するには:

git stash pop
Travis Reeder picture
2010年05月10日
983

これを試して:

git reset --hard HEAD
git pull

それはあなたが望むことをするはずです。

David Avsajanishvili picture
2011年03月19日
481

警告: git cleanは、追跡されていないすべてのファイル/ディレクトリを削除し、元に戻すことはできません。


clean -fは役に立たない場合があります。 追跡されていないディレクトリがある場合は、-dオプションも必要です。

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

警告: git cleanは、追跡されていないすべてのファイル/ディレクトリを削除し、元に戻すことはできません。

最初に-n--dry-run )フラグを使用することを検討してください。 これにより、実際には何も削除せずに何が削除されるかが表示されます。

git clean -n -f -d

出力例:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...
Richard Kersey picture
2012年04月12日
400

ハリネズミのように、答えはひどいものだと思います。 ハリネズミの答えはもっと良いかもしれませんが、私はそれができるほどエレガントではないと思います。 これを行うために私が見つけた方法は、定義された戦略で「フェッチ」と「マージ」を使用することです。 これにより、強制的に上書きしようとしているファイルの1つでない限り、ローカルの変更が保持されるようになります。

最初に変更をコミットします

 git add *
 git commit -a -m "local file server commit message"

次に、変更をフェッチし、競合がある場合は上書きします

 git fetch origin master
 git merge -s recursive -X theirs origin/master

「-X」はオプション名であり、「theirs」はそのオプションの値です。 競合がある場合は、「自分の」変更ではなく、「自分の」変更を使用することを選択しています。

Johanneke picture
2013年04月26日
297

行う代わりに:

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

次のことをお勧めします。

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

オリジン/マスターブランチにリセットする場合は、すべてのリモートとブランチをフェッチする必要はありませんか?

Jakub Troszok picture
2009年07月14日
135

最初に行うのが最善の方法のようです。

git clean

追跡されていないすべてのファイルを削除してから、通常のgit pull続行するには...

Hedgehog picture
2012年02月12日
115

警告、これを行うと、gitignoreファイルにdirectory / *エントリがある場合、ファイルが完全に削除されます。

いくつかの答えはひどいようです。 David Avsajanishviliの提案に従うことで、@ Lauriに何が起こったのかという意味でひどい。

むしろ(git> v1.7.6):

git stash --include-untracked
git pull

後で、隠し場所の履歴をクリーンアップできます。

手動で、1つずつ:

$ git stash list
[email protected]{0}: WIP on <branch>: ...
[email protected]{1}: WIP on <branch>: ...

$ git stash drop [email protected]{0}
$ git stash drop [email protected]{1}

残酷なことに、一度に:

$ git stash clear

もちろん、あなたが隠したものに戻りたい場合:

$ git stash list
...
$ git stash apply [email protected]{5}
Vishal picture
2010年08月06日
95

このコマンドは、ローカルの変更を破棄するのに役立つ場合があります。

git checkout <your-branch> -f

次に、クリーンアップを実行します(作業ツリーから追跡されていないファイルを削除します)。

git clean -f

追跡されていないファイルに加えて追跡されていないディレクトリを削除する場合:

git clean -fd
Lloyd Moore picture
2012年11月22日
91

git pullとマージする代わりに、次のことを試してください。

git fetch --all

に続く:

git reset --hard origin/master

Chris BIllante picture
2011年05月06日
63

私のために働いた唯一のことは:

git reset --hard HEAD~5

これにより、5つのコミットが返され、

git pull

Gitマージを元に戻す方法を調べることでそれがわかりました。