Git

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

目次

Git

  • 以下の本からメモ

設定

種類 範囲 場所
system システム全体 /etc/gitconfig
global 該当ユーザー全リポジトリ ~/.gitconfig
local 該当リポジトリ [repository]/.git/config


確認

基本

$git config --global --list
user.email=pppiroto@gmail.com
user.name=piroto

ユーザーインターフェースの色

$git config --global color.ui "auto"

設定

  • 確認
$git config --list
  • 変更
$git config --global user.name "Hiroto Yagi"
$git config --global user.email "pppiroto@gmail.com"

編集

$git config --global --edit

ヘルプ

$git help
$git help コマンド

GUI

gitk

  • Cygwinでgitkが使えないときの対策メモ
  • gitk はグラフィカルな履歴ビューア。 git log や git grep をパワフルなGUIシェルから使えるようにしたようなもの。 過去に何が起こったかを検索したり、プロジェクトの歴史を視覚化しようとしているときに使う。
  • --all : HEADだけではなく 任意の 参照から到達可能なコミットを表示させる
    • 各ドットはコミットを、線は親子関係を表す
$ gitk [git logのオプション]

0552 gitk.jpg

git-gui

  • git-gui は主にコミットを作成するためのツール
  • 左側はインデックスです。ステージされていない変更が上に、ステージされた変更が下に表示
  • 右上に表示されているのは diff
    • この領域を右クリックすることで、個々のhunk(または個々の行)をステージング
  • 右下はメッセージとアクションの領域です。テキストボックスにメッセージを入力し、 “Commit” をクリックすれば、 git commit と同じようなことができます
  • “Amend” ラジオボタンを選択すると、 “Staged Changes” 領域に最後のコミットの内容が表示されるので、そのコミットを修正することもできます。 変更をステージしたり、ステージを取り消したり、コミットメッセージを変更したりしたら、 “Commit” を再度クリックすれば古いコミットが新しい内容で更新
$ git gui

0551 git gui.jpg

プロジェクトの作成

プロジェクトコードが保存される3つの場所

  1. 作業ツリー : 直接ファイルを編集
  2. インデックス(ステージングエリア) : 作業ツリーとリポジトリとの間のバッファ
  3. リポジトリ
作業ツリー -- add --> インデックス -- commit --> ローカルリポジトリ -- push --> リモートリポジトリ

リポジトリの作成

  • Gitのリポジトリは、作業ツリーと同じ場所の.gitディレクトリの中
$mkdir mysite
$cd mysite
$git init
  • 作業ファイルがなく、管理ファイルのみのリポジトリの場合
$git init --bare hoge

変更を加える

  • リポジトリに追加
$git add hoge.txt
  • サブディレクトリを含めたすべてを登録
$git add .
  • コミット
$git commit -m "Comment for this commit"
  • gitが変更を把握しているすべてをコミット
$git commit -a

add

  • gitがコミットのための追加・変更をステージする
  • 対話形式に対象を選ぶ
$git add -i
    :
*** Commands ***
  1: status       2: update       3: revert       4: add untracked
  5: patch        6: diff         7: quit         8: help
  • 4.まだ追跡していないファイルをステージする
  • 5.コミットする変更箇所を指定する

mv

  • ファイル名の変更やファイルの移動
git mv 元ファイル名 後ファイル名

<blockquote>mvは、新しいファイルに対する、add と古いファイルに対する rm を自動で行う</blockquote>

ファイルを無視する

.gitignore
  • .gitignoreファイルに設定を書き足す
  • ワイルドカードが使用可能
  • 通常のファイルで構成管理対象のため共有されてしまう
.git/info/exclude
  • .git/info/excludeに記述する方法もある。
  • 他のユーザとは共有されない。

https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff

特定の拡張子を無視する
*.exe
特定のフォルダの中身全てを無視する
bin/
特定のパターンを無視しない
!bin/hoge.exe
フォルダ内の特定拡張子を無視
package/**/*.class


変更の確認

現在の状況を確認

$git status

差分の確認

作業ツリーの変更を表示
  • パラメータなし
$git diff
ステージングとリポジトリとの差分表示
$git diff --cached
ステージング含め作業ツリーのすべてをリポジトリと比較
$git diff HEAD

<blockquote>HEADは現在作業しているブランチの直前のコミットを表すキーワード</blockquote>

コミットログの確認

コミットの履歴を見る
$git log
これまでHEADが辿ってきた履歴を見る
$git reflog

作業を開始する

  • 作業ツリーがgitにどう見えているか
$git status

変更を削除

ファイル指定
git checkout <filename>
すべて
$git checkout .

ステージを取り消す

git rm --cached [ファイル名]

リセットでコミットを書き換える

直前のコミット取り消し

コミットのみ
$ git reset --soft HEAD^
すべて
$ git reset --hard HEAD^

コミット後の変更を全部取り消し

$ git reset --hard HEAD

addの取り消し

$ git reset --mixed HEAD

過去の状態に戻す

$ git reset --hard 昔のコミットのハッシュ値
resetの後最新の状態に戻す
$ git reset --hard ORIG_HEAD

直前のリセットを取り消す

$ git reset --hard ORIG_HEAD

ブランチ

<blockquote>Git の真髄は、あらゆるものがブランチのように扱われることにある</blockquote>

