Ideal Reality

興味の赴くままに

クラウドストレージ代わりにGithubを使う

僕は元々自分で書いたソースコードなどは、同期が楽なので全てiCloud Driveに入れていました。

ただ、たまに空のディレクトリが生成されたりと動作は不安定で、あまり信用ができなかったのと、GithubがMicrosoftに買収されてプライベートリポジトリが無料で使えるようになったので、Gitを使うことにしました。

とはいえ個人で使うだけなので、Gitの丁寧な競合の検出とかどうでもいいわけですよ。なので鬱陶しいなと思いながら使ってて、ある程度使い方が定まってきたのでここでメモします。

これはあくまで、僕が一人で作ってるプロジェクトをGitで同期させたいなって程度にしか考えずに使ってるだけなので、これを多人数で扱ってるレポジトリとかではやらないでください

Contents
スポンサーリンク

やりたいこと

どんな感じでGitを使いたいのかなんですけど、必要なのは以下の3点

  • クラウドにソースコードを保存すること
  • ある程度バージョン管理ができること
  • 複数のパソコンでソースコードを同期できること

1つ目はGithubを使う時点でOK。2つ目もGit使うのでOK。

問題は3つ目で、もちろんGitはソースコードの共有が考えられているけど、それは複数人で開発するためのもの。

僕は家のiMacと持ち運び用のMacbook Airを持っているので、外出時にMacbook Airで少し書いたプログラムの続きをiMacで行うといった状況がある。

クラウドストレージならインターネットに接続されていればファイルを保存するだけで自動的に同期されるが、Gitだとそうもいかない。切りの悪いところでもcommitしてpullしてを繰り返せばコミット履歴がやばいことになるので、どうすればいいか考えた。

おおまかな流れ

必要なブランチはmasterとsyncで、以下のような流れで作業します。

  1. masterからsyncにブランチを切る
  2. sync上で作業
  3. マシンを移動するなど、切りが悪いが同期させたい時
    1. syncにcommit、push
    2. 移動先でpull
    3. 2. sync上で作業に戻る
  4. 作業がひと段落した時
    1. syncにcommit
    2. masterにsquash mergeしてcommit
    3. syncをmasterの内容でreset hard
    4. force push
    5. 2. sync上で作業に戻る

ちなみに、スマホアプリなど、リリース状態を残しておきたいものだとdevelopブランチを用意して、developとsyncで作業することもあります。まあ、そこら辺Git-flow知ってればなんとなく想像つくと思いますので説明は割愛します。

スポンサーリンク

詳しい説明

masterからsyncにブランチを切る

masterブランチにいる状態で

git checkout -b sync

説明する必要はないよね。もちろんこれをするのは最初の1度だけです。

Github Desktopを使うとコマンド打たずに簡単に行えます。

sync上で作業

これも説明の必要はないですよね。syncブランチをcheckoutした状態で作業をしてください。

ちなみに、ブランチの切り替えもGithub Desktop使えば超簡単に行えます。

切りが悪いけど同期させたい時

マシンを移動する時などこれにあたります。と言っても、そのままsyncにコミットするだけです。

この時のコミット履歴は後々消すので、コミットメッセージは何でもいいです。僕は毎回"sync commit"って書いてコミットしてます。

あとは移動先でのpullも説明は要らないですよね。ないとは思いますが、もしコンフリクトとかで怒られたら

git reset --hard origin/sync

でローカルを強制的にリモートのsyncに合わせることができます。まあ怒られるってことはローカルが変更されてるってことで、それが消えてしまいますので注意してください。

作業がひと段落した時

普段共同作業などでgit使ってれば、機能の実装が1つ済んだ時など、切りのいいところでcommitしますよね。そんな時どうするかです。

syncにcommit

まずはそのままsyncにcommitします。ちなみに、このコミットも後ほど消えるのでここでも"sync commit"にしてます。

masterにsquash mergeしてcommit

masterにcheckoutして、merge --squashです。そのあとcommitします。

git checkout master
git merge --squash sync
git commit -m "コミットメッセージ"

ちなみに、squash mergeすると複数のコミットをまとめることができます。これにより"sync commit"が全部なくなるわけです。ちなみに、ここのcommitメッセージが残るので、適切なものを入れてください。

syncをmasterの内容でreset hard

このまま作業を続けると、squash merge時のcommitがsyncにないので、次にsquash mergeするときに競合を起こします。なので、syncの内容をreset hardしてmasterと合わせることで競合を防ぎます。

git checkout sync
git reset --hard master

force push

syncのコミットがなくなっちゃってますので、force pushでないとpushできません。

git push -f

Github Desktopおすすめ

これだけでgitの操作全て出来るわけではないので、もちろんコマンド操作は必要なんですが、よく使うcommitとpushがしやすいです。

squash mergeができないので、作業がひと段落した時の操作はターミナル使いますが、切りが悪いけど同期させたい時はGithub Desktopだけで完結するので楽です。

IDEやエディタのGit機能使えばいいじゃんって思っても、僕は普段

  • Xcode
  • Android Studio
  • Visual Studio Code

を言語によって使い分けていて、それぞれ全部Gitの操作方法が違うので使いにくいんですよ。diff見る時とかはそれぞれの使ってますけど。

Github DesktopじゃなくてSource Treeとかでもいいですが、とりあえずIDEやエディタとは別にGit操作アプリ使うと、どの言語使っていても同じ感覚でGit操作できるのでおすすめです。

スポンサーリンク

しくじった時

reset hardとかforce pushやっちゃってるから、ミスると変更内容吹っ飛んだりします。

そういう時は

git reflog

で作業履歴が見れるので、

git reset --hard HEAD@{1}

という感じで、HEAD@{1}の数字を戻したい所にしてやれば戻せます。pushした後でも戻せる時は戻せますが、使われなくなったコミットはガベージコレクタにより消されていくので、必ず戻せるわけではありません。なるべくミスらないようにしましょう。

まとめ

Git便利ですけど一人で使うにはお節介すぎますね。個人で使う分にはこの程度でいいんじゃない?

もっといい方法があるなら教えていただけると嬉しいです。

スポンサーリンク

コメント

投稿されたコメントはありません

名前

メールアドレス(任意)

コメント

関連する投稿