クラウドストレージ代わりにGithubを使う
僕は元々自分で書いたソースコードなどは、同期が楽なので全てiCloud Driveに入れていました。
ただ、たまに空のディレクトリが生成されたりと動作は不安定で、あまり信用ができなかったのと、GithubがMicrosoftに買収されてプライベートリポジトリが無料で使えるようになったので、Gitを使うことにしました。
とはいえ個人で使うだけなので、Gitの丁寧な競合の検出とかどうでもいいわけですよ。なので鬱陶しいなと思いながら使ってて、ある程度使い方が定まってきたのでここでメモします。
これはあくまで、僕が一人で作ってるプロジェクトをGitで同期させたいなって程度にしか考えずに使ってるだけなので、これを多人数で扱ってるレポジトリとかではやらないでください
やりたいこと
どんな感じでGitを使いたいのかなんですけど、必要なのは以下の3点
- クラウドにソースコードを保存すること
- ある程度バージョン管理ができること
- 複数のパソコンでソースコードを同期できること
1つ目はGithubを使う時点でOK。2つ目もGit使うのでOK。
問題は3つ目で、もちろんGitはソースコードの共有が考えられているけど、それは複数人で開発するためのもの。
僕は家のiMacと持ち運び用のMacbook Airを持っているので、外出時にMacbook Airで少し書いたプログラムの続きをiMacで行うといった状況がある。
クラウドストレージならインターネットに接続されていればファイルを保存するだけで自動的に同期されるが、Gitだとそうもいかない。切りの悪いところでもcommitしてpullしてを繰り返せばコミット履歴がやばいことになるので、どうすればいいか考えた。
おおまかな流れ
必要なブランチはmasterとsyncで、以下のような流れで作業します。
- masterからsyncにブランチを切る
- sync上で作業
- マシンを移動するなど、切りが悪いが同期させたい時
- syncにcommit、push
- 移動先でpull
2. sync上で作業
に戻る- 作業がひと段落した時
- syncにcommit
- masterにsquash mergeしてcommit
- syncをmasterの内容でreset hard
- force push
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便利ですけど一人で使うにはお節介すぎますね。個人で使う分にはこの程度でいいんじゃない?
もっといい方法があるなら教えていただけると嬉しいです。
コメント