Top/VersionCtl/git

Links

Git について

Downloads

使い方

git init : 新規リポジトリ作成

  1. 空リポジトリの作成
    $ mkdir hoge.git         # bare repository 用の空ディレクトリを作成
    $ cd hoge.git
    $ git init --bare --shared=true   # bare repository として初期化。管理ファイル群が生成される。共有にするには --shared=true にする
  2. 作業用リポジトリの作成
    $ cd ..
    $ git clone hoge          # hoge.git から hoge という名前で bare ではないリポジトリとして複製する
  3. 作業用リポジトリでファイルを登録
    $ cd hoge
    /* 何かしらの方法で新しいファイル fuga を置く */
    $ git add fuga           # ファイル "fuga" が登録対象になる(まだ登録されていない)
    $ git commit             # 前の git add で指定されたファイルが登録される 

--shared= option

git checkout

remote branch を指定して local branch を切る

$ git checkout -b <local-branch-name> <remote-repository>/<remote-branch-name>

branch 作成

branch 切り替え

git clone : git リポジトリの複製

git branch

リポジトリの現在の branch 名を表示

$ git branch
* work

branch 名を変更する

$ git branch -m <元の名前> <新しい名前>

branch 切り替え

不要になった branch の削除

tag 指定で branch を切る

$ git checkout -b <new-local-branch-name> refs/tags/<tag-name>

git commit : 登録済みのファイルに変更が加えられた場合

git commmit --amend : commit をやり直す

git push: リポジトリの変更を他のリポジトリに反映する

$ git push <反映先> <反映元>

branch を明示して push する

$ git push <src-branch-name>:<dst-branch-name>

local で新規作成した branch を remote へ push する

$ git push <remote-repository> <local-new-branch-name>

push 出来ない

commit の取り消しをリモートに push する

.git

git revert : commit を取り消す

  1. まず、git log で対象 commit の hash を確認
    $ git log
    commit bdf1da8aecdfbe5a83ce93e78e2ad8a241b1530b
    Author: hogehoge <hogehoge@fuga.com>
    Date:   Mon May 4 13:33:13 2015 +0900
    
        fix build break for System
    
    commit 1072326e20c9dd482d5e1db46419b0412317d693
    Author: hogehoge <hogehoge@fuga.com>
    Date:   Mon May 4 13:12:33 2015 +0900
    
        delete Makefile.bak
    
    ...
  2. 対象を確認したら、 hash を指定して revert する
    $ git revert bdf1da8aecdfbe5a83ce93e78e2ad8a241b1530b
    • 即座に commit log 編集画面になる。

git reset: git commit や git add をなかったことにする

$ git reset [commit-ID]

commit を取り消すには

git merge : 他の branch に commit を反映する

$ git merge <反映先 branch>

git tag

tag を remote repository に push する

tag の削除

tag の命名規則

commit されていない変更点の確認

conflict への対処

conflict を抑えるために

git pull --rebase した時の conflict への対処

$ git pull --rebase

git pull や git merge 時に発生した conflict

ファイル単位で現在の branch の内容にするか、merge する branch の内容にするのかを決める

git log : ログの表示(変更履歴の閲覧)

git reflog : リポジトリ上での git 作業履歴を表示する

git show : 詳細を表示する

git name-rev : その commit が属する branch / tag の情報を表示する

git blame

$ git blame <file-name>

git stash : ローカルの変更内容を隠蔽する

git stash : ローカルの変更を隠蔽する

$ git stash

git stash list : 隠蔽したローカルの変更一覧を表示する

$ git stash list

git stash pop : stash の最新を1つ適用し、stash のリストから削除する

$ git stash pop

git stash apply : stash を適用する

$ git stash apply

git stash drop : stash のリストからエントリを削除する

$ git stash drop

git rebase

分岐元のコミットを変更

分岐元の branch を変更する

rebase の再開・スキップ・中止

$ git rebase --continue | --skip | --abort
optiondescription
--continue競合解決中に、 rebase を再開したい場合に指定する
--skip競合解決中に、 その commit を skip したいときに指定する。skip した commit は適用されない
--abort競合解決中に、rebase を中止し、 rebase 開始前の状態に戻りたい場合に指定する

git remote : リモートリポジトリ操作

git remote add : リモートリポジトリを追加する

git remote -v : リモートリポジトリ一覧を表示する

git remote rm : リモートリポジトリを削除する

git remote prune

git remote rename : リモートリポジトリに付けた名前を変更する

git remote set-url : リモートリポジトリの URL を変更する

git bundle : 直接通信できないリポジトリと同期を取る

git pull

git pull --rebase

branch を指定した pull

--all

--no-commit

--no-ff

fetch と pull

git submodule : リポジトリに他のリポジトリを組み込む

