git pullで強制的にローカルファイルを上書きするには? [Git]

このエントリーをはてなブックマークに追加

質問:

git pullでローカルファイルを強制的に上書きするにはどうしたらいいの?

やろうとしてるのはこんな感じ:

  • チームメンバーが取り組んでいるウェブサイトのテンプレートを変更
  • 彼らは画像ディレクトリに画像を追加(ただし、ソース管理の下に追加することは忘れてる)
  • 彼らは僕に「後で」メールで画像を送ってくる
  • で、僕が画像をソースコントロールの下に追加して、GitHubに他の変更と一緒に押し込んでる
  • でもGitはファイルを上書きしたくないので彼らはGitHubから更新をpullできない

出て来るエラーは次の通り:

error: Untracked working tree file ‘public/images/icon.gif’ would be overwritten by merge.
(訳:エラー:未処理の作業ツリーファイル’public/images/icon.gif’がマージによって上書きされます。)

Gitにそれらを上書きさせるにはどうすればいい?その人(上書きされる人)はデザイナーで、通常は僕がそれらの競合を手作業で解決するから、サーバーには最新のバージョンがあって、彼らはただ彼らのコンピュータ内のファイルをで更新するだけでいいんだ。

By Jakub Troszok | 質問日時: 2009年7月14日 14:58



回答1:

重要:ローカルで変更があった場合、それらは失われる。--hardオプションがあろうがなかろうが、プッシュされていないローカルコミットは失われる[*]

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


僕ははこれが一番いい方法だと思う:

git fetch --all

次に、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に保存される。ただしコミットされていない変更は(stagedのものでさえも)失われます。
だから必要なものを隠して、コミットしてね。

By RNA | 回答日時: 2012年1月17日 0:02



回答2:

これを試してみれば?:

git reset --hard HEAD
git pull

それで望む挙動になると思う。

By Travis R | 回答日時: 2010年5月9日 19:45



回答3:

警告: git cleanはあなたの追跡されていないファイル/ディレクトリをすべて削除し、元に戻してしまうのに注意。


場合によっては clean -fが役に立たないこともある。untrackedなディレクトリがある場合、-dオプションも必要だよ:

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

警告: git cleanはあなたの追跡されていないファイル/ディレクトリをすべて削除し、元に戻してしまうのに注意。

By David Avsajanishvili | 回答日時: 2011年3月19日 9:10



Source: How do I force “git pull” to overwrite local files?

共有 コメント