Git

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

Git は Linux カーネルの創設者である Linus Torvalds によって設計・開発されたバージョン管理システム (VCS) です。現在 Git は Linux カーネルのソースの管理だけでなく、様々な他のプロジェクトにも使われており、Arch Linux プロジェクトもそれに含まれます。

目次

インストール

git パッケージを インストール して下さい。開発版の場合は、git-gitAUR パッケージをインストールします。git svngit guigitk などのツールを使用する場合は、オプションの依存関係を確認してください。

グラフィカルフロントエンド

参照 git GUI クライアント

  • Giggle — Git の GTK フロントエンド
https://wiki.gnome.org/Apps/giggle/ || giggle
  • GitAhead — 組み込みの Merge Tool を含むグラフィカル Git クライアント
https://gitahead.github.io/gitahead.com/ || gitaheadAUR
  • Git Cola — Python で書かれた Git 用の洗練された強力なグラフィカル ユーザーインターフェイス
https://git-cola.github.io/ || git-colaAUR
  • Git Extensions — コマンドラインを使用せずに Git を制御できる Git のグラフィカルユーザーインターフェイス
https://gitextensions.github.io/ || gitextensionsAUR
  • gitg — Git リポジトリを表示するための GNOME GUI クライアント
https://wiki.gnome.org/Apps/Gitg || gitg
  • git-gui — Git への Tcl/Tk ベースの移植可能なグラフィカルインターフェイス
https://git-scm.com/docs/git-gui || git + tk
ノート: git-gui でスペル チェックを有効にするには、LC_MESSAGES 環境変数 に対応する辞書と共に aspell が必要です。FS#28181 そして aspell の記事を参照。
  • GitHub Desktop — GitHub チームによって構築された Electron ベースのグラフィカルユーザーインターフェイス
https://github.com/desktop/desktop || github-desktopAUR github-desktop-binAUR
  • gitk — Tcl/Tk ベースの Git リポジトリブラウザ
https://git-scm.com/docs/gitk || git + tk
  • Guitar — Git GUI クライアント
https://github.com/soramimi/Guitar || guitarAUR
  • lazygit — git コマンド用のシンプルなターミナル UI
https://github.com/jesseduffield/lazygit || lazygit
  • QGit — リビジョン履歴を参照し、パッチの内容と変更されたファイルを表示し、さまざまな開発ブランチをグラフィカルにたどる Git GUI ビューア
https://github.com/tibirna/qgit || qgit
  • RabbitVCS — 使用しているバージョン管理システムへのシンプルで直接的なアクセスを提供するために作成されたグラフィカルツールのセット
http://rabbitvcs.org/ || rabbitvcsAUR
  • Sublime Merge — Sublime Text のメーカーによる Git クライアント
https://www.sublimemerge.com/ || sublime-mergeAUR
  • Tig — git 用の ncurses ベースのテキストモードインターフェイス
https://jonas.github.io/tig/ || tig
  • ungit — git の汎用性を犠牲にすることなく、git に使いやすさをもたらします
https://github.com/FredrikNoren/ungit || nodejs-ungitAUR

基本設定

Git を使うには少なくとも名前とメールアドレスを設定する必要があります:

$ git config --global user.name  "John Doe"
$ git config --global user.email "johndoe@foobar.com"

こちらも参照 Getting Started - First-Time Git Setup

他の設定については #高度な設定 を見て下さい。

使い方

Gitリポジトリは、リビジョン履歴やその他のメタデータを保持する .git ディレクトリ内に含まれています。リポジトリによって追跡されるディレクトリは、デフォルトでは親ディレクトリであり、作業ディレクトリ(working directory)と呼ばれます。作業ツリー(working tree)内の変更は、リポジトリに記録(コミット)する前にステージングする必要があります。また、Gitを使用すると、以前にコミットされた作業ツリーのファイルを復元することもできます。

Getting Started - Git Basics を参照してください。

Git リポジトリの取得

Git リポジトリの取得 - Git の基本 を参照してください

変更の記録

変更内容のリポジトリへの記録 - Git の基本 を参照してください

コミット履歴の閲覧

コミット履歴の閲覧 - Git の基本 を参照してください

元に戻す

作業のやり直し - Git の基本 を参照してください

リモートの操作

リモートでの作業 - Git の基本 を参照してください

ブランチ

ブランチの概要 - Git のブランチ機能 を参照してください

基本的なブランチとマージ

ブランチとマージの基本 - Git のブランチ機能 を参照してください

ブランチ管理

ブランチ管理 - Git のブランチ機能 を参照してください

ブランチでの作業の流れ

ブランチでの作業の流れ - Git のブランチ機能 を参照してください

リモートブランチ

リモートブランチ - Git のブランチ機能 を参照してください

リベース

リベース - Git のブランチ機能 を参照してください

