Skip to content

Instantly share code, notes, and snippets.

@dtan4
Last active June 24, 2018 08:35
Show Gist options
  • Save dtan4/5276185 to your computer and use it in GitHub Desktop.
Save dtan4/5276185 to your computer and use it in GitHub Desktop.
「Gitによるバージョン管理」メモ

4. 基本的な Git コマンド

  • git diff
    • -M オプション
      • ファイル名変更のチェック
  • git shortlog
    • コミッタごとにログ表示
    • -s オプション
      • 作成者名とコミット数のみ
    • -n オプション
      • コミット数で降順ソート
  • git status
    • -s オプション
      • 短縮表示
      • 1列目は staged、2列目は unstaged
  • Git 管理下での mv, rm は git mv, git rm を使う
  • git commit
    • -a オプション
      • すべての変更をコミット
    • コミットメッセージの書き方
      • タイトル、1行開けて本文
        • タイトルは git format-patch のメールタイトルや git shortlog の内容になる
    • --amend オプション
      • 直前コミットの修正
  • git reset
    • ワーキングツリーやインデックス、ブランチを特定の状態に戻す
    • reset 実行前の HEAD は ORIG_HEAD に保存される
    • --hard オプション
      • HEAD の参照とインデックス、ワーキングツリーを変更
      • インデックスとワーキングツリーを指定したコミットの状態にする
    • --mixed オプション
      • HEAD の参照とインデックスを変更
      • git reset のデフォルト
    • --soft オプション
      • HEAD の参照のみを変更
  • git clean
    • Git の管理下に置かれていないファイルを削除
    • -n, --dry-run オプション
      • 削除されるファイルの確認
    • -f, --force オプション
      • 実際にファイルを削除
    • -d オプション
      • ディレクトリも削除
    • config で clean.requireForce = false にすれば -f は要らなくなる
    • .gitignore で指定されたファイルは削除対象とならない
      • -x オプションで .gitignore は無視される
  • git grep
    • --[and|or|not]
      • 正規表現の論理演算が行える
      • ex. git grep -e ^Ka --and -e ma$
        • Ka で始まり ma で終わる行を検索
      • grep にはない

5. 複数人のプロジェクトで Git を利用する

複数人での開発ワークフロー

環境構築

  1. リポジトリサーバに中央リポジトリを置く
    • このリポジトリは管理者 PC のみからアクセスできる
    • bare リポジトリ
  2. リポジトリサーバに開発者ごとのリポジトリを置く
    • git clone --bare <中央リポジトリ>
  3. 管理者 PC に開発者リポジトリをリモートリポジトリとして登録
    • git remote add <開発者名> <開発者リポジトリ>
  4. 開発者 PC の設定
    • 開発者リポジトリを clone する
    • 中央リポジトリをリモートリポジトリとして登録

開発

  1. 開発者は中央リポジトリを pull
  2. 開発者は変更を自分のリポジトリに push
  3. 管理者は開発者リポジトリを pull
  4. 管理者は開発者リポジトリをマージした master を中央リポジトリに push

コンフリクト

  • <<<<<< HEAD から ======= までが master の変更部分
  • >>>>>> hoge までがマージ元にあった変更部分
  • git blame で確認し、コンフリクトを解消してコミット
  • コンフリクトを避けるためにも
    • 中央リポジトリにマージを行う前に、中央リポジトリの変更を適用する
      • 自分のコミットが中央リポジトリの変更より後に来るようにする
      • git rebase で変更を取り込む

