GitLab

Visualizing Git Concepts with D3

(注:これは、explain-git-with-d3 を和訳したものです。)

このウェブサイトは、Gitの基本的なコンセプトを視覚的に理解するために作られました。 これは、SVGとD3を使った私の初めての試みです。あなたのお役に立てれば幸いです。

このサイトでは、あなたのファイルを "add" したりすることはできません。 このサイトのサンドボックス環境では、常にファイルがステージングされていて、コミットの準備ができているものと考えてください。 ファイルを追加したり、ステージングする方法について学ぶには、Git Basicsのページを参照してください。

サンドボックスは次のGitコマンドで分割されます:

基本的なコマンド

git commit git branch

コミットの取り消し

git reset git revert

ブランチの結合

git merge git rebase

リモートサーバー

git fetch git pull

ここでは、コミットのためにファイルを "add" する方法の説明は省略します。 すでにその方法は身に着けているものと仮定しますので、もしまだ知らない場合は、他のチュートリアルを参照してください。

すでにファイルをステージしてコミットの準備ができているものとして、 git commitコマンドをターミナルに好きなだけ入力してみてください。

git tag name は "name" という名前のタグを作成します。 これは、単に現在チェックアウトしているコミットを指すような新しいタグを作成するだけです。

タグは git tag -d name コマンドで削除することができます(近日公開予定)。 (訳注:タグの削除は実装されていません)

git commitgit tag コマンドを、 このコンセプトが理解できるまで好きなだけ入力してみてください。

git branch name は "name" という名前の新しいブランチを作成します。 これは、単に現在チェックアウトしているコミットを指すような新しいタグを作成するだけです。

ブランチは git branch -d name コマンドで削除することができます。

git commitgit branch コマンドを、 このコンセプトが理解できるまで好きなだけ入力してみてください。

git checkout はさまざまな用途がありますが、主なものはブランチを切り替えることです。
例えば、master ブランチから dev ブランチに切り替えるには、git checkout dev と入力します。 その後、コミットするとどうなるか確認してみてください。

ブランチをチェックアウトするのに加えて、コミットをチェックアウトすることもできますので試してみてください。
新しいコミットを作成してから、git checkout bb92e0e と入力すればどうなるか見ることができます。

git commitgit branchgit checkout コマンドを、このコンセプトが理解できるまで好きなだけ入力してみてください。

git branchgit checkoutコマンドは一つのコマンド git checkout -b branchname でまとめて行うことができます。 このコマンドにより、ブランチがなければ作成され、すぐそのブランチをチェックアウトします。

git reset は、HEADと現在のブランチを好きなコミットの場所まで移動して、残されたコミットを破棄します。 これは、もう必要ないコミットを取り消したい場合に便利です。

このコマンドは、通常 "--soft"、 "--mixed"、 "--hard" の三つのフラグのうちどれかと共に使用します。 soft と mixed フラグは、リセット後にコミットの中にあった変更をどのように扱うかを制御します。 詳しくは、このドキュメントを参照してください。 このサイトでその動作を視覚的に表現することはできないので、ここでは "--hard" フラグのみ使用できます。

参照 "HEAD^" はこのコマンドとよく一緒に使われます。 "HEAD^" は、「HEADのひとつ前のコミット」という意味です。 "HEAD^^" は「HEADの二つ前のコミット」という意味になり、その後も同様です。

git reset は、既に origin(訳注:リモートのこと) に push したり merge したコミットには 絶対に 使用しないでください。 これをすると、あなたのローカルリポジトリは origin と同期した状態でなくなってしまいます。 これがどのような行為であるかをしっかり理解していない限りは、実行しないでください。

すでにプッシュして、チームと共有されたコミットを元に戻すには、 git reset を使うことはできません。 (訳注:ほとんどの場合不可能というわけではありませんが、原則そのようなことはすべきではないという意味です) 代わりに git revert を使わなければなりません。

git revert 取り消したいコミットで行われたすべての変更を打ち消すような、新しいコミットを作成します。

git merge は、二つの親を持つ新しいコミットを作成します。 そこで作られるコミットは、二つのブランチで行われた変更をすべて含むようなスナップショットとなります。

もし二つのコミットに違いがない場合、 git は "fast-forward" という方式でマージします。 このとき何が起こるのか見るには、 "ff" ブランチをチェックアウトして git merge dev を実行してください。

git rebase は現在のブランチのコミットを取り、それらを指定した新しい「ベース」の点に「移動」します。

このコマンドを試すとき、丸が移動する際のコミットIDに注目してください。

「移動」を括弧つきで表記したのは、このコマンドが実際には元のコミットとは完全に異なるIDを持つ新しいコミットを生成して、古いコミットを元の場所に置き去りにするからです。 このため、同僚と既に共有したコミットはリベースしないでください。

git fetch は、ローカルリポジトリのすべての「リモート追跡ブランチ」を更新します。 リモート追跡ブランチは灰色のタグが付いています。

git pull は、git fetch と、 現在のブランチに紐づけられたリモート追跡ブランチの git merge という二つのステップを実行します。 もし現在のブランチがなければ、プロセスはフェッチの後に停止します。

git pull --rebase と入力して "--rebase" オプションを与えると、 pull の二つ目のステップが merge から rebase に置き換わります。このデフォルトの動作は、次の設定によって変更できます: git config branch.BRANCHNAME.rebase true

git push ローカルブランチにあって、 origin サーバーの対応するブランチにないようなコミットを探します。そして、それらをリモートリポジトリに送信します。

デフォルトでは、すべての push はリモートリポジトリで fast-forward merge を行います。もしローカルブランチとリモートブランチで差があれば、 push は拒否されます。 この場合、あなたはまず pull する必要があり、その後に push することができるようになります。

git reset の単純な使用例の一つは、ローカルリポジトリの状態を完全に origin の状態に戻すことです。 これは、 git reset origin/master を入力することで行うことができます。

このとき、追跡対象外のファイルは削除されず、削除するには別途 git clean -df のコマンドを実行する必要があることに注意してください。

これは、あなたが自分だけのローカルブランチで作業している状況です。 origin サーバーの master ブランチから最新のコードを取得したいとしましょう。 ローカルブランチを更新するのに、ブランチを切り替えることなく行うことができます!

まず git fetch をしてから、 git rebase origin/master と入力してください!

git branch -d は、ブランチを削除するのに使用します。 プレイグラウンドにあなたが削除するためのブランチをたくさん用意しておきました。 どうぞご利用ください。

プレイグラウンドで自由に試してみてください。

実践例

これは私が作成した、一般的で役立つと思われるような現実のシナリオです。