コラボレーション

分散ワークフロー

分散作業の流れ - Git での分散作業 を参照してください

プロジェクトへの貢献

プロジェクトへの貢献 - Git での分散作業 を参照してください

プロジェクトの運営

プロジェクトの運営 - Git での分散作業 を参照してください

Git ツール

リビジョンの選択

リビジョンの選択 - Git ツール を参照してください

対話的なステージング

対話的なステージング - Git ツール を参照してください

作業の隠しかたと消しかた

作業の隠しかたと消しかた - Git ツール

作業内容への署名

作業内容への署名 - Git ツール を参照してください

検索

検索 - Git ツール を参照してください

履歴の書き換え

履歴の書き換え - Git ツール を参照してください

リセットコマンド

リセットコマンド詳説 - Git ツール を参照してください

高度なマージ

高度なマージ手法 - Git ツール を参照してください

Rerere

Rerere - Git ツール を参照してください

Git によるデバッグ

Git によるデバッグ - Git ツール を参照してください

サブモジュール

サブモジュール - Git ツール を参照してください

バンドル

バンドルファイルの作成 - Git ツール を参照してください

置換

Git オブジェクトの置き換え - Git ツール を参照してください

認証情報ストレージ

認証情報の保存 - Git ツール を参照してください

ヒントとテクニック

git-config の使用

Git は、4つの INI タイプの設定ファイルからその構成を読み取ります。

  • /etc/gitconfig システム全体のデフォルト
  • ~/.gitconfig~/.config/git/config (since 1.7.12) ユーザー固有の設定用
  • .git/config リポジトリ固有の設定用

これらのファイルは直接編集できますが、通常の方法は、以下の例に示すように git config を使用することです。

現在設定されている変数を一覧表示します。

$ git config {--local,--global,--system} --list

デフォルトのエディターを vim から nano に設定します。

$ git config --global core.editor "nano -w"

デフォルトのプッシュアクションを設定します。

$ git config --global push.default simple

git difftool に別のツールを設定します (デフォルトでは meld):

$ git config --global diff.tool vimdiff

詳細については、git-config(1) および Git 構成 を参照してください。

良いエチケットを採用する

  • 既存のプロジェクトに貢献することを検討する場合、コードを変更する能力を過度に制限する可能性があるため、そのライセンスを読んで理解してください。ライセンスによっては、コードの所有権をめぐって紛争を引き起こす可能性があります。
  • プロジェクトのコミュニティと、自分がそこにどれだけ溶け込めるかを考えましょう。プロジェクトの方向性を知るために、あらゆるドキュメントや、リポジトリの log を読んでください。
  • コミットをプルしたり、パッチを提出したりするときは、小規模で十分な文書化を心がけましょう。そうすることで、メンテナがあなたの変更を理解し、マージするか修正を依頼するかを判断しやすくなります。
  • もし、投稿が拒否されても、落ち込まないでください。重要なことであれば、その理由をできるだけ明確に、忍耐強く議論してください。

認証の高速化

Git サーバーにプッシュする度に認証が面倒なのをなんとかしたいと思っている場合、以下を使って下さい。

git-credential-libsecret を認証情報ヘルパーとして使用する

Git は GNOME/KeyringKeePass のような org.freedesktop.secrets と互換性のあるキーリングから認証情報を取得することがあります。そのため、互換性のあるキーリングを一つセットアップし、キーリングが dbus に登録されているかどうかを確認します。

dbus-send --session --print-reply --dest=org.freedesktop.DBus / \
    org.freedesktop.DBus.GetConnectionUnixProcessID \
    string:org.freedesktop.secrets

実行

git config --global credential.helper /usr/lib/git-core/git-credential-libsecret

その後 git をセットアップします。

git-credential-netrc を認証情報ヘルパーとして使用する

Git は、netrc ファイルを読み取って認証情報にアクセスできます。まず、Git を netrc ヘルパースクリプトに誘導します。

$ git config --global credential.helper /usr/share/git/credential/netrc/git-credential-netrc.perl

次に、.netrc ファイルを 作成 します。

~/.netrc
machine git-host
login username
password password

認証情報ヘルパーは gpg で暗号化されたファイル (~/.netrc.gpg) もサポートします。

デフォルトプロトコル

上述のように SSH で多重接続することで、Git over SSH の方が HTTPS よりも高速になります。また、(AUR など) サーバーによっては SSH を介して push することもできます。例えば、以下の設定をすると AUR でホストされているリポジトリで Git over SSH を設定します。

~/.gitconfig
[url "ssh://aur@aur.archlinux.org/"]
	insteadOf = https://aur.archlinux.org/
	insteadOf = http://aur.archlinux.org/
	insteadOf = git://aur.archlinux.org/

Bash 補完