submodule の組み込み

  1. foo.git の clone
    $ git clone http://foobar.com/foo.git
  2. foo 内にディレクトリ baz を作り、外部リポジトリの http://foobar.com/bar.git を組み込む
    $ cd foo
    $ git submodule add http://foobar.com/bar.git baz  # ここでディレクトリ foo/baz が作成される
    Cloning into 'baz'...
    done.
    $ ls -a
    .  ..  .git  .gitmodules  aa.txt  baz  # .gitmodules と baz が追加された
    
    # ここで、baz が初期化される場合とされない場合がある。
    # git submodule とtype したときに表示される hash に "-" がついていれば、 baz は初期化されていない。
    # この場合は次のように手動で初期化する必要がある
  3. baz の初期化
    $ git submodule init baz
    Submodule 'baz' (http://foobar.com/bar.git) registered for path 'baz'
    $ git status
    # On branch master
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #	new file:   .gitmodules
    #	new file:   baz
    #
  4. 組み込んだ submodule を commit & push する。この時 git add は不要。
    $ git commit
    $ git push
    

submodule を組み込んだリポジトリを clone する

  1. foo を clone する
    $ git clone http://foobar.com/foo.git new-foo
    $ cd new-foo
    $ ls
    aa.txt  baz  # 先ほど追加し、 commmit & push した baz が出来ている
    $ ls -a baz
    .  ..     # 単にからディレクトリが出来ただけ。
    $ git submodule
    -386b630fd974b3f3147d462cda2c1f50813131fc baz    # hash に "-" が付いており、初期化されていないことが分かる
  2. submodule を初期化する
    $ git submodule init baz
    Submodule 'baz' (http://foobar.com/bar.git) registered for path 'baz'
    $ ls -a baz
    .  ..     # この段階でも、まだ baz は空ディレクトリのままになっている
  3. submodule の中身を最新にする
    $ git submodule update
    Cloning into 'baz'...
    done.
    Submodule path 'baz': checked out '386b630fd974b3f3147d462cda2c1f50813131fc'
    $ ls -a baz/
    .  ..  .git  ps-ax.log    # bar.git の中身が baz に clone される

git diff : 差分を表示する

git config : 各種設定

ユーザアカウントに関する設定

alias の設定

defalut の設定を無効にする

設定項目

configuration itemdescriptionremark
user.nameユーザ名を指定する
user.emailユーザのメールアドレスを指定する
receive.denyNonFastFowardstrue に設定すると、 push 時に repository 上の commit が含まれない commit を送信しようとしたときに branch の更新を拒否するshared repository で設定する
receive.denyDeletestrue に設定すると、ブランチの削除を拒否するshared repository で設定する
receive.fsckObjectstrue にすると、push されたときにデータ一貫性のチェックを行う。信頼性が向上するが、 push 処理に時間が掛かるようになる。shared repository で設定する
core.pagerpager を指定する例えばless, lv など
alias.<alias-name>任意の git コマンド(commit, checkoutなど)を <alias-name> でも呼び出せるようにする

設定をエディタで編集する

$ git config <--local|--global|--system> <-e|--edit>

現在の設定を確認する

$ git config <-l|--list>

メール送信の設定

設定を削除する

git gc : リポジトリを最適化する

optiondescription
--aggressive最適化の度合いを大きくする。
処理時間がかかるが、その分最適化された状態にする。
--prune=<date><date> で指定されたものより古いオブジェクトを破棄する。
右辺に何も指定しなかった場合のデフォルト値は "2 weeks ago" となる。
また、右辺に "now" を指定すると、全ての不要なオブジェクトが削除される。

.gitignore : git が無視するファイルを指定する

リポジトリからファイルを完全削除する

  1. まず、 git filter-branch を実行
    $ git filter-branch --tree-filter 'git rm --ignore-unmatch <file-to-be-deleted>' --orune-rmpty -- all
    • <file-to-be-deleted> の対象になるファイルが複数あり、パターンマッチで実行する場合は下記のようにする(例は *.o を消す場合)
      $ git filter-branch --tree-filter 'git rm --cached --ignore-unmatch "*.o"' --prune-empty -- --all
  2. reflog にも残っているので、これも削除する
    $ git reflog expire --expire=now --all
    $ git gc --prune=now
    $ git gc --aggressive --prune=now

用語

Fast-forward

<refspec>

Subversion とのコマンド対比

GitSubversionDescription
git initsvnadmin createリポジトリ作成
git clonesvn checkoutリポジトリのコピー
git add <file>svn add <file>ファイルの追加
git add <file>; git commitsvn commit [file]ファイルの更新をリポジトリに反映
git rm <file>svn rm <file>ファイルの削除(別途、要 commit)
git statussvn status
git log [file]svn log [file]ログを表示する
git log --shortstat --name-statussvn log -v追加・変更されたファイル名を含めたログを表示する
git log -<number>svn log -l <number>最新から <number> 個のログエントリを表示する
git blame <file>svn blame <file><file> の各行がいつ誰によって変更されたかを表示する
git checkout <branch>svn switch <branch>
git merge <branch>svn merge <branch>
git checkout <file>svn revert <file>ファイルに対して行った(リポジトリに未反映の)変更を元に戻す
git clean -fsvn revert [dir]
git pull <remote> <local>svn up[date]<remote> の最新状態を <local> に merge する

tools

git-sh

tools on emacsen

magit

git-gutter+

git-gutter

GUI tools

gitk

git-gui

Subversion (svn) からの移行

  1. git-svn をインストールする
    • debian などでは、git とは別パッケージになっている
  2. 最終的な移行先の git の bare リポジトリを作成しておく(ここでは仮に repos.git というディレクトリ名にした)。
    $ git init --bare --shared=true repos.git
  3. 移行元の svn リポジトリに commit しているユーザのリストを下記の書式で authors.txt に書き出す(このあたりは、svn の log がユーザ名のみを記録しているのに対し、 git ではユーザ名とメールアドレスを記録することにもよる)
    $ vi authors.txt
    hoge = hoge <hoge@your-domain.com>
    fuga = fuga <foo@example.com>
    
  4. svn リポジトリを clone する(作業リポジトリが出来る)
    $ git svn clone -A authors.txt --trunk= --branches=branches --prefix=svn/ ${SVN_REPOS_URL}
    • ${SVN_REPOS_URL} は、URL 形式でないと動作しない。
    • URL 形式の記述例
      file://<絶対パス>
      http://...
      https://...
      ssh://...
      ssh+svn://...
  5. 上記で出来たリポジトリの中に入り、最終的な移行先リポジトリ(はじめの方に作成した repos.git)に push する
    $ git remote add origin ../repos.git
    $ git push origin --all

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS