日々常々

ふつうのプログラマがあたりまえにしたいこと。

Gistで遊んでみる

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 [email protected]: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	[email protected]:644e504e9d550c2fedd3.git (fetch)
origin	[email protected]: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 [email protected]: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 [email protected]: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 [email protected]:644e504e9d550c2fedd3.git
 + e41f720...48c2680 master -> master (forced update)

できたのでブラウザを更新。

これでサブディレクトリ作ってた事はばれない。うん。

蛇足

  • gistのコミットログは空っぽです。
    • gitはコミットメッセージは書かなきゃいけないので、手元で弄るときは普段通り書く。
    • でもgistからは見えない。
      • 見たければcloneしやがれ?
  • サブディレクトリ入れても、ブラウザから編集しなければ問題ないっぽい。
    • 簡易プライベートリポジトリに使えるんじゃね?
      • 正直微妙だろ……て言うか金払えば。
      • bitbucketならプライベート作れたりする。
  • gitなんでブランチも作れる。
    • 普通にpushもできる。
    • ブラウザからは見えないけど。
    • cloneすれば見えるよ!

結論

変な事してないで素直にGitHub使いましょう。