Subscribed unsubscribe Subscribe Subscribe

Gitコマンド集

Git

f:id:keiwt:20150310235540p:plain

f:id:keiwt:20150310235717p:plain

f:id:keiwt:20150310235848p:plain

よく使うGitのコマンドをご紹介致します。
以下のコマンドを覚えれば、すぐにGitを使用することができます。

また、案件または、プロジェクトにアサインされてから、コーディングをして、pushするまで時系列的に記載しておりますので、上から順に覚えれば実際の開発のフローをイメージすることができます。

まずは各種設定をします。

設定

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Enter file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]
※recommend a very good, secure passphrase

$ eval "$(ssh-agent -s)"
# Agent pid 123456
$ ssh-add ~/.ssh/id_rsa
$ pbcopy < ~/.ssh/id_rsa.pub
# Copies the contents of the id_rsa.pub file to your clipboard
→Github上に公開鍵を登録する

$ ssh -T git@github.com
# Attempts to ssh to GitHub

Redirecting... Working with SSH key passphrases - User Documentation

  • 基本設定
$ git config --global user.name keiwt
$ git config --global user.email keiwt@example.com
$ git config --global color.ui true
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global pull.rebase true

※これでpushした際のユーザー名とメールアドレスを設定できます。
※color.uiはgit statusをした時等にカラーリングしてくれます。

  • 設定の確認
$ git config -l

※ちなみに--globalオプションはそのユーザーの設定に対してという意味で、他のユーザーには影響を与えません。

if you pass the --global option, because then Git will always use that information for anything you do on that system.

既存のディレクトリに対してローカルリポジトリを作成する

※既存にディレクトリに対して任意のリモートリポジトリのものをpullしたいときもこちらのようにremote addすればよいです

$ git init .

※.gitディレクトリが作成され、カレントディレクトリでgitが使えるようになります

remoteの設定

  • remoteの追加
$ git remote add github git@github.com:keiwt/XXXXX.git
  • remoteの確認
$ git remote -v
  • remoteのリネーム
$ git remote rename origin github
  • remoteのURLの変更
$ git remote set-url origin git@github.com:keiwt/XXXXXXX.git
  • pull
$ git pull origin master

新規ディレクトリを作成すると同時にローカルリポジトリを作成する

$ git clone git@github.com:keiwt/XXXXXX.git
$ git clone git@github.com:keiwt/XXXXXXX.git {{作成されるディレクトリ名}}

次にブランチを作成します。
GitHubフローを導入している場合はmasterブランチから作業用ブランチを作成します。

ブランチの確認

  • ローカル、リモート、カレントブランチを確認したい場合
$ git branch -a
  • ブランチの最新のコミットidとトラッキングブランチの確認する場合
$ git branch -vv

When in list mode, show sha1 and commit subject line for each head, along with relationship to upstream branch (if any). If given twice, print the name of the upstream branch, as well (see also git remote show ).

ブランチの作成

※ブランチ作成時にはgit branch -aとしてから、対象となるブランチ名をコピーしてください * 作成のみでカレントブランチは切り替えない場合

$ git branch ${new} ${from}

※これでfromブランチを元にnewブランチが作成されます
※カレントブランチは変わりません

  • 作成と同時にカレントブランチを切り替える場合
$ git co -b ${new} ${from}

※カレントブランチはnewブランチになります

  • ブランチ名変えたい場合
$ git branch -m ${old} ${new}

カレントブランチの切り替え

$ git co ブランチ名

これで作業用ブランチ上で開発していきます

差分を確認する

  • 作業用ブランチと.git配下の最新のコミットとの差分を確認する場合
$ git diff -b -U30

※-bは空白文字、改行コードを除いて、差分を表示します。

Ignore changes in amount of whitespace. This ignores whitespace at line end, and considers all other sequences of one or more whitespace characters to be equivalent.

※-U30は前後30行のdiffにしてくれます

Generate diffs with lines of context instead of the usual three.

  • ステージング環境と.git配下の最新のコミットとの差分を確認する場合
