mikan_daisuki’s blog

IT系サラリーマンの日記。前職ではスマホゲームを、現在はアプリを作ってます。



UnityEditor(MacOSX)でPlugins機能を使う方法

UnityのDocumentがいまいちでツラかったので、補足情報をまとめます。

 

公式Document

docs.unity3d.com

 

関連Blog

d.hatena.ne.jp

http://monkeycoders.tumblr.com/post/22414181728/macos向けのnativepluginを作成する

monkeycoders.tumblr.com

 

 

公式Documentにのっとったやり方

  • MacOSXでサポートしてるloadable bundleという形式(拡張子は.bundle)を使う
    • XCodeのビルド設定で、"Mach-O Type"を"Dynamic Library"にする
    • "Architectures"を32bitと64bitのUniversalにする
    • "Build Active Architecture Only"をNoにする
  • Assets/Plugins に置いてDllImportする
    • Assets/Plugins/Hoge.bundleを置いていれば、[DllImport("Hoge.bundle")]とする
    • Plugins以下にフォルダ作って置いて相対パスで指定してもDllImportがうまくいかない

非公式だがこれでも動く、というやり方

  • dylibをビルドして、格納するときに拡張子をむりやり.bundleに書き換える
    • libHoge.dylibだったら、Hoge.bundleなどとする
  • この方法だとPlugins以下にフォルダ作って置いて、相対パスで指定してもDllImportがうまくいく

Editorで動かすときの注意点

Editorの停止はアプリの終了とは処理が異なるので、

pluginの終了処理をEditor向けに入れる必要があります。

終了処理がなされず、初期化済みなままEditorが停止してしまいます。

 

Listなどのコレクションを返すメソッドを作るとき、nullを返さないこと

Before: nullを返す場合

void Start()

{

  List<string> names = GetNames();

  names.ForEach(obj => /* do something */ );

}

 

List<string> GetNames()

{

  if (/* something */)

    return null;

  List<string> names = new List<string>();

  /* add names */

  return names;

}

こんなふうになってると、GetNames()からnullかえってきたときにエラーになります。

当然ですが。

 

After1: 呼び出し側でハンドリングする

たとえば、以下のように直すと動きます。

 

void Start()

{

  List<string> names = GetNames();

  if (names != null)

    names.ForEach(obj => /* do something */ );

}

 

List<string> GetNames()

{

  if (/* something */)

    return null;

  List<string> names = new List<string>();

  /* add names */

  return names;

}

これだと、呼び出す度にチェックしなければなりません。

実装するときにチェックを忘れてしまって、nullが返ってくるケースを

考慮し忘れた、なんてことがよくあります。

After2: nullじゃなく、空リストを返す

一方、以下のとおり直しても、動きます。

void Start()

{

  List<string> names = GetNames();

  names.ForEach(obj => /* do something */ );

}

 

List<string> GetNames()

{

  List<string> names = new List<string>();

  if (/* something */)

    return names;

  /* add names */

  return names;

}

 

 

空リストなど、コレクションで値を何も入れず初期化した状態は、

空なので、後続でforeachなどのループ処理をしても

処理されずスルーされます。

 

この方が呼び出し元でのミスもなくなり、幸せになれます。

ちょっとした一手間が大事、という良い例です。

 

 

Entity Component Systemについてまとめてみる

自分は、Unityが初めてのクライアントアプリだったので、

 

「こういう風に作るのか〜」

 

程度の感想しかなかったですが、どうやらゲーム開発に向いたアーキテクチャーで、

Entity Component System(以下、ECS)と呼ぶらしいです。

といっても、UnityはECS風であり、ECSそのものではない様子。

 

エンティティ・コンポーネント・システム - Wikipedia

 

とはいえ、初心者にとっては、厳密さより根っこの理解が大事に思えるので、

初学者に向けてまとめてみます。

 

プロダクトが複雑になればなるほど、継承よりも委譲に頼っていく方が筋が良いという話

オブジェクト指向を意識して開発を進めていくと、継承を使う機会がちょいちょい出てきます。

でも、継承を使って開発していくと、以下のようなときにハマります。

qiita.com

※ Effective JavaJava知らなくても勉強になるのでオススメ

 

つまり、「継承は、親クラスの実装詳細を把握してないと書けない」ということです。

