2013-06-02 8 views
5

ローカルの変更があります(は別ファイルではありませんので、.gitignoreは動作しません。)私はコミットしたくありません。
私はgit reset --hardときどき変更をクリアするためにコミットした後も、私は残したいと思っていた便利な変更を失ってしまいます。

私は自分の役に立つ変更をどのように保つことができますか?git resetで生き残ったローカルな変更を保存する方法--hard

答えて

3

また、試すことができます。

git update-index --skip-worktree -- file 
# to cancel it: 
git update-index --no-skip-worktree -- file 

それはgit reset --hardを耐えなければなりません。 ( '--'ダブルハイフン使用のthis answerを参照してください)
このblog postを参照してください。

  • それはskip-worktreeのように見えますが、あなたのローカルデータを保存するのに非常に懸命にしようとしています。しかし、それが安全であれば上流への変化を防ぐことはできません。プラスgitはプルでフラグをリセットしません。しかし、 'reset -hard'コマンドを無視することは、開発者にとって厄介な驚きになる可能性があります。
  • assume-unchangedフラグはプル操作で失われる可能性があり、そのようなファイル内のローカル変更はgitにとって重要ではないようです。
    変更しないと仮定することは、開発者がファイルを変更しないことを前提としています。ファイルが変更された場合、その変更は重要ではありません。このフラグは、SDKなどの変更されていないフォルダのパフォーマンスを向上させるためのものです。しかし、約束が破られ、ファイルが実際に変更された場合、gitは現実を反映するためにフラグを元に戻します。おそらく、変更されていないフォルダには矛盾したフラグが付いていても問題ありません。

一方、skip-worktreeは、これまでに特定のファイルに触れないように指示するときに便利です。既に追跡されている設定ファイルには便利です。アップストリームのメインリポジトリはプロダクション対応の設定をホストしていますが、いくつかのローカルテストを実行できるように設定の一部の設定を変更したいとします。また、そのファイルの変更を誤って確認してプロダクション設定に影響を与えたくない場合もあります。その場合、skip-worktreeは完璧なシーンを作ります。

+0

ありがとう、それは動作します!どのように私はこの旗を削除できますか? – freemanoid

+1

@freemanoid単純に 'git update-index --no-skip-worktree -aFile' – VonC

+0

人間を見ているうちにこれを見つけられませんでしたが、そこにありました。だから '' 'git update-index -no-skip-worktree my_file'''が動作します。 – freemanoid

5

git stashを使用すると、一時的に変更を保存してから後で戻すことができます。Pro Git chapter on stashingを参照してください。

+0

はい私は '' 'git stash'''について知っていますが、毎回自分の変更を隠したくありません。 – freemanoid

+3

@freemanoid、大丈夫、あなたの想像上の 'git preserve-these-and-these-changes'コマンドは存在するとしようか。 'git reset -hard'を生き残るために何かを保存したいときは、その仮想コマンドを呼び出して、選択したファイルに設定されている保存状態を「元に戻す」もう1つのコマンドを呼び出す必要があります。これは 'git stash' /' git stash pop'とはどう違うのでしょうか? – kostix

1

これらの変更をコミットするのではなく、常にローカルに変更する必要がある場合は、ローカル変更のスクリプトまたはパッチファイルの作成とコミットを検討してください。その後、変更を保存して記録し、ハードリセット後に簡単に適用することができます。

環境に固有の変更がある場合は、それらを構成ファイルに外部化する価値があります。

関連する問題