マニュアル: Git

投稿日: 更新日:

最新版のインストール方法(RHEL, CentOS)

IUSの提供するリポジトリを使うのが早いです。

CentOS 6の場合は以下のようになります。

yum install https://centos6.iuscommunity.org/ius-release.rpm
yum install git2u

古いバージョンのGitが入っている場合は、以下のようにコンフリクトします。

Error: git2u conflicts with git-1.7.1-9.el6_9.x86_64 Error: git2u-perl-Git conflicts with perl-Git-1.7.1-9.el6_9.noarch Error: git2u-core conflicts with git-1.7.1-9.el6_9.x86_64

この場合は、エラーが出たパッケージを削除してからインストールしてください。

rpm -e git perl-Git
yum install git2u

入れておくとよい設定

名前、メールアドレスの設定

メールアドレスがプロジェクトによって違う場合は、 名前だけでも構いません。

git config --global user.name "Hideki Ikemoto"
git config --global user.email "ikemo333@gmail.com"

カラー表示

git config --global color.ui auto

日本語ファイル名をそのまま表示したい

core.quotepathを設定する。

git config core.quotepath false

エディタの設定(CentOS)

CentOS 7では、デフォルトでviがエディタとして使われている。

git var GIT_EDITOR

通常viコマンドを打つとvimが起動するが、 この定義はaliasにすぎないため、 デフォルトだと/usr/bin/vi(Small版[^2]])が起動する。

vim-enhanced(Huge版)を有効にするためには、以下のように設定する。

git config --global core.editor vim

基本的な流れ

masterからdevelブランチを切って作業する場合の大まかな手順です。

  1. ブランチを作成&移動: git checkout -b devel
  2. ブランチで作業
  3. 必要ならsquash
  4. masterにマージ
    1. git checkout master
    2. git merge devel
      • --no-ffを付けない場合、可能ならばfast-forwardを使います。

コミット

コミットメッセージ

Angular.jsの書き方が参考になります。

<type>(<scope>): <subject>

<body>

<footer>
  • type:
    • feat: 機能追加
    • fix: バグ修正
    • docs: ドキュメントのみの修正
    • style: コードに影響しない変更
    • refactor: リファクタリング(機能追加でもバグ修正でもない)
    • pref: パフォーマンスの改善
    • test: テストの追加修正
    • chore(雑用): ビルドプロセスの変更、補助ツール、ライブラリの変更など。
  • scope: 影響範囲
  • subject
    • 現在形、命令形を使用
    • 最初の文字を大文字にしない。
    • .で終わらない
  • body
    • 詳細を書く(変更のモチベーションなど)
  • footer: 以下のものを書く
    • クローズするチケットの番号
    • BREAKING CHANGE(破壊的な変更、互換性に影響があるもの)

実行権限の追加

git update-index --chmod=+x

クリーン(git clean)

必ず-i, -n, -fのいずれかのオプションが必要。 gitの他の多くのコマンドと違って、取り返しがつかなくなるから。

  • -n: 何が起きるかの表示のみ(dry-run)
  • -f: 削除の実行
  • -i: インタラクティブモード

その他オプション。-xと-Xの違いはまだ良くわかってません。。。

  • -d: ディレクトリも削除
  • -x: .gitignoreなどのファイルを無視。つまり、無視されているファイルも削除対象。
  • -X: Gitが無視しているファイルのみ削除。

リセット(git reset)

  • soft: コミットのみ取り消し
  • mixed: インデックスへの登録を取り消し
  • hard: 作業ツリーも取り消し

softはあまり使わないかも。mixed(デフォルト)か、hardがほとんどか。

リモートに強制的に合わせたい場合

リモートが正しいので強制的に合わせたいとき。 --hardなので当然ローカルの変更は破棄されるのに注意。 あとコメントも書いてますが、当然master以外の場合は変更する。

git fetch

# masterの場合
git reset --hard origin/master

チェックアウト(git checkout)

  • ブランチの切り替え1: git checkout <ブランチ名>
    • 自動的に追跡ブランチが作成されることもあります2

ブランチ(git branch)

  • 上流ブランチ(upstream branch)を表示: git branch -vv(vを2つ並べる)
  • リモート追跡ブランチ(remote-tracking branches)を表示: git branch -r
  • ブランチを削除: git branch -d <ブランチ名>

1ファイルだけ別のブランチから取得

Git 1ファイルだけ別のブランチから持ってくる - Qiita

以下のようにする。

git show ブランチ名:ファイル名

つまみ食い(git cherry-pick)

特定のコミットのみ適用する機能。

マージが入るとそのままではうまくいかない。 以下のようにする必要がある。

タグ(git tag)

タグの削除

タグ名:

git tag delete {{ tag_name }}
git push origin :refs/tags/{{ tag_name }}

差分(git diff)

ブランチ間のファイルの差分を表示するときは以下のようにする。 ワークスペースのファイルを指定するときはブランチ名をつけない。

git diff ブランチ名:ファイル名 ブランチ名:ファイル名

ログ(git log)

特定のコミットのみ出力するには以下のようにする。

HASH=xxxx
git log ${HASH}
  • 表示オプション
    • --graph: ツリーをグラフ表示
    • --decorate: ブランチ名、タグ名などを表示
    • --oneline: 1コミット1行表示
    • --stat: 変更行数の表示(人間に読める形式)
    • --numstat: 変更行数の表示(プログラム処理用)
      • 表示形式は「追加行数」「削除行数」「ファイル名」の順
  • パッチ形式で出力: git log -p
  • 差分を検索3: git log -S<検索文字列>

