使えるツール(IT)

【バージョン管理】GitとGithub

Git?GitHub?ってなに??

自分の書いたコードを公開するツールだよ〜〜

企業では、その会社の中だけで公開し、バグやセキュリティ上の問題がないかを他の社員に見てもらい、レビューしてもらったりするよ〜〜

いつでも好きな時点に戻せて、各メンバーの修正を合体できるよ〜〜

Git とは  -> ファイルの変更履歴を記録できるバージョン管理を行うためのツールだよ〜〜

GitHubとは -> gitを使ったチーム開発をより便利にするwebサービスだよ〜〜

バージョン管理システムには、いくつか種類があるよ簡単にみて行こう!!



目次

バージョン管理の種類

バージョン管理方式 概要 管理ツール
集中型バージョン管理 サーバー上のリポジトリを複数のクライアントが操作して、バージョンを管理する CVS、
Subversion
分散型バージョン管理 サーバー上のリポジトリを複数のクライアントがローカル上に複製し、変更結果をリポジトリにマージする事で、バージョンを管理する Git MercurialGIthubの大まかな仕組み

GigHubの全体像

バージョン管理で使われる用語

リポジトリ

ファイルの内容やその変更履歴などを記録するデータベースのこと。

ファイル名.git がリポジトリの形

リモートリポジトリ

Github上の、データを保存している場所を指す

ローカルリポジトリ

Githubに送信するデータを登録しておく、自身のPC上の場所を指す

作業コピー/作業ツリー

作業コピー

バージョン管理システムで管理されているファイルのこと。

 バージョン管理システムで管理しているファイルの実態はリポジトリ内にあり、ファイルシステムは上のファイルはあくまでその一時的なコピーである考えから作業コピーと言います。

作業ツリー

作業コピーなどが格納されているディレクトリのこと

ブランチ

履歴の流れを分岐して記録していくためのもの。

分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができる

Masterブランチから、作業ブランチを作って移動してから作業することをブランチを切ると言う

コミットとコミットID

コミット=リビジョン

作業コピーに対してファイルの追加・削除・編集を行なった後に変更履歴を記録すること。

インデックス
これから登録するファイルが、以前とどう変わったかを登録する一次的な保管場所。

GitHubにデータを送信する前に一時的にローカル環境にデータを登録し,その後一気にGitHub上に送信します.
そのローカル環境にデータを登録することをコミットといいます.

コミットID

それぞれのコミットを識別するためのIDのこと。

タグ

GitではコミットIDに対して、わかりやすい別名をつけることができて、その別名のこと。

チェックアウト

ローカルリポジトリに記録されている、特定のコミット時のファイルを取り出す作業のこと。

HEAD

今チェックアウトされているコミットを指す時の呼びかた。これは今自分がどのコミットで作業しているかを意味する。HEADは常にコミットを指している。ツリーに変化をもたらすほとんどのgitコマンドは、このHEADを動かすことからその動作を始める。

ブランチ

コミットは時系列に沿って管理され、コミット日時が最近のものほど新しいものとして扱われる。

マージと競合(コンフリクト)

マージ

別の開発者が加えた変更点や別のブランチで加えた変更点をを取り込む作業のこと

競合(コンフリクト)

マージするとき同一の箇所に自分と他のユーザーが異なる変更を同時に加えている場合がある。その状況のこと。つまりマージ時に同じに場所に同時に別々の修正がなされたときに発生する

クローン

リモートリポジトリをコピーしてローカルリポジトリを作成する作業のこと

プッシュとプル

プッシュ

リモートリポジトリにローカルリポジトリの内容を送信すること。

プル

リモートリポジトリの内応をローカルリポジトリに取り込むこと。

フェッチ

リモートリポジトリから更新を取得

フォーク

他の人が公開しているリモートリポジトリを自分のアカウントにコピーする機能のこと



基本的な流れ

ここで、Git・Githubの全体像を確認しておきましょう!

リポジトリをローカルで新規作成してからリモートリポジトリにコミットする

①リポジトリを新規作成する
②ファイルを作成する
③コミットするファイルを登録(指定)する
③コミット対象のファイルを確認する
④コミットを実行する
⑤Githubでリポジトリを作成する
⑥リモートリポジトリのアクセス先を設定する
⑦リモートリポジトリにプッシュする

①リポジトリを新規作成する

$git init

②ファイルを作成・削除・編集したりする

$emacs hoge.txt

③コミットするファイルを登録(指定)する

$git add hoge.txt

コミット対象のファイルを確認する
$git status

④コミットを実行する

$git commit -m “コミットのコメント”

⑤Githubでリポジトリを作成する

⑥リモートリポジトリのアクセス先を設定する

$git remote add origin https://github.com/GitHubのユーザ名/GitHubのリポジトリ名.git

https://github.com/GitHubのユーザ名/GitHubのリポジトリ名.gitは


以上のようにGithubから持って来ます

⑦リモートリポジトリにプッシュする

$git push -u origin master

 



リポジトリをGitHubからクローンしてきてからローカルリポジトリにコミットしローカルリポジトリを登録する

①リモートリポジトリをクローンする
②ファイルを作成・削除・編集する
③コミットするファイルを登録(指定)する
④コミットを実行する
⑤リモートリポジトリに反映する

①リモートリポジトリをクローンする

$git clone git@github.com:hylom/git-sample.git

クローンしたいリポジトリのページに『Clone or download』のボタンがあるので、そこで、sshでアクセスするURLがあるのでそれをコピーします。

②ファイルを作成・削除・編集する

$emacs hoge.txt

③コミットするファイルを登録(指定)する

$git add hoge.txt

コミット対象のファイルを確認する
$git status

④コミットを実行する

$git commit -m “コミットのコメント”

⑤リモートリポジトリに反映する

$git push origin master

自分以外のリポジトリをプルリクエストしてからマージされる

①他の人のリポジトリをフォークする
②クローンする(自分の開発環境に持ってくる)
③作業用のブランチを作ってコミットする
④プッシュする(自分のgithub上に送る)
⑤Github上でプルリクエストを作成する
⑥マージされる

①他の人のリポジトリをフォークする

 

②クローンする(自分の開発環境に持ってくる)

 

③作業用のブランチを作ってコミットする

 

④プッシュする(自分のgithub上に送る)

 

⑤Github上でプルリクエストを作成する

 

⑥マージされる



リポジトリ内のファイルの削除や移動、リネーム

Gitのデフォルトの動作では、git addで明示的に指定したファイルのみがコミットの対象になります。つまり、git addで指定しないと、そのファイルに対する変更点はコミットされません。ファイルを削除したという情報をリポジトリに保存するには、削除したファイルを対象にgit addを実行する必要があります。またaddにしなくても以下のコマンドを使用して明示的に削除したりすることができます。

リポジトリの削除

$git rm hoge.txt

リポジトリの移動

$git mv hoge.txt sample/hogehoge

リポジトリのリネーム

$git mv hoge.html hogehoge.html

バージョン管理対象から特定のファイルを除去する

Gitでは、『.gitignore』という名前のファイルを作成することで、特定のファイルを無視するするように指定できます。エディタが自動的に作成するバックアップファイルやコンパイル時に生成される中間ファイル、ログファイルなど、バージョン管理に加えたくないファイルが作業ツリーないに存在する場合に有用です。

特定のファイルを無視したい

Memo.txt
→自分用のメモファイルを無視する

特定の拡張子を無視したい

*.rbc
→.rbcという拡張子が付いているファイルが無視される

特定のファイルを無視しない

!test.rbc
→test.rbc は無視されない

特定のディレクトリ以下を無視したい

templates_c/
templates_cというディレクトリ以下が無視される

ルートディレクトリの直下にあるものを指定したい

「/」で始まるパターンについては、『.gitignore』ファイルが置かれたディレクトリ内のファイルやディレクトリのみが対象する

/log/
→ルートディレクトリにあるlogというディレクトリ以下が無視される

コメント

行頭に#を入力するとコメントが書ける



コミット履歴の確認

$git log コマンドを使用することでコミット履歴の確認ができます。

git log

現在チェックアウトしているブランチにおけるコミットログが表示されます。そのコミットログには、コミットID、コミットしたユーザー、コミット日時、コミット時に入力したコメントが含まれます。

git log –name-status

ファイルの先頭にそのコミットで変更したファイルについての情報も確認できる。
『A』新たに追加されたファイル
『M』編集されたファイル
『D』削除されたファイル

git log hoge/hoge.txt

特定のファイルに対する更新履歴を確認したい場合

git log -u hoge

-pまたは-uオプションを使用することで、変更が加えられた全てのファイルの変更点が表示される。

ブランチの作成と確認と切り替え

ブランチの確認

$git branch
*は現在いるブランチを表しています。

ブランチの作成

$git branch test
↑を実行した後にgut brachした結果です

ブランチの切り替え

$git checkout test
↑を実行した後にgut brachした結果です

ブランチの作成とチェックアウトを同時に行う
$git chekout -b test

ブランチのリネーム

$git branch -m text test2
↑を実行した後にgut brachした結果です

ブランチの削除

git branch -d test2
現在いるブランチは削除できないのでmasterブランチに移動してから↑のコマンドを実行します。

上のコマンドを実行した後にgut brachした結果です



過去のバージョンとの比較

作業ツリー内のファイルに加えた変更点を確認する

$git diff hoge.html

引数にファイルを指定して上のコマンドを実行すると、現在の作業ツリー内でそのファイルに加えられている変更点がdiff形式の差分として表示する。

・git add コマンドを実行していない場合:そのブランチにおける直前のコミット時点のコミット時点のファイルと比較した差分

・git add コマンドを実行している場合:git addコマンドを実行した時点のファイルと比較した差分

過去のコミットやことなるブランチのファイルと比較する

$git diff <コミットID/タグ/ブランチ> <ファイル/ディレクトリ名>

コミットIDやタグ、ブランチなどを指定して上のコマンドを実行することで、作業ツリー内のファイルを任意のコミット時点のファイルと比較した差分を確認できる

指定したコミット時点のファイルを取り出す

$git checkout <コミット/ブランチ/タグ> <取り出したいファイルのパス> …

ファイルは同時に複数指定でき、ディレクトリを指定すればディレクトリ内の全てのファイルを取りだすことができる。

過去のコミット時点でのファイルを取り出す

$git checkout コミットID ファイル名

コミットIDは全て入力しなくてもコミットを識別できるために最初の5文字程度で大丈夫です。

git log ファイル名

commit の隣に書いてあるのがコミットIDになります



別ブランチでの変更点をマージする

競合(コンフリクト)を解消する

 

タグの作成と削除する

タグをつける

 

作成されているタグの確認と使用



タグの削除

 

リモートリポジトリを追加する

リモートリポジトリを登録する

リモートリポジトリ一覧の確認

リモートリポジトリのリネームと削除

リモートブランチの確認とチェックアウトする

リモートブランチを確認する

 

リモートブランチをチェックアウトする



ブランチやタグをプッシュする

ブランりやタグをプッシュする

 

リモートブランチを追跡する

 

新たに作成したブランチのプッシュ

 

リモートブランチの削除

 

タグのプッシュ

 

ブランチやタグのフェッチとプル

フェッチを実行する

 

プルを実行する



プル・プッシュ時に発生した競合を解決する

プル時に発生した競合の解消

 

プッシュ時に発生した競合の解消

 

作業ツリーへの変更を一時的に保存する

stashを作成する

 

stashに保存した変更点を復元する

 

stash一覧を確認する

 

リポジトリ内のファイルを整理する

リポジトリの不要なファイルを一括削除



コマンド

$ git init

これでローカルリポジトリを作成する

・ローカル環境にリポジトリを作る(ローカルリポジトリ)

$ git add ファイル名

・リポジトリに追加したい対象を指定する

コミットするファイルはファイル名であるとgitに教えている

$ git  commit -m “コメント”これでローカルリポジトリにコミットする

・ファイル(更新内容)をローカルリポジトリに登録(コミット)する

このcommandはコミットするファイルはfilenameであるとgitに教えている

-m オプションを付け加えずにコミット実行すると任意のテキストエディタが自動で開かれるので、そこにコメントを付け加えることができる(コミットメッセージを付け加えないと怒られる)

 

適当にtxtにファイルを用意する

$ echo hello git!  > test.txt

$ git add test.txt   これで変更点を勝手にインデックスに追加してくれる

fatal: Not a git repository (or any of the parent directories): .git
が表示されたら,git initが失敗している(ローカルリポジトリが作成できてない)ということになります.

インデックスにデータを追加したら、登録(コミット)する

$ Git commit -m “始めてのGitHub”

このコマンドで、インデックスの内容が全てローカルリポジトリに登録する

この時点では「ローカル」リポジトリなので、github上には反映されてない

・githubにデータを送信する(リモートリポジトリにデータをプッシュする)

$ Git push origin master

・ファイルを削除する

$ git rm filename

・ブランチを作る

$ git branch testbranch

これでtestbranch という名前のブランチが作成される

・gitのブランチを作成して切り替える

$ git checkout -b <new> <old>

・ブランチを確認する

$ Git branch で確認できる

・ブランチを移動する

$ Git checkout  testbranch

これでtestbranch というブランチに移動する

git branch で確認すると「master」「testbranch」というブランチがある

masterについている *(アスタリスク)は、今master ブランチに全てのデータが書き込まれている

参照&書き換え先のブランチをtestbranchに変えてみる

Git checkout testbranch でブランチを移動する

これで再度 git branch すると *の位置がtestbranchに移っていることが確認できる

・ブランチを結合(マージ)する
※$ git checkout ブランチ名 で,結合したいブランチに移動して…
$ git merge 取り込むブランチ

・現在のブランチを指定のブランチからリベースする                   あるブランチに入っている作業内容をそのまま直接masterブランチ上の内容に移動する。こうすることで、実際には並行して開発された2つの別々のブランチ上のフィーチャを、あたかも1本のブランチ上でシーケンシャルに開発されていたかのように見せることができる. 今いるブランチをmasterにrebaseする

$ git rebase <branch>

・ワークツリーの状態を見る

$ git stutas

・コミットログを見る

$ git log

・ステージングエリアをgitリポジトリの状態に戻す

$ git reset HEAD filename

・ワークツリーをステージングエリアの状態に戻す

$ git checkout – filename

・ファイルやディレクトリを移動する

$ git mv

・データ領域を指定のコミットの状態に戻す

$ gut reset –<mode> <commit>

○リモート操作のコマンド&データ領域の動き

・リモートリポジトリをローカルに複製

$ git clone <url>

・リモートリポジトリに変更を送信

$ git push <remote> <refspec>

・リモートブランチを最新に更新

$ git fetch <remote> <refspec>

  • その他
  • バージョン管理が必要ないファイル

中にはバージョン管理したくないファイルやディレクトリもあるだろう。

例えば、OSや自動生成するファイルやキャシュ、容量が大きすぎるもの