要点とチートシートをまとめる。 初期設定初期設定は必須(ユーザグローバルなので、内容はレポジトリではなく ~/.gitconfig に入る)。 git config --global user.name "Kiichiro NAKA" git config --global user.email "knaka@ayutaya.com" 確認: git config --global --list ディレクトリ構成ディレクトリ構造として見ると、Git では、現状作業ツリーの中(./.git/)に Git 管理ディレクトリがあり、その中に、レポジトリだけでなく、各種のメタ情報(リモート、ステージ)が入っている。 次いで、論理構造:
st(atus) や ci は欲しいか。 git config --global alias.ci "commit" 雑記.gitignore と .git/info/exclude
ブランチの目的考:
コミットの相対指定:
リモートへのブランチの作成: git checkout -b new_branch master git push origin new_branch git push --all origin をすると、ローカルの全ブランチが送られるので、怒られると思われる。 当然、bare repository にも git remote -v は効く。空の bare repository から任意の状態へは fast forward になるから、他の通常 repository を init, add, commit したものを push できる。そこからレポジトリが始まる。 コマンド各コマンドについてのメモ。 initinit: カレントディレクトリにレポジトリを作る。init --bare --shared で、作業ツリー・ステージングツリーなしのレポジトリを、グループの書き込み権限つきで作成する。 --shared の有無による違いは? 前述のグループ権限以外では以下の差があるのだが、よく分からない。 --- bare/config +++ bare-shared/config @@ -4,3 +4,6 @@ bare = true ignorecase = true precomposeunicode = false + sharedrepository = 1 +[receive] + denyNonFastforwards = true addadd: add -i で対話モード:
commitcommit: "-a" で追加&コミット。パス指定も可能。これは、commit 時の内容が commit される(add では、ステージした際の内容がコミットされるのとの違い)。 コミットログ考:
"commit" について。Git では 1 つのスナップショットを「コミット」と称し、SHA-1 の ID でユニークに識別する。SHA-1 は 7 文字もあれば大抵はユニークなので、随所で略式で利用される。 loglog: -n, since..until, そこまでの部分とのデリミタが "--" で、その後にはパスが続く。 git log --since="2 weeks" git log --before="1 month" tagtag: git tag タグ名 対象(commit なりブランチなり) branchgit branch: git branch 新ブランチ 元ブランチ(なり、タグなり commit なり) git branch: 一覧 git branch -a: 無指定(ローカルブランチ)と "-r"(リモート追跡ブランチ)の双方をリスト git branch -m: Move rebaseリベースで、別の…? git tag a_branch-1.0 a_branch git checkout master git rebase a_branch git branch -d a_branch # リリースにタグ、実験は成功か失敗で終われば不要になる コミット ID 指定の箇所には、コミット名、タグ名、ブランチ名が指定できるようだ。ブランチ名を指定すると、HEAD のコミット扱いになるのかな? archivegit archive --format=zip --prefix=foo-1.0 HEAD > /tmp/test.zip revertgit reset と git revert の違い
resetgit reset
mvコピーは無いが、git mv はある。改名は追跡できなかったのだろうか? branchブランチ作成。「git checkout -b ブランチ名」でも可: git branch ブランチ名 git branch # で確認 git checkout ブランチ名 mergegit merge ~: 現ブランチへ、~ブランチの○○から HEAD までを merge。--squash で、複数コミットを圧縮して一つにしてからマージする(圧縮コミット)。--no-commit で、マージ&ステージはするがコミットをしない。 git cherry-pick <コミット ID>: -n で、チェリーピック&ステージはするがコミットをしない。 git merge でコンフリクト。qgit mergetool で、OS X ならば opendiff が使えるらしいですよ。 rebase普通のマージ(コミットを改変しない) git checkout master git merge bugfix rebase による統合(コミットを改変するので、スッキリではあるが、危険。merge と rebase の差は、revert と reset の差に似ている) git checkout bugfix git rebase master git checkout master git merge bugfix rebase は、branch base 後のコミットが、branch rebase 後の状況に合うように改変される。これが、自前のレポジトリ内だけの問題であれば良いが、改変前のコミットがリモートで共有されていると困ったことになる。squash ならばいいのかな?
参考: Git - リベース 「欠点はほんの一行でまとめることができます。公開リポジトリにプッシュしたコミットをリベースしてはいけない」「リベースはあくまでもプッシュする前のコミットをきれいにするための方法であるととらえ、リベースするのはまだ公開していないコミットのみに限定するようにしている限りはすべてがうまく進みます。」 rebase は、-i するとついでに、連結、分割、順序変更ができる。注意:
blamegit blame このあらい:
レポジトリ指定:
remote$ git remote [show] $ git remote -v origin git@git.ayutaya.com:Foo/Bar/Baz.git (fetch) origin git@git.ayutaya.com:Foo/Bar/Baz.git (push) $ git remote show origin # 通信が生じるので、以下のような例も # Remote branches: # AppStore new (next fetch will store in remotes/origin) fetch と push における、ローカルブランチ・リモートブランチ間の結びつきも表示される。これは便利。 レポジトリのエイリアス(ここでは "origin")を変えられます。 $ git remote set-url origin /home/knaka/dev/bare $ git remote add origin git@github.com:schacon/simplegit-progit.git その上で、必要に応じて、ブランチにアップストリームのレポジトリを指定することが必要。 git branch --set-upstream development origin/development "refspec" は、リモートレポジトリとローカルレポジトリの結びつけ。以下で確認。 $ git remote show レポ名 # 左記で、レポジトリ内の結びつけは出るようだ +refs/heads/hoge:refs/remotes/origin/hoge のように、ローカルレポ、リモートレポを結びつける。"+" が付くと fast-forward チェックをしない。 メタ情報として、.git/config に入っている。 git submodule で確認。Git では、ブランチの最新ではなく、個々のコミットを取ってくる。モジュールでチェックアウトし、親でコミットすれば、取ってくるコミットを変更できる。「入門」p.115~ を参照。 git clone --recursive でも良いが、手順を踏むならば、
clone 時に取り忘れたようであれば、 git submodule update --init --recursive すること。追加は、 git submodule add レポジトリ [ディレクトリ名] で。このままでは例によって空(ポイントのみ)なので、左記コマンドでもって取得する。 |
ツール >