オブジェクト指向の特徴に「カプセル化(情報隠蔽)」という言葉がありますが、

継承したときの、子クラスから見た親クラスは、カプセル化(隠蔽)されてないわけで、オブジェクト指向の特徴とは矛盾してしまっています。

 

オブジェクト指向 - Wikipedia

 

そりゃそうか、と言ってしまうとそこまでな話ですが、

割と重要な事実ではないでしょうか。

これは、委譲であればそんなことはないのです。

以下のブログは、そのことをとてもわかりやすくまとめています。

 

qiita.com

 

上記のブログで、コンポジションと言っているのが委譲です。

このような思想をコンポーネント指向と言ったりもするようです。

 

ソフトウェアコンポーネント - Wikipedia

 

コンポーネント指向がオブジェクト指向と違うのは、

 

オブジェクト指向は、1つのクラスが人に例えられる(擬人)けど、コンポーネント指向は、1つのクラスが部品になり、部品の集合がオブジェクトと見なされる」

 

というところです。

例えば、「銃を打てる人」を表すときに、以下のように構成が変わってきます。

直感的にも、継承ツリーを意識せずに実装できるのは、メリットと感じられるのではないでしょうか。

 

ここまで説明すると、UnityがECSの思想に基づいて作られていることがなんとなくイメージできるかと思います。

  • ゲームオブジェクト: Entity
  • ゲームオブジェクトに紐づくスクリプト達: Component

という位置付けになります。

 

じゃあどう実装するのか

具体的にどう実装してるのか、というのは、以下が参考になるので

こちらを参照ください。

www.slideshare.net

 

以下はUnity特化です。非公式ですが、わかりやすいです。

Unity - コンポーネントの使い方

 

そもそもどうやってSceneを作っていくべきか、大いに参考になると思います。

 

おまけ

UnityのECSって微妙じゃね?という議論を垣間見れます。(英語読めればw)

gamedev.stackexchange.com

 

上記ブログで触れられた Artemis Entity Component System

Artemis Entity System Framework - Entity Systems Wiki

 

ちなみに、Unityの上に動く自作ECSも公開されたりしてます笑

github.com

 

動画もあり、熱量を感じられます。

www.youtube.com

 

ぼくもこの程度の知識しかないですが、参考になればうれしいです。

 

 

ゲームプログラマー向けのサウンド入門を目指して

自分は仕事でゲーム開発する際に、サウンドから入りました。

たまたまそういうアサインだったのです。

 

ただ、基礎がまとまってなくて結構苦労したのを覚えています。

ググッてもあんまり情報が出てきません。

 

まだ、おそらくじぶんの知らない部分もいっぱいあるけれど

全然知らない人がこれから取り組むときに参考にできるものを目指して

まとめてみようと思います。

※Unityで使えるサウンド機能についてもちょこちょこ触れてます。

前提

  • サウンド自体は、別のだれかが作ってくれる
  • わたし(読者)は、それを適切に取り込まないといけない人
    例1: どのファイル形式で、とか
    例2: どれくらいのサンプリングレートで、とか

ファイル形式

一番良い音質になるのは当然非圧縮形式ですが、それだとBGMのような再生時間の長いもので問題が起きます。

例えば、wav形式であれば

  • 5分 (=300秒)
  • 44100Hz (サンプル数/秒)
  • 16bit (bit/サンプル数)
  • 2ch (2つ分)

だと、

300 * 44100 * 16 * 2 = 52920000 (Byte) = 52.92 (MB)

となり、1つのBGMでこんなに重いと100個で5Gになってしまいます笑

サウンドだけでこんな容量になってしまうと全体のアプリの容量も増えて非常に困るわけです。

例えばiPhoneの一番少ないストレージだと16GB (でしたっけ)なので、

サウンドだけで5GBだと困るし、アセットをダウンロードするにも異常に時間かかります。

なので、BGMのような大容量ファイルは圧縮形式にした上で、

適切に音質をコントロールしつつ、できるだけ容量を下げる必要があります。

WAV (WAVEとも書く)
  • MicrosoftIBMで開発
  • 通常は非圧縮 (なので、容量もでかい)
  • 開発側でよしなに圧縮できるので、(たぶん通常) サウンド制作者はWAVで納品する