6. 複数人で開発する場合に利用する Git コマンド

  • git clone
    • リモートリポジトリの HEAD で指定されたブランチがチェックアウトされる
      • hoge ブランチが HEAD であった場合、ローカルには hoge ブランチがチェックアウトされる
    • -b オプション
      • チェックアウトするブランチを指定
    • -o, --origin オプション
      • リモートリポジトリの名前を指定する
      • デフォルトでは origin
  • git remote
    • -v オプション
      • 現在設定されているリモートリポジトリを表示
    • git remote show <リモートリポジトリ名>
      • リモートリポジトリの詳細な情報を表示
      • -n オプションでキャッシュされた情報を表示
    • git config remotes.<グループ名> "追加したいリモートリポジトリ"
      • リモートリポジトリのグループ分け
    • git remote update
      • リモートリポジトリの更新
    • git remote prune
      • 存在しなくなったリモートブランチを削除する
      • git remote show で stale と表示されるブランチを削除
  • git merge
    • 共通の祖先コミットを探し、3-way マージ手法を使ってマージする
    • --squash オプション
      • マージするコミットを一つにまとめられる
      • マージ元ブランチのコミットが一つにまとまる
    • git show, git log -p --cc でマージコミットによる修正を確認できる
    • コンフリクト
      • コンフリクトには3つのステージがある
        1. 共通部分
        2. マージ先の最新コミット (HEAD)
        3. マージ元の最新コミット (MERGE_HEAD)
      • git show :<ステージ番号>:<ファイル名> で状態を確認
      • git diff のオプションで各ステージとの差分を確認できる
        • --base
        • --ours
        • --theirs
  • git push
    • エラーが起こる原因
      • ローカルブランチかリモートブランチのどちらかにしか存在しないコミットがある
        • リモートにはコミット D があり、ローカルには E, F, G がある
        • ローカルリポジトリをリモートリポジトリに同期させて更新する
      • リモートリポジトリが bare リポジトリでない場合、そのワーキングツリーにチェックアウトされているブランチには送信できない
        • bare リポジトリ以外には送信しない
  • git pull
    • 内部では git fetchgit merge を行なっている
    • リモートトラッキングブランチが指定されている場合は、リモートリポジトリとリモートブランチは省略できる
  • git branch
    • git branch <作成先ブランチ> <作成元ブランチ>
    • -r オプション
      • リモートトラッキングブランチを確認
    • -a オプション
      • リモートトラッキングブランチとローカルブランチの両方を表示
    • ブランチ名はディレクトリ構造のようにつけると管理しやすい
      • test/new-data
    • -m オプション
      • ブランチ名の変更
    • -M オプション
      • 既存のブランチ名に変更
    • -d オプション
      • ブランチの削除
      • 親ブランチより新しいコミットが存在する場合、-D オプションでないと削除できない
    • リモートトラッキングブランチ
      • branch.<ブランチ名>.remote
        • リモートリポジトリ
      • branch.<ブランチ名>.merge
        • リモートトラッキングブランチ
      • git branch <ブランチ名> -t <トラッキング先>
        • ブランチ作成時にトラッキング先を指定
      • トラッキング先にはローカルブランチを指定できる
        • push はできないので merge を使う
  • git blame
    • -L オプション
      • 行番号指定
      • 3,+5 などオフセット指定も可能
    • -C オプション
      • ファイル間でコピーされた箇所を検出
      • コピーしてなくとも、同じコードであれば検出される
      • -Cn の形式でチェックする文字数下限を n 文字に設定できる
    • -M オプション
      • ファイル中で移動した箇所を検出
    • -C, -M でチェックされるのは 英数字のみ
  • git checkout
    • 未コミットの変更があってもブランチを切り替えられる
      • 切り替え先に変更があった場合は --merge オプションでマージできる
    • -f, --force オプション
      • ワーキングツリーの状態を HEAD に初期化する
  • タグ
    • git push origin <タグ名>
      • タグをリモートリポジトリに反映
    • git push origin :<タグ名>
      • リモートリポジトリからタグを削除
      • ブランチ削除と被るので、refspec を省略せずに指定するのが望ましい
        • :refs/tags/<タグ名>
    • git describe
      • 最も近いタグを表示
  • git archive
    • 顧客に送るスナップショットを作成
    • --format= オプション
      • tar, zip を指定できる
      • bzip2 や gzip で圧縮するにはパイプを使う
    • --prefix= オプション
      • 展開後のディレクトリ名を指定
  • git fetch
    • リモートブランチを FETCH_HEAD に取り込む
    • git branch <ブランチ名> FETCH_HEAD
      • 取り込んだ FETCH_HEAD を起点としてローカルブランチを作成する
  • git stash
    • 変更をキューに保存
    • git stash pop
      • キューから取り出して適用
    • git stash apply
      • キューに残して適用
    • キュー番号を指定して pop, apply できる
      • stash@{<キュー番号>}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment