Git
目次
Git
- 以下の本からメモ
- http://typea.info/blg/glob/git/
- https://www.backlog.jp/git-guide/
- http://qiita.com/satoshi1335/items/ead109412430a078feaa
設定
種類 | 範囲 | 場所 |
---|---|---|
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 --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のオプション]
git-gui
- git-gui は主にコミットを作成するためのツール
- 左側はインデックスです。ステージされていない変更が上に、ステージされた変更が下に表示
- 右上に表示されているのは diff
- この領域を右クリックすることで、個々のhunk(または個々の行)をステージング
- 右下はメッセージとアクションの領域です。テキストボックスにメッセージを入力し、 “Commit” をクリックすれば、 git commit と同じようなことができます
- “Amend” ラジオボタンを選択すると、 “Staged Changes” 領域に最後のコミットの内容が表示されるので、そのコミットを修正することもできます。 変更をステージしたり、ステージを取り消したり、コミットメッセージを変更したりしたら、 “Commit” を再度クリックすれば古いコミットが新しい内容で更新
$ git gui
プロジェクトの作成
プロジェクトコードが保存される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 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でやらかしたときに使えるコマンド
© 2006 矢木浩人