我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

BaseSASユーザのためのGit(その3:sasプログラムの問題と変更の破棄)

前回はブランチを切って、修正したプログラムをコミットしてmasterにマージする、という作業を行いました。

日本語(DBCS:ダブルバイト文字)の入力

さて、今回はまた別の修正をしましょう。今度は「fix_comment」というブランチを作成して、プログラムに以下のようなコメントを入れてみます。



/* テストプログラム */
/* 作成日:2021/12/07 */
data class;
...

こんな感じで保存してSourceTreeをチェックします。


あれ?文字化けしていますね。(文字化けしていなければここはスキップしてしまって構いません)

f:id:japelin:20211207172045p:plain
日本語部分が文字化けしている

そうです、SASでプログラムを作成すると文字化けするんです。
これは、SASSAS日本語版)のプログラム自体がShift-JIS、所謂シフトJISという文字コード体系で動作しているのに対し、GitではUnicodeutf-8という文字コードで管理しているからなのです。


GitでシフトJISを使用する方法については、いくつか方法があるようなのですが、おすすめしません。
Git自体がUnicodeに最適化されており、シフトJISでは正しく動かなかったり、やっぱり一部が文字化けしてしまうことがあるためです。


ではどうするか。
SASプログラムファイルのエンコードutf-8に変更します。

エンコードutf-8に変更

以下はSASの名前をつけて保存のダイアログですが、ここでUnicodeUTF-8)を選択して、プログラムファイルをUnicodeで保存するのです。

f:id:japelin:20211207172148p:plain
実はエンコーディングを指定できる

なお、utf-8にはBOMありとBOMなしがありますが、SASではBOMありがおすすめです。
BOMありであれば、SAS日本語版であっても自動的にutf-8であると識別してくれるためです。
(BOMについては割愛します。エンコーディングのフラグのようなものです。)


その代わり、プログラムを読み込むたびに以下のようなNOTEが表示されます。

f:id:japelin:20211207172227p:plain
BOMありutf-8であることを示すNOTE

BOMなしのutf-8プログラムファイル

明示的にBOMなしファイルとして読み込めばSASでも正しく識別しますが、明示しない場合は文字化けが発生するため、注意が必要です。
例えば、

  • 開くダイアログでエンコードを指定して、BOM無しにチェックをする。→OK
f:id:japelin:20211207172358p:plain
デフォルトはAuto-Detect
  • プログラムで以下のようにエンコーディングとbom無しを意味するnobomオプションを指定する。→OK
filename a "C:\Users\FMVtest\Documents\Git\SAStest\class.sas" encoding='utf-8' nobom; 
%inc a /source2;
f:id:japelin:20211207172541p:plain
正しく認識されている
  • nobomを明示しない場合→文字化け
filename a "C:\Users\FMVtest\Documents\Git\SAStest\class.sas"; 
%inc a /source2;
f:id:japelin:20211207172700p:plain
自動認識ではutf-8であってもBOM無しのファイルは文字化けしてしまう


プログラムをダブルクリックしてSASを起動する、%incでプログラムファイルを読み込んでいる、といった使い方をしているのであれば「BOM有り/付き」にしておくが無難です。
以降は「BOM有り/付き」で話を進めます。

メモ帳でのエンコーディング

なお、メモ帳については今のWindows10においてはデフォルトがUTF-8になっていますが、「BOMなし」なので「BOM付き」で保存するように指定する必要があります。

f:id:japelin:20211208104740p:plain
BOMは選択しないといけない

文字化けしていては困ってしまうのでsasプログラムをutf-8に修正したいと思います。
sasでプログラムを開いて、utf-8として保存するか、メモ帳等のエディタで開いて、utf-8(BOM付き)として保存し直します。

SourceTreeを確認すると、追加分がきちんと認識されているのが確認できるかと思います。


変更の破棄

コメントを2行追加しましたが、1行目は変更を破棄したいと思います。
こういった場合、プログラムファイルを開いて自分で行を削除するのではなく、SourceTreeから処理が可能です。


差分を表示している部分に「Hunkをステージへ移動」「Hunkを破棄」というボタンがあります。
また、変更行をクリックすると、そのボタンが「選択した行をステージへ移動」「選択した行を破棄」という表示に変わります。

f:id:japelin:20211209102606p:plain
通常はHunkに対するボタン
f:id:japelin:20211209102530p:plain
行を選択すると、ボタンの表示が変わる


1行目を選択したまま、「選択した行を破棄」をクリックし、確認ダイアログでOKをクリックします。

プログラムを開き直してください。
1行目がなくなっているのがわかると思います。

f:id:japelin:20211209102652p:plain
1行目が破棄される
f:id:japelin:20211209102751p:plain
SourceTreeでの処理が反映されている
Hunkの破棄

変更が広範囲に渡る場合は、Hunkも複数識別されます。
「Hunkを破棄」を選べば、表示されている変更部分をまとめて元に戻すこともできます。


選択行破棄の注意点

通常は+行と-行をセットで破棄することで元に戻せます。
+行だけ破棄した場合、削除した行は-としてHunkに残りますから、プログラムでは行の追加だけがなかったことになります。
-行だけ破棄した場合、追加した行は+としてHunkに残りますから、プログラムの行削除自体がなかったことになります。


変更の差分や、Hunkを見比べて、必要のない箇所に変更が入ってしまっていたら、上記の方法でHunk(これは変更部分の一塊)もしくは、選択した行の変更を簡単に破棄することができますので、修正する行とは異なる行を誤っていじってしまう心配がなくなります!



コミットの破棄

コミットの破棄は複雑な手順があり、ここでは解説しません。

変更してテストしてみたけどうまく行かなかった。もう一回最初からやりたい、なんていうときには、masterブランチから新しいブランチを切ってやったほうが早い場合もあります。

コミットを破棄したり、特定のコミットまで遡る代わりに、ブランチをmasterに戻し、今まで使っていたブランチを削除してしまうことで、今までの変更をすべてなかったことにできます。(ブランチは削除しなくても構いませんが、不要なブランチが乱立すると分からなくなってしまうので、適度に削除することをオススメします)


日本語文字のコミット

それでは追加したコメントをコミットして、masterにマージしておきましょう。

  1. コミットボタンを押してコミット画面に切り替え
  2. コミットメッセージを入力してコミット
  3. masterブランチをチェックアウトして、fix_commentブランチを右クリックして、「現在のブランチにfix_commentをマージ」
  4. 必要に応じてfix_commentを削除

Summary

  • Gitはunicodeで、SAS日本語版はシフトJISで管理しており文字化けするため、SASプログラムを明示的にutf-8(BOMあり)として保存することで文字化けを防ぐ。
  • プログラムの破棄はSourceTreeから簡単に処理できる


まだまだ続きます(次はログと出力の話)。