-
作業ツリー ローカルレポジトリ上にある現在の作業ファイル 作業ツリーの変更点はaddによりインデックスに追加
-
インデックス(ワーキングツリー) ローカルレポジトリへ反映する変更を一時的に貯めておく領域 インデックスの内容はcommitでローカルレポジトリに反映
-
リポジトリ
-
ローカルレポジトリ 作業者のマシン上にあるレポジトリ ローカルマシンでの作業内容が保存される pushにより共有レポジトリに反映される
-
リモート(共有)レポジトリ 共有するレポジトリで、サーバー上にあるリポジトリ 開発者はここにあるソースをpull / fetch で取り込む
subversionには無い概念で、履歴の流れを分岐して記録していくためのもの。「ローカルブランチ/リモートブランチ/リモートトラッキングブランチ」の、3種類のブランチがある。
-
ローカルブランチ ローカルリポジトリで管理されるブランチ。Gitではリポジトリ作成とともに自動的にmasterブランチが作成される。
-
リモートブランチ リモートリポジトリにあるブランチ。git cloneでリポジトリをコピーした場合、リモートブランチmasterがコピーされる。
-
リモートトラッキングブランチ(追跡ブランチ) リモートブランチを、ローカルリポジトリでトラッキングするためのブランチ。リモートブランチを参照するために利用する。このブランチは変更できない。「origin/master」というのは、originという名前のリモートリポジトリにあるmasterブランチをトラッキングしていることを意味する。
$ git config --global user.name
$ git config --global user.name
$ git config --global user.name "ユーザー名"
$ git config --global user.name "E-mailアドレス"
$ view ~/.gitconfig
$ git config user.name
$ git config user.name
$ git config user.name "ユーザー名"
$ git config user.name "E-mailアドレス"
$ view ~/<プロジェクトフォルダまでのパス>/.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 <反映したブランチ名>
pushの取り消しに2つの方法がある。
- ローカルのリポジトリを修正(コミットの取り消し)後にリモートリポジトリにPushする。
$ git push -f origin master
- ローカルリポジトリのコミットを残して、Pushを取り消す。
$ git push -f origin HEAD^:master
$ git status
- 編集中(indexに追加する前)
$ git status
# On branch master
#
# Initial commit
#
# 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)
- indexに追加後(commit前)
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: sample.txt
#
- commit後
$ git status
# On branch master
nothing to commit, working directory clean
- 通常ログ
$ git log
commit 766296f12951d71f331a91eb614ef0eac074e93b
Author: tkd55 <takeda@cshool.jp>
Date: Tue Feb 4 15:41:22 2014 +0900
first Commit
- ネットワークがわかるcommitログを見たい
$ git log --graph --oneline --decorate --all
* 77a97a6 (HEAD, develop) Push取り消し練習
* f6f7c40 (origin/master, origin/develop, origin/HEAD, master) developブランチに追加
* ef9e874 developブランチにさらにさらに追加
* 2a19062 masterブランチにさらに追加
* a1bd130 masterブランチに追加
* 6cbee97 testブランチにさらに追加
* 61a04d0 testブランチに追加
* 16aa0f1 (origin/test) Merge branch 'develop' into test
|\
| * 305b22f Merge branch 'test' into develop
| |\
| | * bbaf4c3 Revert "testブランチにさらに追加"
| * | 3902277 developブランチに追加
* | | 7c15d74 Revert "testブランチにさらに追加"
| |/
|/|
* | 8e33e53 developブランチに追加
* | d786079 testブランチにさらに追加
* | 89f2651 testブランチに追加
$ git branch <作成するブランチ名>
$ git branch
$ git checkout <移動先のブランチ名>
$ git checkout -b <新規ブランチ名>
$ 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名
$ git diff
$ git diff --cached
$ git diff HEAD
ディレクトリ
$ git rm --cached -r drafts/
ファイル
$ git rm --cached A.txt
$ git cherry-pick <コミットID>
$ git reflog
162ff5c HEAD@{0}: commit: diffコマンド
38054b0 HEAD@{1}: commit: ブランチ関連追加
13e550f HEAD@{2}: commit: 概念追加
c01924c HEAD@{3}: commit: 編集/add/commitの取り消し
23fbbed HEAD@{4}: checkout: moving from master to git_command
23fbbed HEAD@{5}: commit: 再度コミット
$git reset --hard HEAD@{1}
$ git reset --hard ORIG_HEAD
例. リモートリポジトリ上で 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 remote add
$ git marge <取り込むブランチ名>
$ git branch -d ブランチ名
$ git push --delete origin <削除するリモートブランチ名>
or
$ git push origin :削除するリモートブランチ名
$ git fetch --prune
or
$ git fetch -p
$ git fetch <リモートレポジトリ>
$ git fetch
で入手したコミットの先頭は FETCH_HEAD で扱える。 たとえば、ログを見るには
$ git log FETCH_HEAD
差分を観るには
$ git diff FETCH_HEAD
マージするには
$ git merge FETCH_HEAD
補足
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」な関係ではない。
mergeとrebaseは共に履歴を統合しますが、特徴が異なります。
-
merge 変更内容の履歴はそのまま残るが、履歴が複雑になる。
-
rebase 履歴は単純になるが、元のコミットから変更内容が変更される。 そのため、元のコミットを動かない状態にしてしまうことがある。 mergeとrebaseは、チームの運用方針に応じて使い分けます。 例えば、履歴を一本化するように運用をするのであればrebaseを使う。
トピックブランチに統合ブランチの最新のコードを取り込む場合はrebaseを使う。統合ブランチにトピックブランチを取り込む場合は、まずrebaseしてからmergeというように使い分けます。
$ git remote -v
origin https://tkd55@bitbucket.org/tkd55/xxxxxx.git (fetch)
origin https://tkd55@bitbucket.org/tkd55/xxxxxx.git (push)
$ git remote rm origin
$ git remote -v
$ git remote add origin 移行先のリモートリポジトリ
$ git push -u origin master