MP3
  • Moving Picture Experts Group (MPEG !) というワーキンググループが開発
    ー 専門家の集団らしい
  • 圧縮形式
  • mp3の技術には特許があり、利用すると訴訟リスクがあり、あまり使われていない (はず)
  • なのにUnityではiOSでビルドするとoggというサウンドファイル形式がmp3に変換されてしまう…
    ー UnityではAIFF, WAV, Ogg, MP3の4種類サポートで、圧縮形式はOggとMP3の2種類しかないから詰んでる 

特許云々の話は以下にまとまっております。

実際にMicrosoftが訴訟されたりしています。

MP3のライセンス問題はその後どうなったのか : Timesteps

 

iOSでビルドすると云々の話は以下です。

docs.unity3d.com

ちなみにUnityでサポートしてるサウンド形式については、以下に書かれています。

docs.unity3d.com

Ogg
  • Xiph.org Foundation (ザイフォ財団)という非営利団体が開発
  • パテントフリー (特許なし)
  • 圧縮形式

すばらしいですね。Oggを利用する、という結論でよさそうです。

AAC

cyber-rainforce.net

 

音質(と容量)を決める重要な指標

ファイル形式とは別に、音質を許容範囲まで下げることで容量を減らすこともできます。

容量を減らす必要がなかったとしても、サウンドライブラリ・エンジンの仕様で指定した形式のデータでないとそもそも再生できなかったりするので、各指標を把握するのは必須です。

サンプリングレート/サンプリング周波数

1秒あたりのサンプルデータ数。

アナログデータは連続ですが、デジタルデータは非連続なのです。

サンプルデータ数を増やすほど、アナログデータの音に近づきます。

ちなみに、音楽CDは44.1kHz/16bit (こっちはビット深度。後述)らしいです。これを超えたやつがハイレゾ

ascii.jp

ビット深度 /量子化ビット数

サンプリングデータ1つあたりのデータ量(bit)のこと。

CDで使っている16bitなら、2^16で0-65535の値でデータを表現できる。

8bitとかにすると音が雑になって、ノイズが出る(らしい)。これを量子化誤差と呼ぶ。

 

ビットレート

単位はbps (bits per second)。1秒にどれくらいのデータ量が処理されるかを表す。

音楽CDの目安は128kbpsだとか。

こちらとか聴いてみると面白いかも。

daredemopc.blog51.fc2.com

 

チャンネル数

よく言われるモノラル/ステレオのことです。ステレオだと2チャンネル使います。

モノラルで再生できるものならモノラルで納品されるので、それを把握した上で組み込む必要があります。 

ゲーム開発でよく出てくるサウンド周りのキーワード

あとはざっとまとめます。

ポイントループ

同じBGMをまるっとループ再生するのではなく、指定したポイント(ループポイント)からループして再生することがよくあります。

サウンド作成ソフトで、ループポイントを指定できて、それはバイナリファイルのコメント部分に直接埋め込まれています。

WAVEで納品されて、例えばoggに変換するときにループポイント指定部分が除かれてしまったりしないように注意する必要があります。

Wavosaurというフリーソフトがあるので、これを使って変換すれば(CUIじゃなくて面倒ですが)ポイントループを引き継いで変換できます。

Wavosaur - 窓の杜ライブラリ

同時再生数

SEを何かのアクションに合わせて再生させるとき、最大いくつまで再生出来る、という設定を入れることで音が重なりすぎて変な音になることを防ぐ仕組みがあります。

・・・なければ作る必要があります汗

フェードイン/アウト

これくらいできないと、ゲームとして結構微妙な演出になります。

 

あれ、もっとあった気がするけど思い出せない・・・汗 

また書きます。

最後に

また後日、追記して一部具体的なやり方についても書きます。

ゲーム開発初心者のWebエンジニアがUnity×C#で開発するために1年間で読んだ9のモノ

私がアプリでゲーム開発をするようになったのは2014年の夏でした。

もう1年が経ったので、今まで読んだモノ(本だけでなくWebも)をまとめてみます。

当時のスキルセットは、

  • 業務経験3年ほどのWebエンジニア
  • サーバーサイドが専門(Perl)
  • html, css, js, Flashは嗜む程度

です。

右も左もわからない頃

0. まずはWebで

Unity公式のTutorialが楽しく学べるようになってます。

Unity - Tutorial - 2D Shooting Game

