大人の階段
というわけで今まで頑なにSVNを使ってきた私も、GitHubデビューをしました。恥ずかしい話、使い始めて3日目なので、自分のためのチートシート程度にしかならないと思います。使い慣れている人はブラウザバック推奨です。
まずはアカウント登録から
GitHubにアクセスして、適当にユーザー名、メールアドレス、パスワードを設定、リポジトリを作成。
初期設定が完了したら、早速使ってみっか。
$ mkdir GitHubTest
$ cd GitHubTest
リモートリポジトリの内容をローカルに反映
$ git clone URL
※ローカルリポジトリ名を指定しない場合はリモートリポジトリ名でクローンされる
ワークツリーにファイルを作成
$ touch hoge
ステージングストレージ(仮称)にhogeファイルを追加
$ git add hoge
ローカルリポジトリにhogeファイルをコミット
$ git commit -m "hogeファイル作成"
ローカルリポジトリをリモートリポジトリに反映
$ git push URL
初めてpushするとき、ブランチ(後述)がないので怒られる場合のコマンド。
originはリモートサーバ。masterはブランチ名。
$ git push origin master
※↑はローカルのmasterブランチをリモートの上流ブランチにpushする意味。【ローカルブランチ】:【リモートブランチ】と指定出来る。リモートブランチ名は通常省略される。
リモートリポジトリをローカルリポジトリに繁栄するならこれ。fetchとmergeを一緒にやってくれる。マージしてくれる物という解釈。
$ git pull origin master
大体この辺が出来れば、かろうじて使えると言えるレベル。
push補足
リモートリポジトリをoriginとして登録する
$ git remote add origin https://github.com/【ユーザ名】/【リモートリポジトリ名】
リモートリポジトリを確認する
$ git remote -v
コンフィグ確認
$ git config user.name
$ git config user.email
ブランチ
他に重要な概念としてはブランチがあります。各々が独立して作業を行い互いの影響を避けることで、同時に作業が出来るようにするためのものです。
それぞれの変更は、マージすることで最終的な形となります。
現在のブランチ状況確認
$ git branch
secondブランチ作成
$ git branch second
secondブランチへ移動
$ git checkout second
$ touch ぶらんちしてやる
$ git add ぶらんちしてやる
$ git commit -m "ぶらんちしてやる"
$ git checkout master
$ ls
masterブランチにsecondブランチをマージ
$ git merge second
$ ls
※アドしてコミットして終了
今後コンフリクトすることもあるだろうけど、その都度ぐぐるということで。
便利ではあるが理解が難しいと言われているのも納得です。
ブランチを指定してプッシュ
# git push origin 【ローカルブランチ名】:【リモートブランチ名】
特定のリモートブランチをローカルに引っ張るには、下記コマンドです。
$ git checkout -b local_branch_name origin/remote_branch_name
その他の便利設定
.netrc
毎回ユーザーIDとパスワードを打つのはだるいので、下記のコンフィグを用意すればよい。
machine github.com
login ユーザーID
password パスワード
これはftpとかにも転用できるコンフィグです。
標準エディタがnanoだなんて
OSによってはコミット時のエディタがvimではなくnanoになっている場合がある。コミットメッセージくらい気にしないなら構わないのですが、一応まとめます。
[core]
editor = /usr/bin/vim
差分確認とか
$ git log
commit 【リビジョン番号】
Author: 【コミット者情報】
Date: 【コミット日時】
【コミットメッセージ】
$ git status
Changes not staged for commit:
【変更されたがステージングされていないファイル】
Untracked files:
【新規追加ファイル】
$ git diff
+ 【追加されたコード】
- 【削除されたコード】
git diff
はワークツリーとインデックスを比較します。インデックスとローカルリポジトリを比較するにはgit diff --cached
を使います。
git log --oneline
- コミットメッセージとリビジョン番号のみ表示
git log -p
- 差分など詳細情報を表示
git log -p -[1-9]
- 数字を付与するとその数の分だけ表示
git log -p --【ファイル名】
- 該当のファイルのみログを表示
git log -S【文字列】 -p
- 文字列が追加/削除されたコミットのみ表示
git show 【リビジョン番号】
- 該当コミットの詳細情報を表示
git show 【リビジョン番号】:【ファイル名】
- 該当コミット時のファイル内容を表示
git diff 【リビジョン番号(古)】:【リビジョン番号(新)】
- リビジョン指定の差分確認
.gitignore
.gitと同じ階層の.gitignoreファイルにファイル名を記述すると、記述されたファイルをgit管理の対象外に出来る。アカウント情報や変更する事のないライブラリなどを記述することがある。
$ touch sample.txt
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
sample.txt
nothing added to commit but untracked files present (use "git add" to track)
$ vi .gitignore
※sample.txtを記述
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
nothing added to commit but untracked files present (use "git add" to track)
ワークツリーからsample.txtが追加されている。.gitignoreは管理対象のファイルなので、ワークツリーに追加されている。
戻したい時
git checkout -- 【ファイル名】
- ワークツリーへの変更を戻す
- ※
git checkout 【リビジョン番号】
- ファイルを指定しない場合は該当コミットのワークツリーとインデックスの状態に戻す。ブランチもmasterと別の使い捨てのものに切り替わるらしい(?)
- ※2
git checkout -f master
- -f: ワークツリーとインデックスを捨ててmasterに戻る。
git reset HEAD -- 【ファイル名】
- インデックスへ追加されたファイルをワークツリーへ戻す
git reset 【リビジョン番号】
- 該当コミットのコミットする前(ワークツリーのみ更新)の状態へ戻す
- 直前のコミットを取り消す場合に使用する
git revert 【リビジョン番号】
- 直前のコミットを取り消す
- resetとの違いはコミットログを残す点
git reflog
- gitコマンドの操作履歴を表示
- 戻してしまったのを戻したい時に使用する
1.ワークツリーの編集を戻す例
何かしら編集(ワークツリーのみ変更)
$ vi sample.txt
ワークツリーとインデックスの差分確認
$ git diff
ワークツリーの変更を元に戻す
$ git checkout -- sample.txt
$ git diff
$ cat sample.txt
2.インデックスへの追加をワークツリーへ戻す例
何かしら編集(ワークツリーのみ変更)
$ vi sample.txt
インデックスへステージング
$ git add sample.txt
インデックスとローカルリポジトリの差分確認
$ git diff --cached
インデックスからワークツリーへファイルを戻す
$ git reset HEAD -- sample.txt
$ git diff --cached
$ git diff
※--hardオプションを付けるとワークツリーへの変更も削除されるので注意
3.直前のコミットを取り消す例
直前のコミットを無かったことにする
$ git log --oneline
$ git reset 【リビジョン番号】
※--hardオプションを付けるとワークツリーへの変更も削除されるので注意
ワークツリーには前回のコミット内容が残っている
$ git diff
コミットメッセージを変更するなどして再度コミットする
$ git add .
$ git commit
##################################
## 推奨されているコミット取り消し方法 ##
##################################
直前のコミットを無かったことにする
$ git log --oneline
$ git revert 【リビジョン番号】
指定のコミットを打ち消したというコミットログが残る
$ git log --oneline
4.取り消しを取り消す例
$ git reflog
「reset: moving to 【リビジョン番号】」というのがresetした履歴なので、その直前のコミットに戻ればいい。
$ git reset 【リビジョン番号】 --hard