Bash の補完を有効にするには、Bash のスタートアップファイル/usr/share/git/completion/git-completion.bash を source してください。もしくは、bash-completion をインストールしてください。

Git プロンプト

Git パッケージにはプロンプトスクリプトが付属しています。これを有効にするには、/usr/share/git/completion/git-prompt.sh をソースし、%s パラメータを使用してカスタムプロンプトを設定します。

  • Bash の場合: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
  • zsh の場合: setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '

Git リポジトリのディレクトリに変更すると、プロンプトが変化してブランチ名が表示されます。対応する環境変数を設定することで、追加の詳細がプロンプトに表示されるように設定できます。

シェル変数 情報
GIT_PS1_SHOWDIRTYSTATE ステージ済みの場合は +、未ステージの場合は *
GIT_PS1_SHOWSTASHSTATE スタッシュが存在する場合は $
GIT_PS1_SHOWUNTRACKEDFILES 追跡されていないファイルが存在する場合は %
GIT_PS1_SHOWUPSTREAM 上流からの進み・戻り・分岐 (<,>,<>)
GIT_PS1_STATESEPARATOR ブランチ名と状態記号の間の区切り文字
GIT_PS1_DESCRIBE_STYLE HEAD が切り離されている場合、タグまたはブランチに関連するコミットを表示します
GIT_PS1_SHOWCOLORHINTS カラーで表示する

環境変数の完全なドキュメントは、スクリプトのコメントで参照できます。

ノート:
  • $(__git_ps1)((unknown)) と返す場合、何もリポジトリが含まれていない .git フォルダがカレントディレクトリに存在するため Git が認識しなくなっています。~/.gitconfig ではなく間違って ~/.git/config に Git の設定ファイルを作成した場合などに発生します。
  • 非常に大規模なリポジトリでプロンプトに遅延が発生している場合は、GIT_PS1_SHOWUNTRACKEDFILES オプションが原因である可能性があります。このオプションは、新しいファイルを検出するたびに完全なディレクトリツリースキャンをトリガーし、パフォーマンスに顕著な影響を与えます。 これらのリポジトリに対してこのオプションをローカルで無効にするには、コマンド git config --local bash.showUntrackedFiles false を使用できます。

もしくは、bash-git-promptAURgittifyAUR など AUR にある git シェルプロンプトのカスタマイズパッケージを利用することもできます。

ビジュアル表現

作業量を把握するため:

$ git diff --stat

git log をフォーク表現:

$ git log --graph --oneline --decorate

git log グラフのエイリアス (つまり git graph は装飾されたバージョンを表示する):

$ git config --global alias.graph 'log --graph --oneline --decorate'

コミットのヒント

前のコミットにリセット (非常に危険、指定したコミットまですべて消去されます):

$ git reset --hard HEAD^

リポジトリのアドレスが変更された場合、そのリモートロケーションを更新する必要があります:

$ git remote set-url origin git@address:user/repo.git

あるいは、.git/config を編集して新しい場所を指定します。

Signed-off-by line append (プロジェクトによっては必要な、名前と電子メールの署名がコミットに追加されます):

$ git commit -s

Signed-off-by は自動的にパッチに追加されます (git format-patch commit を使用する場合):

$ git config --local format.signoff true

変更されたファイルの特定の部分をコミットします。これは、多数の変更があり、複数のコミットに分けたほうがよい場合に有用です。

$ git add -p

コミットへの署名

Git では、コミットやタグに GnuPG を使って署名することができます。Signing Your Work を参照してください。

ノート: GPG 署名に pinentry curses を使用するには、 export GPG_TTY=$(tty) (あるいは pinentry-tty を使用) してください。そうしないと GPG が現在ロック状態にある場合に署名が失敗します (pin を要求できないため)。

Git が自動的にコミットに署名するように設定するには:

$ git config --global commit.gpgSign true

マスター以外のブランチで作業

ときに、メンテナからブランチで作業するように要求されることがあります。使われるブランチの名前は develtesting などが一般的です。まずはリポジトリを複製します。

master 以外のブランチを開くには (git clone で master ブランチしか表示されない場合、git branch -a で他のブランチを表示できます):

$ git checkout -b branch origin/branch

通常通り編集を行ってください。ただし以下のコマンドを使ってリポジトリツリーを同期させてください:

$ git pull --all
$ git push --all

メーリングリストにパッチを送信

メーリングリストに直接パッチを送る場合、次のパッケージをインストールする必要があります: perl-authen-sasl, perl-net-smtp-ssl, perl-mime-tools

ユーザー名とメールアドレスを設定したか確認してください、基本設定 を参照

メールアドレスを設定:

$ git config --global sendemail.smtpserver smtp.gmail.com
$ git config --global sendemail.smtpserverport 587
$ git config --global sendemail.smtpencryption tls
$ git config --global sendemail.smtpuser foobar@gmail.com