$ git diff -b -U30 --staged
$ git diff -b -U30 --cached

※どちらでも構いません

作業ブランチで開発中にmasterブランチに反映された差分を自身の作業ブランチに反映します。
まずは作業ブランチのソースツリーを一時保存します。

stash

  • カレントブランチの作業ディレクトリとステージング環境と.git配下の最新のコミットとの差分を一時的に保存する
$ git stash

※ すでにaddしている差分も一時的に保存されます

リモートのmasterブランチとローカルのmasterブランチを同じにする

$ git co master
$ git pull origin master

差分を確認する

$ git diff master..${作業ブランチ名}

リモート上でのmasterブランチの差分を取り込む

  • rebase
$ git co 作業ブランチ名
$ git rebase master
$ git push -f origin 作業ブランチ名

※基本的にrebaseを使用してください

  • merge
$ git merge --squash

最新のgit stashされた差分をカレントブランチに反映する

$ git stash pop

※過去にgit stashで保存したものを全て削除する場合は → $ git stash clean

作業ディレクトリをステージング環境に反映する

  • untrackedとmodifiedになっているもの
$ git add .
  • deletedになっているもの
$ git add -u
  • 全部addしたい場合
$ git add -A

Update the index not only where the working tree has a file matching but also where the index already has an entry.This adds, modifies, and removes index entries to match the working tree.

If no is given when -A option is used, all files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories).

  • 間違えてaddしてしまった
$ git reset HEAD

※gitのバージョンによってはgit rm --cachedの場合もあります
※基本的にgit status時にコマンドは表示されますので、それに従ってください

ファイル削除・名前変更

  • 削除
$ git rm {{ファイル名}}

※このコマンドを実行した時点ですでに削除されたファイルはステージング環境に反映済みです

  • 名前変更
$ git mv ${from} ${to}

※このコマンドを実行した時点ですでに名前が変更されたファイルはステージング環境に反映済みです

作業ブランチのファイルを.git配下の最新のコミットの状態にする場合

$ git co -- filename

Note the quotes around filename. The file will also be checked out, even though it is no longer in the working tree, because the file globbing is used to match entries in the index (not in the working tree by the shell).

commit

  • 実行
$ git commit -v

※ステージング環境の差分が.gitディレクトリ配下に反映されます ※コミットの対象はステージング環境にあるものです

  • コミットメッセージを変えたい
$ git commit --amend
  • 2つのコミットを1つにしたい
$ git rebase -i HEAD~2

※この後に前のコミットに混ぜたいコミットのpickをsにします

リモートの確認

$ git remote -v

※push先が正しいかを確認します

push

$ git push origin ブランチ名

※リモートリポジトリにブランチが作成されます。
※すでに同名のブランチが存在する場合は差分が反映されます

間違えて不要なコミットをして、1つ前の状態にしたい場合

$ git co HEAD^ filename

show,log,diff

  • 直近のコミットの差分を確認する場合
$ git show

リモートブランチの削除

$ git push --delete origin 削除したいリモートブランチ名

これだけでは、.git配下ではリモートブランチの参照がまだ残っています。
そこでローカルのリモートブランチ参照を最新の状態にします

remoteのrefの同期

$ git remote prune origin

ローカルブランチの削除

$ git branch -d ブランチ名

※他のいずれのブランチにもマージされていないコミットが存在する場合は-dでは削除できません。
※もし、本当にどうなってもいいコミットの場合があるブランチを削除したい場合は以下のコマンドを使用します

$ git branch -D ブランチ名

git statusの実行に時間がかかるようになってきた場合

$ git gc --aggressive

Usually git gc runs very quickly while providing good disk space utilization and performance. This option will cause git gc to more aggressively optimize the repository at the expense of taking much more time.The effects of this optimization are persistent, so this option only needs to be used occasionally; every few hundred changesets or so.

HEADの履歴から特定の状態に戻したい

$ git reflog
$ git reset --hard HEAD@{数字}

誰かがpush済みのコミットをrebaseした場合

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