ブランチを作る

  • masterブランチを元にRB_1.0ブランチを作成する
  • masterブランチは、Subversionにおけるtrunkにあたる
$git branch RB_1.0 master
  • new ブランチをつくる
$git branch new
  • "*"が打たれているのがcheckout(現在作業ツリーに反映されている)されているブランチ
$git branch
* master
  new
  • 新しいブランチをcheckout
$git checkout new
Switched to branch 'new'
  • 確認
$git branch
  master
* new

ブランチを切り替える

$git checkout RB_1.0

<blockquote>Gitでは、ブランチにかかるコストが安い。Gitのブランチはそのブランチで成された最新のコミットだけを記録している</blockquote>

ブランチ間での変更マージ

  • ブランチ間で変更をマージする方法はいくつかある
    • 直接マージ: 履歴をマージして一緒にしようとする
    • 圧縮コミット: 変更を圧縮(squash)して別なブランチの先頭にコミット
    • チェリーピック: コミットを1つとってきて、現在のブランチに適用

直接マージ

  • マージ先としたいブランチに切り替え
$git checkout master
$git merge {マージしたいブランチ}

リリースのハンドリング

タグを打つ

  • タグの名前(1.0)、タグを打ちたいポイント(RB_1.0)
$git tag 1.0 RB_1.0

タグ一覧の参照

$git tag

タグをリモートにpush

$git push origin {tag_name}
  • 一括でpush
$git push origin --tags
$ git push origin master

rebase:ブランチから変更を取り出し別ブランチの先頭で再生

  • masterブランチからブランチしたRB_1.0 の変更をmasterブランチに反映させる
  • まず、masterブランチへ戻る
  • rebase で反映させる
$git checkout master
$git rebase RB_1.0

ブランチの削除

  • タグを打ってあるため、ブランチを削除しても問題ない
$git branch -d RB_1.0
  • リリースに対してパッチする場合、タグからブランチすればよい
$git branch RB_1.0.1 1.0
$git checkout RB_1.0.1

アーカイブする

  • --formatでアーカイブ形式、--prefixでディレクトリを指定
$git archive --format=zip --prefix=phraseit-0.9/ master >master0.9.zip

リモートリポジトリ

  • gitはリモートのリポジトリも扱える
  • 自分の作業を共有、コピーの取得など可能

リモートリポジトリのクローン

  • リモートリポジトリで作業を始めるためにはクローンの作成が必要
  • 作業を始めるリモートリポジトリの完全なコピーを作成する
$git clone ssh://root@rev.typea.info/var/www/git/phraseit

git remote

作業 コマンド
追加 git remote add
削除 git remote rm
確認 git remote -v
URL変更 git remote set-url
名前変更 git remote rename

リポジトリ公開時のApache設定

https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Smart-HTTP

  • /etc/httpd/conf.d/git.conf を作成
<VirtualHost *:80>
    ServerName git.taisetsu.typea.info
    DocumentRoot /var/www/git
    SetEnv GIT_PROJECT_ROOT /var/www/git
    SetEnv GIT_HTTP_EXPORT_ALL
    ScriptAlias /git/ /usr/libexec/git-core/git-http-backend
    RewriteEngine On
    RewriteCond %{QUERY_STRING} servive=git-receive-pack [OR]
    RewriteCond %{REQUEST_URI} /git-receive-pack$
    RewriteRule ^/git/ -[E=AUTHREQUIRED]
    <Files "git-http-backend">
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /var/www/git/.htpasswd
        Require valid-user
        Order deny,allow
        Deny from env=AUTHREQUIRED
        Satisfy any
    </Files>
</VirtualHost>
  • 必要に応じて、ServerNameをhostsに記述
  • リポジトリのオーナーを変更
# chown -R apache /var/www/git
  • パスワードファイルの生成
# htpasswd -c /var/www/git/.htpasswd {ユーザー名} 
New password: 
Re-type new password: 
Adding password for user root
  • push 時に httpsでないと、403エラー config の設定を ssh: とし、ユーザー名もホスト名の先頭に付与するまた、パスは実際のパス
> git remote set-url origin ssh://root@git.taisetsu.typea.info/var/www/git/hoge.git

Webからリポジトリ内容を閲覧

同期

リモートブランチの確認(branch -r)

$ git branch -r
  Github/master
  origin/master 

git fetch

  • ローカルリポジトリにないリモートリポジトリのコミットオブジェクトをローカルリポジトリに追加
  • リモートブランチの履歴取り込。このとき更新されるのは、あくまで指定したリモートブランチに対応する「リモート追跡ブランチ」です。(git fetch はローカルブランチ、インデックスや作業ツリーに一切の変更を加えません。)

git merge

  • 両ブランチで変更されたファイルのスナップショットを再作成して,新しいコミットオブジェクトを自動生成
  • 更新されたリモート追跡ブランチを、現在のブランチにマージする
$ git merge FETCH_HEAD

git pull

  • git fetch と git merge を合わせた動作
  • git pull <remote> <branch>
$ git pull origin master

Tips

日本語ファイル名

  • 日本語ファイル名は "\nnn" にエスケープされてしまって読めない。以下の設定を追加することで日本語ファイル名が表示されるようになる。
$ git config --global core.quotepath false

Gitでやらかしたときに使えるコマンド