まずはこれに沿ってUnityを動かしてみるのが良いです。

他にもドットインストールをちょっと見てみましたが、退屈かもしれません。

1. まずはひよこ本から

有名みたいですね、ひよこ本。 

私はUnity4で開発しているので、以下を読みました。

Unity4入門 最新開発環境による簡単3Dゲーム制作

Unity4入門 最新開発環境による簡単3Dゲーム制作

 

Unity自体をどう触るのか、という超初歩が学べます。

GUIのEditorで実装する感じが最初は抵抗ありましたが、もう慣れました。

 

筆者の労働環境はUnity4ですが、

今やUnity5が出てしばらく経つので、こちらの方が良いと思います。

Unity5入門 最新開発環境による簡単3D&2Dゲーム制作

Unity5入門 最新開発環境による簡単3D&2Dゲーム制作

 

 

2. ざっくり学んだ後に実際のゲームを触ってみる

会社の先輩が、「深イイ」と言っていたのでこちらを読みました。

ゲームの作り方 Unityで覚える遊びのアルゴリズム

ゲームの作り方 Unityで覚える遊びのアルゴリズム

 

 当時の自分にはよくわからなかったですが、

手触りをよくするために、どういう実装にしたのか、というのが非常に勉強になる」

と仰っていたので、本当はある程度慣れてから読む本かもしれません。

ただ初心者でも、「Unityで完成したゲームを触っていじってみる」ことができるのが良いと思います。

素材がどこかのサイトからダウンロードできて、プロジェクトを開いていじれるのですが、「こうやって作ってるんだ〜」と、何かと気づきが得られるかと思います。

 

3. C#を覚える

ぼくはだいたい「なんちゃら最速マスター」みたいなページを読んで覚えてます。

anond.hatelabo.jp

 

C#ラムダ式 基礎文法最速マスター − @IT

 

なんかタイトルがキャッチーで情報もスリムなので、さくっと読んで覚えるかーという気分になります笑

同僚は、以下をお勧めしておりました。

ぼくの場合は、ググったらたまたま以下に出会って読むことは多々ありました。

ので、どっちにしても出会うことになると思います。

ufcpp.net

 

4. 3Dグラフィックスの雰囲気を感じる

 これはコンソール業界にずっといた方から勧めてもらいました。

ゲームグラフィックス 2013 CGWORLD特別編集版 (Works books)

ゲームグラフィックス 2013 CGWORLD特別編集版 (Works books)

 

 3Dグラフィックスってどんなかんじなのか、

どんなものが注目されているのか、眺めるだけなのですが

なんとなく意識が高まります。笑

自分はエンジニアなので直接こういうものを作ることはないのですが、

自分の関わるプロダクトがどういうものなのか、感覚が掴める気がします。

 

最新のものだと以下ですかね。

ゲームグラフィックス 2015 CGWORLD特別編集版

ゲームグラフィックス 2015 CGWORLD特別編集版

 

 

5. 3D技術の歴史とキーワードを把握する

4. とも近いですが、「自分の作るものがどういうものなのか」よくわからなかったので、以下を読んでキーワードを把握するようにしました。

ゲーム制作者になるための3Dグラフィックス技術 増補改訂版

ゲーム制作者になるための3Dグラフィックス技術 増補改訂版

 

mikan-daisuki.hatenablog.com

 こちらでも触れてますね。まとめも知識不足で意味不明になってますね笑

でも、シェーダーもよくわかってなかったので、俯瞰して技術要素がどうなってるのか把握するのにはよかったと思います。

ある程度慣れてから

6. C#のイケてる書き方ってどんな感じなんだろう

てことで、読んだのが以下。

Effective C# 4.0

Effective C# 4.0

 

「 Effective 〜」は有名みたいで、これも周囲は読んでるし、レビューもよさげだったので読んでみました。

C#らしい書き方で大事なこと、が書いてあります。

でもちょっと難しいかも。わかるのもありますが、わからない項目も結構ある。

勉強にはなりました。

7. ゲームっぽい書き方ってどんな感じなんだろう

 と思って読んだのが以下。

ゲームプログラマのためのコーディング技術

ゲームプログラマのためのコーディング技術

 

割と基本的な内容らしく、そういうレビューも多かったんだけど、

わかりやすいし分量もちょうどよくて、面白かった。

