-
作業ツリー ローカルレポジトリ上にある現在の作業ファイル 作業ツリーの変更点はaddによりインデックスに追加
-
インデックス(ワーキングツリー) ローカルレポジトリへ反映する変更を一時的に貯めておく領域 インデックスの内容はcommitでローカルレポジトリに反映
-
リポジトリ
-
ローカルレポジトリ 作業者のマシン上にあるレポジトリ ローカルマシンでの作業内容が保存される pushにより共有レポジトリに反映される
-
リモート(共有)レポジトリ 共有するレポジトリで、サーバー上にあるリポジトリ 開発者はここにあるソースをpull / fetch で取り込む
$ git config --global user.name
$ git config --global user.name
$ git config --global user.name "ユーザー名"
$ git config --global user.name "E-mailアドレス"
$ less ~/.gitconfig
$ git config user.name
$ git config user.name
$ git config user.name "ユーザー名"
$ git config user.name "E-mailアドレス"
$ less ~/<プロジェクトフォルダまでのパス>/.git/config
$ git checkout <変更内容を破棄するファイル名>
// まとめて破棄する場合はカレントディレクトリを指す
$ git checkout .
$ git add <追加するファイル名>
$ git reset HEAD myfile.txt
$ git commit -m "コミットメッセージ"
$ git reset --soft HEAD^
※ 実際には取り消しではなく、状態を戻している。 ※ softオプションは変更がindexに追加されている状態にする。
$ git reset --soft HEAD^^
※2つ前を取り消すと、もちろん1つ前のコミットも取り消される。
$ git reset <コミットID>
$ git reset --hard <コミットID>
※ hardオプションは変更した内容も破棄される。(修正もしていない状態になる)
$ git push origin <反映したブランチ名>
$ git status
$ git log
commit 766296f12951d71f331a91eb614ef0eac074e93b
Author: tkd55 <takeda@cshool.jp>
Date: Tue Feb 4 15:41:22 2014 +0900
first Commit
$ git diff
$ git diff --cached
$ git diff HEAD
$ git branch <作成するブランチ名>
$ git branch
$ git checkout <移動先のブランチ名>
$ git checkout -b <新規ブランチ名>
$ git push origin <ブランチ名>
例. リモートリポジトリ上で master / develop / hoge.. など色々なブランチで運用している場合、新規メンバはcloneしてくるだけでは、通常masterしか存在してないのです。 そこで、開発用developブランチに切り替えたいという時は、こんな感じで。
$ git fetch
$ git branch -a
* git_command
master
remotes/origin/HEAD -> origin/master
remotes/origin/git_command
remotes/origin/master
$ git checkout -b develop origin/git_command
補足 git checkout -b [ローカルに作成するブランチ名] [リモート上のブランチ] -bオプションを指定しておくと、自動的にそのブランチに切り替わる。 -bオプションを指定しないと、以下を再度する必要がある。
$ git marge <取り込むブランチ名>
$ git branch -d ブランチ名
$ git push --delete origin <削除するリモートブランチ名>
$ git fetch -p
$ git fetch <リモートレポジトリ>
2つのコミットAとBとがあるときに、コミットAにいたる歴史がコミットBにいたる歴史にすべて含まれている場合、2つのコミットはファーストフォワードの関係にある、とか、コミットAはコミットBにファーストフォワードする、といいます。
コミットAの歴史: X -> A コミットBの歴史: X -> A -> Y -> B コミットBの歴史に、コミットAの歴史が全て含まれている。
これが「fast-forward」な関係
コミットAの歴史: X -> Y -> A コミットBの歴史: X -> Y -> Z -> B コミットBの歴史に、コミットAの歴史が含まれていない(Aのコミットが含まれていない
これだと「fast-forward」な関係ではなくなり、「none fast-forward」
mergeとrebaseは共に履歴を統合しますが、特徴が異なります。
-
merge 変更内容の履歴はそのまま残るが、履歴が複雑になる。
-
rebase 履歴は単純になるが、元のコミットから変更内容が変更される。 そのため、元のコミットを動かない状態にしてしまうことがある。 mergeとrebaseは、チームの運用方針に応じて使い分けます。 例えば、履歴を一本化するように運用をするのであればrebaseを使う。
トピックブランチに統合ブランチの最新のコードを取り込む場合はrebaseを使う。統合ブランチにトピックブランチを取り込む場合は、まずrebaseしてからmergeというように使い分けます。
$ git tag
$ git tag -n
$ git tag tag名
$ git tag tag名 -m "アノテーション"
$ git tag tag名 commitハッシュ
$ git tag -d tag名
$ git tag -l "A*"
$ git push origin tag名
git push origin :tag名
[alias]
s = status
co = checkout
rb = rebase
br = branch
cm = commit -m
glog = log --graph --oneline --decorate --all
$ git submodule foreach git pull origin master
$ git submodule update --init --recursive