deepblue-will’s diary

JS、CSS,Ruby、Railsなど仕事や趣味で試した技術系のことを書いていきます。

デザインファイルをGitHubで管理している時に良く起こるエラーの対処法(SourceTreeの例付き)

うちの会社ではデザインファイル(主にSketchファイル)もGitHubで管理しています。 GitHubは大変便利なのですが、デザインファイルを扱うと色々面倒なエラーが起こりやすいです。 なので、トラブルシューティング的なものを書いてみました。 コマンドでGitを操作しているデザイナーは少数だと思ったので、SouceTreeでの例も載せてあります。 よかったらご覧ください。

pushしたらエラーが起こった!

デザインファイルをpushした時のエラーはほとんどが以下の2つが原因だと思います。

100MB以上のファイルをpushした

remote: error: File A.mp4 is 412.02 MB; this exceeds GitHub's file size limit of 100.00 MB

GitHub100MB以上のファイルをpushすることはできない仕様です。
なので以前のコミットを取り消して、ファイルサイズを小さくして再度commit → pushする必要があります。
commitの取り消し方法は「commitを取り消したい!」を参照してください。

pullしてない

! [rejected]        master -> master (fetch first)
もしくは
! [rejected]        master -> master (non-fast-forward)

この場合、単純にpullすればOKです。
pullした結果、コンフリクトした場合は下記を参照してください。

pullしたらファイルがコンフリクトした!

sketchファイルやai、psdファイルはコンフリクトしてしまうと手動で修正できません。
なのでコンフリクトしたファイルをどうしたいかによって対応が変わってきます。

pullした結果のみを採用する(自分の変更分を破棄)

コマンド

git checkout --theirs {ファイル名}
git add {ファイル名}

SouceTree

  1. コンフリクトしているファイルの上で右クリック→「競合を解決」→「相手の変更を使って解決」 f:id:deepblue_will:20150830174353j:plain

  2. 右クリック→「競合を解決」→「解決済みにする」 f:id:deepblue_will:20150830174709j:plain

自分の変更のみを採用する(pullしたファイルの変更分を破棄)

コマンド

git checkout --ours {ファイル名}
git add {ファイル名}

SouceTree

  1. コンフリクトしているファイルの上で右クリック→「競合を解決」→「自分の変更を使って解決」
  2. 右クリック→「競合を解決」→「解決済みにする」

pullした結果も自分の変更分もどちらも採用したい

この場合はやや面倒です。
一度元に戻して、コンフリクトしたファイルのバックアップをとる→再度pullしてバックアップを元にファイルを編集するという方法になります。

  1. pullを取り消してコンフリクトする前の状態に戻す:「pullを取り消したい!」を参照
  2. コンフリクトしたファイルをどこか別のところ(デスクトップとか)にコピーする
  3. pullする
  4. 「pullした結果のみを採用する」の手順を行う
  5. 4.のファイルを編集して自分の変更をマージする。

pullを取り消したい!

pullしたらなんだかよくわからない状態になった時などにこの方法で元に戻せます。

コマンド

git reset --mixed ORIG_HEAD
git checkout {コンフリクトしたファイル} # ファイルがコンフリクトしていた場合。

SourceTree

  1. 現在のブランチを選択
  2. 最後にcommitした時点を右クリック
  3. 「このcommitまで{ブランチ名}を元に戻す」 f:id:deepblue_will:20150830174819j:plain

  4. そのまま「OK」

  5. コンフリクトしていたファイルに対して「特定ファイルの変更のみなかったことにしたい!」の手順を行う。

commitを取り消したい!

commitを取り消してをやり直したい時などに使用する方法です。

コマンド

git log --oneline # commit IDを確認する
git reset --soft {取り消したいcommitの1つ前のcommit ID}

SourceTree

  1. 現在のブランチを選択
  2. 取り消したいcommitの一つ前を右クリック
  3. 「このcommitまで{ブランチ名}を元に戻す」 f:id:deepblue_will:20150830174928j:plain

  4. 「soft - すべてのローカル変更を保持」を選択して「OK」 f:id:deepblue_will:20150830174947j:plain

今ある変更すべてなかったことにしたい!

今ある変更をすべてなかったことにしてキレイにする方法です。

コマンド

git reset --hard HEAD

SourceTree

  1. 現在のブランチを選択
  2. 最後のcommitを右クリック
  3. 「このcommitまで{ブランチ名}を元に戻す」 f:id:deepblue_will:20150830175052j:plain

  4. 「hard - すべての作業コピーの変更内容を破棄 」を選択して「OK」 f:id:deepblue_will:20150830175105j:plain

特定ファイルの変更のみなかったことにしたい!

ファイルの中身を確認しただけで変更してしまうsketchファイルなんかには覚えておくと便利です。

コマンド

git checkout {戻したいファイル}

SourceTree

戻したいファイルをの右側のメニューから「破棄」を選択 f:id:deepblue_will:20150830175119j:plain

GitHubを使う上での注意

  • GitからCloneしたフォルダにpushするつもりのないファイルを置かない
  • タスクを始める場合は、変更がない状態(他に編集しているファイルがない状態) + pullしてから始める
    • 変更がある場合はpushするかbranchを切るかどこか別のところに退避しておく
    • 今ある変更がいらないのなら「今ある変更すべてなかったことにしたい!」でキレイな状態にする
    • いろんな変更が混じっていると後々コンフリクトしたりと面倒なことが起こりやすい
  • pushする前に必ずpullする
    • pullしないでpushするとエラーが起こります
  • 100MB以上のファイルをpushしない
    • GitHub100MB以上のファイルをpushすることはできない仕様です
    • もし間違えてcommitしてしまったら「commitを取り消したい!」を参照
  • pushできているのかどうかちゃんと確認する
    • ついpush失敗のメッセージを見のがしてpushしたつもりになってることがあるので注意
    • GitHubリポジトリを見るのが確実
  • コンフリクトが起こりにくい運用を心がける
    • デザインファイルはコンフリクトが起こると解消するのが面倒です
    • 同じファイルを複数人で同時に編集しない・ファイルを細かい単位に分ける(ファイルサイズの削減にもなる)など

↓ これはイラストが豊富なのでGitHubの入門書としてはオススメです!