GitHubにはコードの断片を管理したり人に見せたりブログに貼付けたりするのに便利なGistってのがあります。
通常の使い方では、ブラウザで貼付けたりとかすると思うのですが、GistもGitのリモートリポジトリなので、クライアントから使う事も出来ます。
……ってのはGistにも普通に書いてるんですけどね。
Gist is a simple way to share snippets and pastes with others. All gists are git repositories, so they are automatically versioned, forkable and usable as a git repository.
とりあえずやってみます。
色々やってみる
まず適当に作ります。
GitHubはお金払わないとプライベートなリポジトリは作れないのですが、Gistだとプライベート作れたりします。プライベートと言いつつ、アドレスわかったら誰でもアクセスできちゃう程度のプライベートですが。
次にこれをクローンします。アドレスは画面に書いてくれてる通り。
$ git clone git@gist.github.com:644e504e9d550c2fedd3.git gist-644e504e Cloning into 'gist-644e504e'... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Receiving objects: 100% (3/3), done. $ cd gist-644e504e/ $ ls -a . .. .git textfile.txt $ cat textfile.txt plain text$
すんなりですね。
リモートはふつーにこうなってます。
$ git remote -v origin git@gist.github.com:644e504e9d550c2fedd3.git (fetch) origin git@gist.github.com:644e504e9d550c2fedd3.git (push)
適当にファイルを追加します。
$ echo new> newfile.txt $ git add newfile.txt $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: newfile.txt # $ $ git commit -m'add new file' [master c8c75b2] add new file 1 file changed, 1 insertion(+) create mode 100644 newfile.txt
で、pushする。
$ git push Counting objects: 4, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 271 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To git@gist.github.com:644e504e9d550c2fedd3.git 22e7656..c8c75b2 master -> master $
あとはブラウザからの更新ですかね。適当に弄って……rstに変えてしまおう。
できた。rstとかをちゃんと表示してくれるのが素敵。
とにかく出来たので、何も考えずにpullる。
$ git pull remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. Unpacking objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0) From gist.github.com:644e504e9d550c2fedd3 c8c75b2..9f3bf9d master -> origin/master Updating c8c75b2..9f3bf9d Fast-forward newfile.txt => newfile.rst | 1 + 1 file changed, 1 insertion(+) rename newfile.txt => newfile.rst (57%)
特に問題なく更新できますねー。
ってことでごくごくフツーに使えます。
つまらん
このままじゃあまりにつまらないので、ブラウザから出来ない操作をしてみようかなと。
新しいディレクトリfugaを作って、その中にpiyoを突っ込む。
$ mkdir hoge $ echo fuga>hoge/piyo.txt $ git add . $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: hoge/piyo.txt # $ git commit -m'add directory' [master 9763c29] add directory 1 file changed, 1 insertion(+) create mode 100644 hoge/piyo.txt
で。push してブラウザを更新。
$ git push Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (4/4), 354 bytes, done. Total 4 (delta 0), reused 0 (delta 0) To git@gist.github.com:644e504e9d550c2fedd3.git 9f3bf9d..9763c29 master -> master
この状態でブラウザから編集したらどうなるか。textfile.txtを適当に変える。
……なんか増えた。実は編集がメンでも hoge/piyo.txt が hogepiyo.txt になってた。
pullってみる。
$ git pull remote: Counting objects: 5, done. remote: Compressing objects: 100% (2/2), done. Unpacking objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0) From gist.github.com:644e504e9d550c2fedd3 9763c29..f02e038 master -> origin/master Updating 9763c29..f02e038 Fast-forward hogepiyo.txt | 1 + textfile.txt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 hogepiyo.txt $ ls hoge hogepiyo.txt newfile.rst textfile.txt
……おう。手元でも増えた。
ログ見るとこう。
$ git log --oneline e41f720 delete subdirectory f02e038 9763c29 add directory 9f3bf9d c8c75b2 add new file 22e7656
ブラウザから見えるのと同じ。
変な事してたのバレるとイヤなので、サブディレクトリ作ったのを無くそう。
ディレクトリ作る前(9f3bf9d)に戻して、ブラウザからの編集(f02e038)をcherry-pickする。正直rebaseでいいんだけど、コマンドをそのまま貼るのに向いてないと思ったのでこっち。
$ git reset --hard 9f3bf9d HEAD is now at 9f3bf9d $ git cherry-pick f02e038 Aborting commit due to empty commit message.
……コミットメッセージ無いからって怒られた。書けばいいんでしょ書けば。
$ git status # On branch master # Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded. # # Changes to be committed: # # new file: hogepiyo.txt # modified: textfile.txt # $ git commit -m'f02e038' [master 48c2680] f02e038 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 hogepiyo.txt
でけた。リモートとの差分とログを確認。
$ git diff origin/master $ git log --oneline 48c2680 f02e038 9f3bf9d c8c75b2 add new file 22e7656
これでよし。このままpushすると当然 reject されますが、今回は改竄したいから -f しちゃいます。どーん。
$ git push -f Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (4/4), 341 bytes, done. Total 4 (delta 0), reused 0 (delta 0) To git@gist.github.com:644e504e9d550c2fedd3.git + e41f720...48c2680 master -> master (forced update)
蛇足
- gistのコミットログは空っぽです。
- gitはコミットメッセージは書かなきゃいけないので、手元で弄るときは普段通り書く。
- でもgistからは見えない。
- 見たければcloneしやがれ?
- サブディレクトリ入れても、ブラウザから編集しなければ問題ないっぽい。
- 簡易プライベートリポジトリに使えるんじゃね?
- 正直微妙だろ……て言うか金払えば。
- bitbucketならプライベート作れたりする。
- 簡易プライベートリポジトリに使えるんじゃね?
- gitなんでブランチも作れる。
- 普通にpushもできる。
- ブラウザからは見えないけど。
- cloneすれば見えるよ!
結論
変な事してないで素直にGitHub使いましょう。