オブジェクト指向デザインパターンに詳しい人には不要らしいけど、

自分はそういう人ではなかったので勉強になった。

もっとガチで勉強するならCode Completeの方がいいらしい。

 

Code Complete 第2版 上 完全なプログラミングを目指して

Code Complete 第2版 上 完全なプログラミングを目指して

 

 上ってことは下もあるのか・・・と自分は敬遠してる笑

8. そもそもC#の言語仕様って・・・

と、慣れてきて気になったころに読む本。

C#エッセンシャルズ 第2版

C#エッセンシャルズ 第2版

 

 薄いのが良いです。持ち歩くのも全然問題ない。

ちょっと暇なときに読むのがよいカジュアルさです。

9. 実はJavaC#に似てるので、Javaの技術書も良い

インターフェースと抽象クラスで分けるコードの書き方が正しいのか疑問に感じて2chで聞いたら「Effective Javaを読め」と言われて読んだら面白かったので

読んでなかったら是非。 

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)

 

個人的には、この本が一番アタリだったかも。

staticクラスの使い方やらインターフェースの使い方、やらが、しっかり書いてあって、そういう思想的なことを学べなかったので、こういう本を読むのは大事だと思う。

ネット読んでるとJavaC#の違いに苦しむ人がいるみたいだけど、LLから入った人がみたらだいたい一緒ですね。笑

まとめ

いかがでしたでしょうか。

誰かの参考になれば、それ以上のことはありません。

 

【確定申告】2016年に向けてサラリーマンのための確定申告について予習しておく

筆者はサラリーマンやりつつも、ちょこっと副業やったり株やったりしていて

収入があるので確定申告せねばなりません。

今回は本ブログのメインテーマからは外れますが、その話を予習すべくまとめてみます。

目次

 

サラリーマンに確定申告は無縁と思っているあなたへ

全くそんなことはありません。

目を覚ましてください。笑

例えば、ざっくり以下のとき確定申告するとお金が返ってきます。

万単位で返ってくることもあります。

  • 出産したとき
  • 家やマンションを買ったとき
  • ふるさと納税 (これはやるなら当たり前)

また、ざっくり以下で会社以外の収入が20万以上のときは確定申告してないと脱税です。

  • 副業してる
  • 株とかFXしてる

さて、どうして確定申告すべきなのか、それぞれ見て行きます。

その前に、前提として対象読者を記載しておきます。

  • 年収が330万以上900万以下の方

すなわち、

No.2260 所得税の税率|所得税|国税庁

で言うと、税率20-23%の方です。税率が収入によって全然違うのです。

出産したとき (=医療費控除)

出産してなくても、ひどいケガなどでお金がかかったときは「医療費控除」が適用できます。

10万以上かかった医療費全額 (× 2割)

が返ってきます。※保険で補填された金額は除く必要があります。また、出産一時金の42万円も除く必要があります。

以下、正しい情報です。(超分かりづらいですがw)

No.1120 医療費を支払ったとき(医療費控除)|所得税|国税庁

例えば50万医療費がかかってれば、

(50万 - 10万) ×0.2 = 8万(所得税率:20%を掛けてます)

となります。

ちなみに非常に細かいことではありますが、通院のための交通費についても、控除の対象になります。

具体的な金額が知りたい場合は、こちらのサイトで簡易計算することができるようです。

医療費控除簡易計算

家やマンションを買ったとき (=住宅ローン控除)

これ、買えばなんでも控除が適用できるわけじゃないです。ざっくり

  • 木造なら築20年以内
  • 鉄筋なら築25年以内
  • ローン10年以上組んでる
  • 50平米以上ある

で適用可能です。条件細か過ぎ!

税制って超細かいのです。

suumo.jp

詳しく知りたい方はこっちがオススメです。

年最大40-50万程税額から控除されるそうです。

結構デカいですねー。自分は築50年物件を買ってしまったので対象外です笑

ちなみに、住宅ローン控除は、「税額控除」といって所得税を算出後に引いてくれる、イケてる控除です。他には、株の配当金に適用される配当控除などがあるらしいですが、難しすぎて私もよくわかってません汗

ふるさと納税したとき (=寄附金控除)

ふるさと納税って、実は結構複雑な仕組みなんです。

www.zeiken.co.jp

これは2016年の確定申告で使える情報ではないのですが、

