BaseSASユーザのためのGit(その3:sasプログラムの問題と変更の破棄)
前回はブランチを切って、修正したプログラムをコミットしてmasterにマージする、という作業を行いました。
日本語(DBCS:ダブルバイト文字)の入力
さて、今回はまた別の修正をしましょう。今度は「fix_comment」というブランチを作成して、プログラムに以下のようなコメントを入れてみます。
/* テストプログラム */ /* 作成日:2021/12/07 */ data class; ...
こんな感じで保存してSourceTreeをチェックします。
あれ?文字化けしていますね。(文字化けしていなければここはスキップしてしまって構いません)

そうです、SASでプログラムを作成すると文字化けするんです。
これは、SAS(SAS日本語版)のプログラム自体がShift-JIS、所謂シフトJISという文字コード体系で動作しているのに対し、GitではUnicodeのutf-8という文字コードで管理しているからなのです。
GitでシフトJISを使用する方法については、いくつか方法があるようなのですが、おすすめしません。
Git自体がUnicodeに最適化されており、シフトJISでは正しく動かなかったり、やっぱり一部が文字化けしてしまうことがあるためです。
エンコードをutf-8に変更
以下はSASの名前をつけて保存のダイアログですが、ここでUnicode(UTF-8)を選択して、プログラムファイルをUnicodeで保存するのです。

なお、utf-8にはBOMありとBOMなしがありますが、SASではBOMありがおすすめです。
BOMありであれば、SAS日本語版であっても自動的にutf-8であると識別してくれるためです。
(BOMについては割愛します。エンコーディングのフラグのようなものです。)
その代わり、プログラムを読み込むたびに以下のようなNOTEが表示されます。

BOMなしのutf-8プログラムファイル
明示的にBOMなしファイルとして読み込めばSASでも正しく識別しますが、明示しない場合は文字化けが発生するため、注意が必要です。
例えば、
- 開くダイアログでエンコードを指定して、BOM無しにチェックをする。→OK

- プログラムで以下のようにエンコーディングとbom無しを意味するnobomオプションを指定する。→OK
filename a "C:\Users\FMVtest\Documents\Git\SAStest\class.sas" encoding='utf-8' nobom; %inc a /source2;

- nobomを明示しない場合→文字化け
filename a "C:\Users\FMVtest\Documents\Git\SAStest\class.sas"; %inc a /source2;

プログラムをダブルクリックしてSASを起動する、%incでプログラムファイルを読み込んでいる、といった使い方をしているのであれば「BOM有り/付き」にしておくが無難です。
以降は「BOM有り/付き」で話を進めます。
変更の破棄
コメントを2行追加しましたが、1行目は変更を破棄したいと思います。
こういった場合、プログラムファイルを開いて自分で行を削除するのではなく、SourceTreeから処理が可能です。
差分を表示している部分に「Hunkをステージへ移動」「Hunkを破棄」というボタンがあります。
また、変更行をクリックすると、そのボタンが「選択した行をステージへ移動」「選択した行を破棄」という表示に変わります。


1行目を選択したまま、「選択した行を破棄」をクリックし、確認ダイアログでOKをクリックします。
プログラムを開き直してください。
1行目がなくなっているのがわかると思います。


Hunkの破棄
変更が広範囲に渡る場合は、Hunkも複数識別されます。
「Hunkを破棄」を選べば、表示されている変更部分をまとめて元に戻すこともできます。
選択行破棄の注意点
通常は+行と-行をセットで破棄することで元に戻せます。
+行だけ破棄した場合、削除した行は-としてHunkに残りますから、プログラムでは行の追加だけがなかったことになります。
-行だけ破棄した場合、追加した行は+としてHunkに残りますから、プログラムの行削除自体がなかったことになります。
変更の差分や、Hunkを見比べて、必要のない箇所に変更が入ってしまっていたら、上記の方法でHunk(これは変更部分の一塊)もしくは、選択した行の変更を簡単に破棄することができますので、修正する行とは異なる行を誤っていじってしまう心配がなくなります!
コミットの破棄
コミットの破棄は複雑な手順があり、ここでは解説しません。
変更してテストしてみたけどうまく行かなかった。もう一回最初からやりたい、なんていうときには、masterブランチから新しいブランチを切ってやったほうが早い場合もあります。
コミットを破棄したり、特定のコミットまで遡る代わりに、ブランチをmasterに戻し、今まで使っていたブランチを削除してしまうことで、今までの変更をすべてなかったことにできます。(ブランチは削除しなくても構いませんが、不要なブランチが乱立すると分からなくなってしまうので、適度に削除することをオススメします)
日本語文字のコミット
それでは追加したコメントをコミットして、masterにマージしておきましょう。
- コミットボタンを押してコミット画面に切り替え
- コミットメッセージを入力してコミット
- masterブランチをチェックアウトして、fix_commentブランチを右クリックして、「現在のブランチにfix_commentをマージ」
- 必要に応じてfix_commentを削除