git で強制的に pull する方法

ようやく悩みが解消されたのでメモ.

Visual Studio 辺りのプロジェクト・ファイル群を丸ごと git リポジトリで管理していると,(自動生成されるファイルなどの関係で)手動では何も変更を加えていない(ビルドしただけなど)にも関わらず git pull 時に衝突が発生すると言う問題に悩まされていました.今まで,そう言った自動生成されるファイルを git リポジトリに登録するのが悪いと .gitignore を頑張って記述してみたり,git add . みたいに,適当な形でレポジトリインデックスに追加しないなどいろいろやってみましたが,なかなか上手くいきませんでした.

そんな感じで悩んでいたところ,衝突が発生したときに git status を眺めていると以下のようなメッセージが書かれてありました.

$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)

git checkout -- filename とコマンドを打つと filename の(最終コミット後の)ローカル上での修正は全て破棄して,レポジトリの内容を反映するインデックスの状態に戻すようです.したがって,以下のようなコマンドを打つことによって強制的に pull する事ができます.

$ git checkout -- .
$ git pull origin master

これをやってしまうと手作業で修正したものまで消えてしまうので何も考えずに実行するのは危険ですが,「ビルドしただけなのに!」と言うような場合には有効かと思います.

追記1

@tt_clown 強制的にpullしているわけではないですよ。あと、--はブランチ名とファイル名の区別のためにあるので、ブランチに指定できない「.」は--不要です

http://twitter.com/bleis/status/21998040372

そんな訳で,上記コマンドの「--」は不要だそうです.タイトルに関しては,正確には「最終コミット後のローカル上での編集を破棄する方法」くらいでしょうか.

追記2

b:id:Shinnya 「ローカル上での修正は全て破棄して,レポジトリの内容を反映するようです.」 リポジトリというか,インデックスですね

http://b.hatena.ne.jp/entry/d.hatena.ne.jp/tt_clown/20100824/1282653712

この辺りの関係をほとんど把握していませんでした.ググってみると,リポジトリとインデックスとワークツリー - 日々之迷歩 と言う記事がヒットしました.

Gitを理解するうえで、リポジトリ、インデックス、ワークツリー(作業ファイル群)の関係を把握しておくことが重要みたいだ。

・・・(中略)・・・

gitで復活の呪文はcheckoutだと理解していたのだが、これは作業ファイルをリポジトリの内容ではなくインデックスの状態に戻すということだ。

checkoutは指定されたファイルをインデックスに記録されている状態から復帰するという意味だ。Gitでは「現時点での最新のコミット」をHEADと呼ぶ。HEADを指定すると、最新のコミットされた内容(最新のリポジトリ)に復帰する。

リポジトリとインデックスとワークツリー - 日々之迷歩