ふるさと納税とは何ぞや」ということが理解できます。

ふるさと納税の控除額(=最終的に返金される金額)は、 

  • 所得税の寄附金控除 
  • 個人住民税の寄附金控除
  • 個人住民税の寄附金控除の特例

の合計なんです。これが合計「負担は2000円で、最大で住民税の約20%相当額まで返金される

と言っているのですから、非常に難しいです。

とりあえず住民税の約20%まで返金される

とざっくり覚えておきましょう笑
※正しくは、ふるさと納税をした次の年の6月の住民税から、最終的に返金される金額が差し引かれます。

 

ちなみに、これらは「所得控除」なのでご注意を

これらの情報は、

収入(所得)を得ていることが大前提

であることに注意です。なので、基本的にはサラリーマンに優しい制度なのです。

最終的に計算した結果(所得)に対して、以下ページの表を使って計算します。

No.2260 所得税の税率|所得税|国税庁

実際はさらに複雑に計算されてるので、難しいことは考えず、こちらで先に所得金額を計算してみましょう。(平成26年版だけど参考にはなる)

www.zeikin5.com

所得金額」が、控除前の金額です。

では、次へ進みます。

副業してるとき (=雑所得)

税制上、収入のことを「所得」と呼びます。所得には以下の種類がありますが、

所得の種類と課税のしくみ|所得税|国税庁

難しいのでスルーでよいです。

副業は、以下のように覚えておくといいと思います。

  • 雇われている場合は給与所得 (会社員として契約してるか)
  • 雇われていない場合は事業所得か雑所得 (フリーランスとかこっち)

事業所得か雑所得の違いは、あいまいですが、定常的に収入があるかどうかです。

ただ、サラリーマンの方が事業所得として申告すると、住民税の通知書が会社に届いたときに会社の経理の人バレる可能性があるようです。

なので、サラリーマンの方は、よほど副業で稼いでない限りは雑所得がオススメです。

taxindex.org

 

雑所得は、給与に足されて所得税を計算します。

ここの金額がでかくなると税金も当然増えます。

株とかFXとかしてる (=申告分離課税)

扱いが特殊なようで、他の所得と分けて計算することになっています。

No.1463 株式等を譲渡したときの課税(申告分離課税)|所得税|国税庁

こちらによると、もうけた収入の20%支払う必要があります。利益を確定させない場合などは、株価が上がっていた場合でも、確定申告する必要はありません。

まとめ

  • とにかく税制は超細かくて難しい! (困ったら詳しい人に聞く!)
  • 控除は所得金額以上にはならないので先にどれくらいか計算しておく
  • 副業してる方は脱税にならないように税制を学んでおきましょう

まとめると薄くなりますが、大事なことはすべて細かいです。

こちらを入り口に、勉強していただけたら幸いです。

.git/indexが壊れたときの対処法(の続き)

ある日、gitコマンドを実行したらエラーが返るようになった

Jenkinsを使ってUnityのiOS/Androidビルドやアセットバンドルビルドを

実行しているのはよくあることだと思うのですが、とある日

$ git status
error: bad signature
fatal: index file corrupt

このようなエラーがかえってくるようになり、ジョブが失敗し続けるようになってしまいました 

www.nowhere.co.jp

ぐぐってみると、対処法が出てきたのでやってみました。

$ rm .git/index
$ git reset
$ git status
error: bad signature
fatal: index file corrupt

あれ、なおらない・・・

HEADの状態がおかしいのではと思い、git reflogしてみた

aeb40d6 HEAD@{0}: checkout: moving from b182e69ba8377b48eef37ba0edf6aeb46fb5fb7e to aeb40d6
b182e69 HEAD@{1}: checkout: moving from fda39c5be148812a5bab309284aa571186ce2057 to b182e69ba8377b48eef37ba0edf6aeb46fb5fb7e

あれ、HEADのコミットハッシュがおかしい・・・

ということで、

git reset --hard HEAD@{1}

をすることでなおりました。

HEAD@{1}とかの記号が分からない方はこちらを読むとよいです。

qiita.com

まとめ

  • HEADの状態が壊れてるときは、.git/indexを再作成してもリポジトリが修復しない
  • HEADが壊れているときは、git reflogで壊れてなかった過去を見つけてgit reset --hardする