gitコマンドでローカルの変更ファイルをコミット前に元に戻す

gitコマンドでローカルの変更ファイルをコミット前に元に戻す

Software(Tips)gitコマンドでローカルの変更ファイルをコミット前に元に戻す

最近携わったプロジェクトには、Capistrano で構成されたデプロイの仕組みがあるのですが、その中のタスクで書かれていた gsed のコマンドが実行時エラーになってしまいました。

Mac を使っていると GNU sed は gsed を使うことになるのですが、Linux では sed なのでコマンドが異なって見つかりません事件となります。今回、デプロイタスクの設定ファイル(deploy.rb)に記述されている置換処理が gsed で git 管理されているので、この問題に遭遇してしまいました。

少人数のプロジェクトでは、本番サーバや本番の前(ステージングと一般的には呼ばれる?)サーバにデプロイする人も限られますし、私は最近は Jenkins のような CI サーバを使ってデプロイしていたので、Capistrano は初めてでした。

まあ、今回の問題は Capistrano とは無関係なのですが、この設定ファイルの処理を sed にすると Mac の人がタスク実行した時に困るわけなので、取り急ぎ手元のファイルの gsed を sed に書き換えて、ファイルの変更を無効(gitにプッシュしない)にすることでその場凌ぎしました。

ソース管理下のファイルの変更

さて、デプロイタスクのファイルを触ったことで、ローカルで変更ファイルができてしまったので、これを取り消します。

$ git diff

- gsed -i "s/abc/xyz/g" config/deploy.rb
+ sed -i "s/abc/xyz/g" config/deploy.rb

変更ファイルをコミット前に戻すには git checkout を使います。ブランチを切り替える時に使うというイメージの checkout でしたので、半信半疑ながらもファイルを指定して実行します。

変更前の状態に戻すのは、Subversion の時と同じく revert かなっと思っていましたが、git の場合はローカルリポジトリへのコミット後は revert や reset を使う場面があるものの、コミット前は checkout になります。

$ git checkout config/deploy.rb

これで変更点はなくなりました。git diff で差分が出てこなくなれば OK です。

$ git diff

sedとgsedの両方に対応する

ただし、このままでは git で管理されているファイルに gsed が書かれている以上、今後も同様の状況に陥るのでどうにかしないといけません。Mac を使っている人に知らないところで影響を与えるわけにはいかないので自分の環境に手を加えてみます。

まず試したのは gsed というエイリアスを作ってみることです。sed のエイリアスとして gsed を作成することで代用できるかなっと思いました。

$ vi /root/.bashrc

alias gsed='sed'

$ source /root/.bashrc

これでいけるでしょって思いながら実行してみると gsed がないとエラーに・・・。Capistrano の中で実行されるシェルのコマンドに、エイリアスは適用されないということでしょうか。

そもそも Capistrano のデプロイタスクにシェルを書いている時点でタブーらしいですが、何でもかんでも ruby で書くのも効率悪いので、これはこれでアリだと思うのですよね。

次の候補はシンボリックリンク。これならいけるでしょっていう期待はありましたが、無事実行されました。

$ ln -sf /bin/sed /bin/gsed

ソース管理下のファイルの変更

話が gsed の方へ大きく逸れてしまいましたが、ちなみにコミット前の変更ファイル全部を無効にするには checkout でドットを指定します。

$ git checkout .

最終更新日:

関連記事

人気記事

新着情報