GITの使い方
目次
GITの構造
- 下記にGITの構造を簡易図で示します。
共有環境 <- 作業ファイルへの更新の場合
共有環境 -> 作業ファイルへの更新の場合
一括でgit rmする方法
実際のファイルを消したのち、git rmを一括でかけたくなる場合があります。
git rm `git ls-files --deleted`
特殊なファイル名が混じっている場合には下記を使ってみましょう
git status | grep deleted: | cut -c 15- | sed -e 's/ /\\ /g' | xargs git rm
特殊なファイル名をgit rmする方法
特殊なファイル名(例えば、?)のものが消えない場合があります。その際に利用します。
git rm "XX" git status | grep deleted: | cut -c 15- | sed -e 's/ /\\ /g' | xargs git rm
git reset とは?
HEAD の位置を変更するコマンド。オプションによってインデックス、ワーキングツリーの内容も変更できる。
git reset のオプションは? --soft、--mixed(オプションなしと同等)、--hard オプションがあり、影響度の小さい順に以下のようになる。
--soft HEAD の位置のみを変更する。インデックス、ワーキングツリーには影響なし。
--mixed (またはオプションなし) HEAD の位置とインデックスを変更する。ワーキングツリーには影響なし。
--hard HEADの位置、インデックス、ワーキングツリーをすべて変更する。
HEAD、インデックス、ワーキングツリーとは
- ワーキングツリー:現在のディレクトリ
- インデックス:addが終わった状態
- HEAD:commitが終わった状態(登録されている一番最後)
- HEAD^: HEADの一つ前(HEAD^^: さらに前)
- HEAD~n: HEADのn番前
- commitが終わった直後は、HEAD、インデックス、ワーキングツリーの3つが同じ位置を示す。
- ファイル等を変更するとワーキングツリーが先に進む。
- addを行うと、インデックスがワーキングツリーの位置に進む
- さらにファイル等を修正すると、ワーキングツリーが先に進む(この場合、HEAD、インデックス、ワーキングツリーがすべて異なる状態)
差分ファイルを確認する
差分ファイルを確認するにはgit diffを使用します。
実行例
$ git diff diff --git a/bin/wish/Display2/tclIndex b/bin/wish/Display2/tclIndex index 8fd9302..75a715a 100644 --- a/bin/wish/Display2/tclIndex +++ b/bin/wish/Display2/tclIndex
作業ディレクトリを切り替える
git checkoutを使用すれば、作業ディレクトリ(ワーキングツリー)のデータをadd直後や特定のバージョン(タグ)に切り替えることができます。
$ git checkout (ファイル名)
こちらの操作でワーキングツリーはadd直後に切り替わります。
$ git checkout (タグ名) (ファイル名)
こちらの操作でワーキングツリーは特定のコミット直後に切り替わります。
$ git checkout HEAD .
管理外のファイル削除する
git cleanを使用することにより、GITで管理していないファイルを削除することができます。例えば、コマンド単体テストやチュートリアル実行などでできるファイルなどをまとめて削除したい場合に有効です。オプション-n で削除対象の確認、オプション-f で実際に削除します。一旦削除すると元に戻せませんので、必ず -nで確認を行ってから実行しましょう。
$ git clean -n Would remove a.txt $ git clean -f Removing a.txt
困ったとき・間違えたとき
共同開発においては、互いにデータを書き換えるのでトラブルは付き物です。しかし、そのトラブルを恐れていては積極的な開発は出来ないでしょう。ここではGITを使用する際に出くわす問題の対処法を記載していきます。
mergeがうまくいかないとき
下記のエラーメッセージに出会ったとき
error: Your local changes to the following files would be overwritten by merge:
下記のコマンドでローカルのワーキングツリー、インデックス、HEADをリモートの最新バージョンの状態に戻します。(管理外のファイルには適応されません。)
git reset --hard HEAD