質問:
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にそれらを上書きさせるにはどうすればいい?その人(上書きされる人)はデザイナーで、通常は僕がそれらの競合を手作業で解決するから、サーバーには最新のバージョンがあって、彼らはただ彼らのコンピュータ内のファイルをで更新するだけでいいんだ。
回答1:
重要:ローカルで変更があった場合、それらは失われる。--hard
オプションがあろうがなかろうが、プッシュされていないローカルコミットは失われる[*]
Gitによって管理されてないファイルがある場合(例えば、アップロードされたユーザコンテント)、これらのファイルは影響を受けません。
僕ははこれが一番いい方法だと思う:
|
次に、2つのオプションがある。
|
または、他のブランチにいる場合:
|
説明:
git fetch
は、マージやリベースを試みずにリモートから最新のものをダウンロードする。
次に、 git reset
はマスターブランチを君がちょうど取得したものにリセットする。--hard
オプションは作業ツリー内のすべてのファイルをorigin/master
内のファイルに合わせて変更
[*]:リセットする前に master
からブランチを作成することによって現在のローカルコミットを維持することは可能であることは知っておくべきだと思う:
|
この後、すべての古いコミットは new-branch-to-save-current-commits
に保存される。ただしコミットされていない変更は(stagedのものでさえも)失われます。
だから必要なものを隠して、コミットしてね。
回答2:
これを試してみれば?:
|
それで望む挙動になると思う。
回答3:
警告: git clean
はあなたの追跡されていないファイル/ディレクトリをすべて削除し、元に戻してしまうのに注意。
場合によっては clean -f
が役に立たないこともある。untrackedなディレクトリがある場合、-dオプションも必要だよ:
|
警告: git clean
はあなたの追跡されていないファイル/ディレクトリをすべて削除し、元に戻してしまうのに注意。