Git コマンド

2016.3.9 (水)

Gitの作成時

gitのイニシャライズ
$ git init
gitのバージョン確認
$ git --version
git version 1.7.1
ユーザーの作成

–globalをつけるとすべてのgitのユーザーになる。

$ git config --global user.name USERNAME
(git config user.name USERNAME)
Emailの登録
$ git config --global user.email USERNAME@example.com
(git config user.email USERNAME@example.com)
端末操作時に色をつける(これいい)

–globalありでOK。

$ git config --global color.ui true
CRLFにしない

ときどきwarning: LF will be replaced by CRLF in…と出るときあるので、これもやっておくといいです。

$ git config --global core.autoCRLF false
($ git config core.autoCRLF false)
リモートリポジトリの登録

SSHで接続可能なことが前提になります。

$ git remote add origin ssh://user@example.com:22/home/repos/user/repos.git
設定情報の確認
$ git config --list
クローンする
git clone ssh://user@example.com:22/home/user/remote.git

リモートリポジトリを指定してcloneしてきます。まるっと落ちてきます。

よくつかうコマンド

ステータスを確認(更新ファイル確認)
$ git status
更新ファイルをaddする(ステージングにあげる)

すべてあげちゃうか、更新ファイルを個別にaddするかできます。

$ git add -A
(git add FILENAME)
ログを確認する
$ git log
間違ってaddしたものを削除する

addしたものはcommitの準備段階になるので、間違ってaddしたものはここで削除します。ファイル自体は削除されません。

$ git rm --cache FILENAME

ディレクトリごと削除する場合は、

git rm -r --cache FILENAME

あるいは、HEADでリセットすることもできます。

$ git reset HEAD FILENAME

すべてのaddをキャンセルしたい場合はアスタリスク。

$ git reset HEAD *
コミットする
$ git commit -m "COMMIT MESSAGE"

コミットのメッセージが長文になってしまうとき、または更新ファイルを詳細に記録したいときは、git commitだけでやります。viがたちあがるので、そこに詳細を書く。

リモートリポジトリからfetchする

ここでは詳細避けますが、リモートリポジトリからローカルリポジトリに情報をもってくる作業です。

$ git fetch

マージする

ローカルリポジトリのマージをします。

$ git merge ORIGIN/MASTER
最初のプッシュをする

Gitを作成してはじめてpushをするときにはなぜかオプションが必要です。以降はgit pushだけでいけます。

$ git push -u origin master
(git push -u origin --all)
プッシュする
$ git push
差分確認

ブランチの比較

git diff BRANCH1 BRANCH1 --name-only

–name-onlyを取ると中身の差分も全部出ます。(正直ファイル多いと見づらいです。)

差分ファイルを作成する

なんでだか上から7桁でいいみたいです。コミット間のIDで差分抽出してディレクトリ構造を保ったまま差分ファイルを作成してくれます。
git_diff_archive コミット識別子1[新] コミット識別子2[古]となってます。

git archive --format=zip HEAD `git diff --name-only ad8xxxx ec1xxxx` -o archive.zip

ファイルの出力先指定する場合は、–prefixを使います。

git archive --format=zip --prefix=d/localhost/www/ HEAD `git diff --diff-filter=d --name-only ad8xxxx ec1xxxx` -o archive.zip
リモートリポジトリの内容で強制的に上書きする

私の場合ぼんやりしていて開発がめっぽう進んでしまいついてきけなくなることがあって、そういうときはこれを使います。みんなが開発してくれた最新のものになります。
(自分が開発途中の未コミットのものとかあるとマージが大変になってしまうので。。)

git fetch origin
git reset --hard origin/master

ブランチの場合は、

git fetch origin BRANCHNAME
git reset --hard FETCH_HEAD

でよいかと思います。

いろいろ問題が生じたときのやり方

.gitignoreが編集したのに反映されない

すでにリポジトリにignoreファイルを追加していると、キャッシュが残っており.gitignoreファイルの内容が反映されない。

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"
git push origin master
.gitignoreを無効にする

いったんキャッシュクリア

git rm -r --cache . .gitignore

いろいろ面倒になったときのコマンド

ひとつ前のコミットに戻す

いろいろ間違ってコミットしたときにはこれが使えます。よりダサく使うには、現在のファイルを物理的にバックアップを取りましょう。

$ git reset --hard HEAD^
以前のコミットに戻す

いろいろやってしまって収集がつかないときによく使います。

git reset --hard <コミットID>
強制的にpushする

面倒くさくなって且つ自分の手元が最新であり且つ誰にも迷惑をかけない自信があるときは、強制push(やや禁断)
通常はきちんとマージしてpushするのがお作法です。

$ git push -f

ただしこのコマンドはデフォルトでは無効になっている筈です。なので、.git/configの設定値を変えてあげます。denyNonFastforwardsをfalseで設定します。

denyNonFastforwards = true
↓
denyNonFastforwards = false
リモートリポジトリで強制上書き

上記強制pushの逆です。自分のリポジトリがむちゃくちゃになって整理つかなくなったら自分の責任で行いましょう。
fetchしてきてから強制的にリモートリポジトリの内容でローカルリポジトリを上書きします。

$ git fetch origin
$ git reset --hard origin/master

更新ファイルなどの確認

コミット間で差分を確認する

git logでハッシュ値を確認したら、双方のハッシュ値で差分を抽出できます。何を更新したのかわからなくなったときに便利です。またfetchとmergeした際に他の人達の更新情報を確認することもできます。

$ git diff 48ea2c27a34014998ea057e7ab45c38f19f63b4d 73a05e055016fd756b5c6cc74a26927a7f61f80b

しかしこれだと相当細かいdiffがとれれしまうので、ファイル名だけ表示させたいときはオプション(–name-only)をつけます。

$ git diff 48ea2c27a34014998ea057e7ab45c38f19f63b4d 73a05e055016fd756b5c6cc74a26927a7f61f80b --name-only

これで差分がわかるのでうれしい。

リモートリポジトリと差分を比較する
$ git diff remotes/origin/master

ブランチ

ブランチをマージする

それぞれの開発者がブランチを作成したときfetchした際に新しいブランチができたことを知らせてくれます。
自分の作業とほかの皆様のブランチをマージするときには、ブランチ名を指定してマージします。

ブランチ作成

git branch BRANCHNAME

ブランチをマージする

$ git fetch
repos@example.com's password:
remote: Counting objects: 1756, done.
remote: Compressing objects: 100% (759/759), done.
remote: Total 1129 (delta 525), reused 681 (delta 210)
Receiving objects: 100% (1129/1129), 1.26 MiB, done.
Resolving deltas: 100% (525/525), completed with 186 local objects.
From ssh://example.com/home/repos/user/repos
 * [new branch]      mybranch -> origin/mybranch
   bfa3e5f..136ebd9  master     -> origin/master

$ git merge origin/mybranch

マージしてしまうとブランチは残らないので、git branchをしてもmasterしか残ってないです。

ブランチがいっぱいあるときのマージなど

ブランチがいっぱいあると面倒くさいですが、基本同じです。fetch & mergeします。

git branch *ローカルのブランチ確認
git fetch origin [BRANCH NAME] *リモートからfetchしてくる
(git commit -m "xxxxx") *ローカルはコミットしておかないと駄目
git merge FETCH_HEAD
git push origin [BRANCH NAME]