リモート(git remote)

  • リモートリポジトリの変更: git remote set-url <name> <newurl>
    • 通常<name>はoriginになる。

リベース(git rebase)

  • Git - リベース
  • Git - git-rebase Documentation

  • experimentブランチを、masterの先頭に適用したい場合

    1. 変更したいブランチをチェックアウト(例: git checkout experiment)
    2. 元となるブランチにリベース(例: git rebase master)
      • 単にgit rebase master experimentで良いみたいです。
  • serverブランチから派生したclientブランチの変更点を、masterの先頭に適用したい場合

    • git rebase --onto master server client

一時退避(git stash)

  • 追加: git stash
    • git stash push または git stash save も同じ。
    • git stash push は古いバージョンで使えないことがある(1.8.3.1ではなかった)。
    • git stash save は現在は非推奨になっている(2.16.2で確認)。
    • -a: 全てのファイルを対象とする。
  • 一覧: git stash list
  • 詳細表示: git stash show
  • 適用: git stash apply
  • 適用 & 削除: git stash pop

検索(git grep)

Git - git-grep Documentation

  • -e: 基本正規表現
  • -E: 拡張正規表現(+などが使える)

サブモジュール

追加

git submodule add <repository> <path>

内部でやっていると思われること。

  1. リポジトリをclone
  2. リポジトリの情報を.gitsubmoduleに書き込む。
  3. リポジトリのハッシュをどこかに書き込む。

cloneはちょっとだけ特殊です。

  • cloneしたリポジトリ以下の.gitはただのファイルっぽい
    • 中身を見ると、本物の.gitのパスが書き込まれている。
    • そのパスは、git submoduleコマンドを実行した親リポジトリの、.git/module/<path>に書き込まれるようです。
    • .git/module/<path>/configを見ると、core.worktreeに指定があります。

更新

以下のコマンドが簡単です。 --remote--rebaseがついているのがポイント。

git submodule update --remote --rebase

付け忘れたり、コンフリクトした場合は、サブモジュールのディレクトリに行って、 rebaseなりmergeなりすればいいです。

Git - サブモジュール

.gitignore

git config --global core.excludesfile ~/.gitignore_global
vi ~/.gitignore_global

除外設定は以下の場所から取得するのが良い。

gibo

基本的にはgiboで自動生成が良いようです。

インストールはHomebrewの場合は以下のようにします。

brew install gibo

例えば、Javaの場合は以下のようにします。

git Java >> .gitignore

対応している言語・ツールはgibo -lで表示できますが、 (自分が)よく使うものは以下になります。

  • Ansible
  • Gradle
  • Java
  • JetBrains
  • Node
  • Ruby
  • Vagrant

グローバルで書く vs リポジトリに格納

基本は以下の判断基準でいいと思います。

gitignore に書くべきでないものは gitignore_global へ - Qiita

github/gitignore にあるか github/gitignore - Global にあるかで判断

github/gitignoreによると、 だいたい以下のように分かれているようです。

  • グローバル
    • OS(macOS, Windows, Linuxなど)
    • IDE(Eclipse, JetBrains, NetBeans, JDeveloper, Xcodeなど)
    • エディタ(Vim, Emacs, Kateなど)
    • オフィス(Microsoft Office, LibreOfficeなど)
  • それ以外(リポジトリにコミットすべきもの)
    • プログラミング言語
    • ビルドツール(Gradle, Mavenなど)
    • フレームワーク(Railsなど)

ただ、Visual Studioはグローバルではありません。 ツールの性質によるのか、他の理由なのかは謎です。

また、必ずしもこれを守らないといけないわけではないです(のはず)。 例えば、IDEの設定はリポジトリにあってもいいと思います。

属性(gitattributes)


  • 設定する場所は以下のどちらか(複数形)。
    • .git/info/attributes
    • .gitattributes
  • チェックアウト/チェックイン時に影響
    • text: テキストとして扱う。
      • EOFの扱いが制御できる。例: *.c text
      • デフォルトはcore.eol, core.autocrlfに影響
      • 値にautoを付けると、Gitがテキストファイルだと認識したものに対し、LFに変換します。しかし、CRLFでコミットされたら、変換しません。。。と書かれてますが意味が分かりません(結局テキストファイルでCRLFでコミットしたらどうなるのか。最初にコミットしたときの状況次第か?)。
    • eol: 改行コード
      • いろいろありますが意味がわからんので後で調査。
    • ident: $Id: をオブジェクト名に変換
    • filter
      • clean: チェックイン時のコマンド
      • smudge: チェックアウト時のコマンド
        • ちなみにsmudgeは「汚す」という意味です。cleanの逆ですね。

暗号化

Subversion連携

独立した記事にしました。

Git: Subversion連携

Subversionリポジトリの変換

  • svn2git
    • Git標準のgit svnでは、SubversionのタグがGitではブランチになっている。これを修正して、SubversionのタグをGitのタグに変換してくれる。
  • (未確認)メッセージが空のコミットを修正する方法: Rebasing a git history with empty commit messages - Stack Overflow
    • Subversion側でメッセージが空でコミットした場合、Gitでめんどくさくなる(--allow-empty-messageオプションが必要)。フィルタで自動的にメッセージを追加する。
    • 履歴を改変するため、push -fが必要になるのに注意。

  1. Subversionだとsvn switchなので慣れないときはよく忘れました。 [return]
  2. Git - リモートブランチに『チェックアウトしたいブランチ名が(a)まだローカルに存在せず、(b)存在するリモートは1つだけ、の場合、Gitは自動的に追跡ブランチを作ってくれるのです。』と書かれています。 [return]
  3. Vim参照。 [return]

公式サイト

外部サイト

逆引きマニュアル