gitのチュートリアル

git のチュートリアルを読んだ。

基本的な概要は掴めたかと思うが、いかんせんgit initとかgit commitといった基本的な部分しか知らなかったのでまだまだ使ってイメージを膨らませてみないとわからないといったところ。(git stashの使いどころとか)

図のイラストがところどころあったので、わかりやすかった。

 

以下、勉強した内容のメモ

gitのバージョン管理を開始するためのsubdirectoryを作成。

同じディレクトリでコマンドを打っても、上書きされず、新規に作られる。
git init

git cloneとの違い
git cloneはgit initしてリモートからそれをコピーする。

commitできない、編集できないディレクトリ。(storage facilityなど)。
pushとpullだけできるディレクトリ。
git init --bare <directory>

ex) ssh <user>@<host> cd path/above/repo git init --bare my-project.git

git initしてtemplate_directoryからファイルをdirectoryにコピーする。
git init <directory> --template=<template_directory>


git initのオプション
warningほどの重要なアラートだけ表示
--QUIET
bareレポジトリ作成
--BARE
テンプレートディレクトリからコピー
--TEMPLATE=<TEMPLATEDIRECTORY>
.gitファイルを他のフォルダへ移動したい
--SEPARATE-GIT-DIR=<GIT DIR>
レポジトリのアクセス権を設定
--SHARED[=(FALSE|TRUE|UMASK|GROUP|ALL|WORLD|EVERYBODY|0XXX)]

ex)git init --bare /path/to/repo.git
git init /new/repo/path --template=/absolute/path/to/template \


すでに存在しているリポジトリをコピーする
git clone

ex)git clone ssh://john@example.com/path/to/my-project.git
cd my-project
# Start working on the project
ローカルのrepoにtagのファイルだけをコピー
git clone -branch <tag> <repo>

git cloneのオプション
clone元の指定したブランチの内容をclone
-branch
ex)git clone -branch new_feature git://remoterepository.git

pushとpullはされるディレクトリのclone。
git clone --bare

--bareの要素プラスrefの内容もコピー。
git clone --mirror

gitのURL
ssh ssh://[user@]host.xz[:port]/path/to/repo.git/
git git://host.xz[:port]/path/to/repo.git/
http http[s]://host.xz[:port]/path/to/repo.git/

gitの情報設定
git config

--local
--global
--system
の順に設定範囲が広くなる。何もつけなければ--localと同じ範囲。

git config --global user.email "your_email@example.com"

mergeする際に衝突しないかチェックするためのツール
git config --global merge.tool kdiff3

ショートカットキー作成
git config --global alias.ci commit

変更をworking directoryからstaging areaへ追加する。変更はcommitの段階で記録される。
git add

staging areaの内容を記録する。
git commit
メッセージ付き
git commit -m 'メッセージ'
全てをコミット
git commit -a

ファイルを一時的に隠す
git stash
メッセージ付きでstash
git stash save "add style to our site"
stashのリストを見る
git stash list
stashの一部を削除
git stash drop stash@{1}

gitの管理に含まないファイル
.gitignore

git statusとgit logでレポジトリの状態を見る
git statusはworking directoryとstaged areaでどうなっているかの状態
git logはcommitされた記録を調べる

バージョンを元に戻したり、ブランチを変更
git checkout
masterブランチに変更
git checkout master
指定されたコミットまで戻る
git checkout <commit>
ex) git logでcommitされた内容を見て、先頭にあるIDで
git checkout a1e8fb5のように指定

commitを打ち消すような逆のcommitをする
git revert
変更を取り消すメソッドの似たものにgit resetがあるがこちらはオリジナルのコピーは作れない。

追跡されていないファイルの削除
git clean

直前のcommitを修正する。commitしてすぐaddした後に小さな変更なので直前のコミットにまとめたい時など。
git commit --amend
コミットメッセージなし
git commit --amend --no-edit

ブランチをmasterブランチなどに結合する。直線系のhistoryになるが、history自体も変更されるのでpublic historyでは使わない。
git rebase

過去のあらゆるcommit履歴を参照できる
git reflog

他のリポジトリとの接続の作成、内容確認、削除を行う
リモート接続の一覧をURLと一緒に表示
git remote -v
リモートリポジトリに対して新規接続
git remote add <name> <url>
ex) origin に加えて他の開発者のリポジトリへの接続を作成
git remote add john http://dev.example.com/john.git

リモートレポジトリからローカルレポジトリにブランチをインポート。リモートブランチとして保存。
git fetch
ローカルリポジトリを中央リポジトリのmasterと同期
git fetch origin

中央リポジトリのmasterのcommit状況を調べる
git log --oneline master..origin/master
masterにブランチを移動し、mergeすれば中央リポジトリとの同期が完了
git checkout master
git merge origin/master

git fetch + git merge ローカルリポジトリを中央リポジトリに同期する簡単な方法。
git pull
他の人の作業を全て終えた後の状態から同期する。
git pull --rebase origin

git fetchの反対で、ブランチをリモートリポジトリにエクスポート。ローカルな作業を中央レポジトリに公開する時に使われる。


プルリクエスト...他の開発者に自分のブランチをプルするようリクエスト。
他の開発者と作業する時にはまずフォークする際に自分の作業ブランチを作成し、それをオリジンにpushする


中央管理型ワークフロー...
誰かが中央レポジトリを作成し、全員が中央レポジトリをクローンする。
それぞれがプッシュする際には必ず中央レポジトリの変更をプルしてから出ないと競合が生まれるのでプル必須。

フィーチャーブランチワークフロー...
全てのfeatureブランチを別々に。
masterブランチに変更を加えずに、featureを他の開発者と共有。

gitflowワークフロー...
masterで公式バージョン。developで開発されたもののmerge。
releaseでリリースできるものをdevelopから分岐。hotfixで緊急のメンテナンス。
featureで新機能の開発。

forkワークフロー...
開発者が公式リポジトリをフォークしそれをクローン。
ローカルでそれぞれ開発し、featureを公開すると一人がそれらを統合。
それを開発者はプルしていくという流れ。