これでメーリングリストにパッチを送信することができます (OpenEmbedded:How to submit a patch to OpenEmbedded#Sending patches を参照):

$ git add filename
$ git commit -s
$ git send-email --to=openembedded-core@lists.openembedded.org --confirm=always -M -1

大規模な git リポジトリの操作

大規模なリモートリポジトリを操作する場合、大量のデータをフェッチする必要があります。次の例では、Linux カーネルを使用して、そのようなコードベースを操作する方法を示しています。

リポジトリ全体を取得する

最も簡単な解決策は、リポジトリ全体を取得することです。

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
ノート: git clone を中断すると再開できません

git pull でリポジトリを更新できます。

リポジトリの部分的な取得

ローカルリポジトリをオリジンのより小さなサブセットに制限するには、たとえば v4.14 以降でバグを二分するために、浅いクローンを使用します。

$ git clone --shallow-exclude v4.13 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

v4.14 以降は入手できますが、v4.13 以前は入手できません。

すべての履歴を無視して、最新のスナップショットのみが必要な場合。(tarball が利用可能で、それで十分な場合は、それを選択してください。git リポジトリからダウンロードするには、より多くの帯域幅が必要です。) 次の方法で取得できます。

$ git clone --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

次の2つの例に示すように、後で古いコミットを取得できます。

$ git fetch --tags --shallow-exclude v4.1
$ git fetch --tags --shallow-since 2016-01-01
ノート: --tags がないと、タグは取得されません。

他のブランチを取得する

上記の例では、ローカル リポジトリはメインラインカーネル、つまり 最新の開発が行われた カーネルのみを追跡します。たとえば、最新の 4.14 ブランチなど、最新の LTS が必要な場合、次の方法で取得できます。

$ git remote set-branches --add origin linux-4.17.y
$ git fetch
$ git branch --track linux-4.17.y origin/linux-4.17.y

最後の行は必須ではありませんが、おそらく必要でしょう。 (必要なブランチの名前を知るために、一般的なルールはありません。gitweb のインターフェイスにある "ref" リンクを見れば、推測することができます。)

linux-4.17.y のスナップショットについては、次のようにします。

$ git checkout -b linux-4.17.y

または、別のディレクトリに展開するには、

$ mkdir /path/to/src-4.17; cd /path/to /src-4.17
$ git clone --no-local --depth 1 -b linux-4.17.y  ../linux-stable

いつものように、git pull を実行してスナップショットを更新します。

代替案

Virtual File System for Git (VFS for Git) は、ローカルのリポジトリがなくても git のリポジトリにアクセスできるようにするものです。(この Microsoft ブログWikipedia article を参照してください。)

これは、gvfs と scalar を含む git の Microsoft のフォークである git-vfsAUR で利用可能です。

機密情報のフィルタリング

時には、ソフトウェアが平文のパスワードを設定ファイルに保存し、キーリングに接続するのとは対照的にすることがあります。このような場合、git clean-filters は機密情報を誤ってコミットしてしまうのを防ぐために便利です。たとえば、次のファイルでは "some-dotfile" というファイルにフィルタを割り当てています。

.gitattributes
some-dotfile filter=remove-pass

"some-dotfile" というファイルが git にチェックインされると、git はチェックイン前にこのファイルに対して "remove-pass" というフィルタを実行します。このフィルターは、git-configuration ファイルで定義しておく必要があります。

.git/config
[filter "remove-pass"]
clean = "sed -e 's/^password=.*/#password=TODO/'"
ノート: sed 式の特殊文字をエスケープすることは、この文脈では トリッキーな作業 になります。git は2つのバックスラッシュを1つに変え、一方 git がコマンドを実行するために呼び出すシェルは、2つのバックスラッシュを再び1つに変えることを思い出してください。詳しくは、Git filter and sed fight over `$` をご覧ください。

HTML ヘルプファイル

git-htmldocsAUR をインストールすることで、git help のドキュメントを HTML 形式で利用することもできます。インストール後、HTML ドキュメントには -w フラグを付けてアクセスすることができます。例えば

$ git help -w merge

git config オプションを設定すると、デフォルトで HTML ドキュメントを読み込むことができます。

$ git config --global help.format html

拡張機能

https://github.com/petervanderdoes/gitflow || gitflow-avhAUR
  • git-extras — git 用のいくつかのユーティリティ (リポジトリの概要、repl、変更ログの人数、作成者のコミット率など)
https://github.com/tj/git-extras || git-extrasAUR - oh-my-zsh を使用している場合、git-extras プラグイン を有効にして下さい。
  • gitmoji-cli — A gitmoji コミットメッセージで gitmojis を使用するためのインタラクティブな NodeJS クライアント。
https://github.com/carloscuesta/gitmoji-cli || nodejs-gitmoji-cliAUR

参照