[Git] command basic

随時更新

前提知識

fetch

“git fetch origin xxx”は、リモートレポジトリ “origin” のブランチ “xxx” を、ローカルのリモート追跡ブランチ (remote tracking branch) に反映させるということである。

$ git branch -a
* develop
  feature/dynamodb
  feature/ph1-add-flag
  master
  remotes/origin/HEAD -> origin/master # remote追跡ブランチ
  remotes/origin/develop # remote追跡ブランチ
  remotes/origin/ph1-test # remote追跡ブランチ

merge

“git merge origin/xxx” は、リモートレポジトリ “origin” のブランチ “master” の追跡ブランチ (origin/xxx) を、現在のブランチにマージするということである。
マージする場合は --no-ff オプションを基本的に付与する。二つのブランチが fast-forward な関係かどうかにかかわらず、必ずマージコミットが作られる。

-ff: fast-foward

Git コマンド

$ mkdir {WORKING_COPY}
$ cd {WORKING_COPY}

# Gitリポジトリを新たに作成する。バージョン管理外の既存プロジェクトをGitリポジトリに変換したり, カレントリポジトリの初期化を行う。
$ git init

# リモートからローカルへリポジトリのクローン
$ git clone https://{USERNAME}:{PASSWD}@github.com/{ORGANIZATION}/{REPOSITORY}.git

# リモートからローカルへリポジトリのクローンができない場合
# sslVerifyを解除しない場合 "SSL certificate problem: Invalid certificate chain" のようにエラーとなる場合がある。
$ git config --global http.sslVerify false
$ git clone git@xxx...
$ git config --global http.sslVerify true

# ユーザー名/メールアドレスの設定
$ git config user.name "xxx"
$ git config user.email "xxx@gmail.com"

# 他のワーキングコピーも共通でユーザー名/メールアドレスを設定
$ git config --global user.name "xxx"
$ git config --global user.email "xxx.gmail.com"

# 設定の一覧を表示する
$ git config --global --list

# 現在のリポジトリの設定のみ表示
$ git config --list

# 半角区切りで複数ファイルをインデックスへ追加可能。コミット前の一時保存場所への追加と思えば良い。
$ git add README.md xxx.html

# -Aをつけると、変更を全てインデックスへ追加
$ git add -A

# コミット
$ git commit -m "first commit"

# リモートレポジトリのURL情報を追加。どこへpushするのか指定する。
$ git remote add origin git@git....git

# リモートブランチのURL確認
$ git remote -v
origin https://github.com/xxx

# リモートリポジトリを指定する
$ git remote set-url origin git@xxx.github.com:xxx/xxx.git

# リモートリポジトリのmasterへプッシュ。-uは次回からブランチ名(今回はmaster)を省略可能なオプション。
$ git push -u origin master

# チェックアウト (ローカルへブランチを落とす)
$ git checkout origin release/1.1.2

# 最新のコミットをリモートから取得する
$ git pull origin master

# (コミット前の)ローカルの変更を全て取り消す
$ git checkout .

# (コミット前の)ローカルの変更を一部取り消す
$ git checkout -- /path/to/file
# コミットIDを指定してコミットしたものも含めてローカルの変更を全て取り消す
$ git reset --hard c6c2114

# ブランチを指定してコミットしたものも含めてローカルの変更を全て取り消す
$ git reset --hard origin/master

# ローカルでrevertを使ってpush内容を取り消し、リモートへ反映(resetと異なり、コミットが残る)
$ git revert {commit id}

# ステータスを確認する
$ git status

# コミットログを確認する
$ git log --oneline

# グラフ上に展開
$ git log --graph

# コミットログをコミットメッセージから検索する。
$ git log --grep hoge

# 現在のコミットIDを確認する
$ git show -s --format=%H

# 全てのブランチの一覧 (表示されない場合は、更新する)
$ git branch -a | grep release

# リモートブランチの更新
$ git remote update

# ブランチの作成
$ git branch develop

# 作成ブランチをプッシュ
$ git push origin develop

# developをチェックアウトし
$ git checkout develop

# masterへマージする
$ git merge -m "create develop" master

# ブランチを削除する
$ git branch -d origin/feature/xxx

# ブランチを強制削除する
$ git branch -D origin/feature/xxx

# リモートリポジトリの削除情報をローカルへ反映させる
$ git fetch --prune

# gitignoreが有効になっているファイルを表示する
$ git status --ignored

1つのマシンで複数のGitアカウントを使用する

$ ssh-keygen -t rsa -f ~/.ssh/xxx -C "some comment"

# catした内容をGithubへ貼り付ける。
$ cat .ssh/xxx.pub

configファイルへ以下を追記する。
~/.ssh/config

Host xxx
    User yyy
    HostName github.com
    IdentityFile ~/.ssh/xxx

Gitへ認証させる

$ ssh xxx
The authenticity of host 'github.com (xxx.xx.xxx.xxx)' can't be established.
RSA key fingerprint is SHAxxx:xxx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,xxx.xx.xxx.xxx' (RSA) to the list of known hosts.
Saving password to keychain failed
Identity added: /Users/user/.ssh/xxx ((null))
PTY allocation request failed on channel 0
Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

CloneとRemoteへの追加

$ git clone git@{USER}:{PASSWD}/{REPOSITRY}.git
$ git remote add origin git@{USER}:{PASSWD}/{REPOSITRY}.git

Pushしたコミットをある時点まで完全に取り消したい

$ git log --graph
$ git reset --hard c53hgoehhogoeo53h53hog3l
$ git status
On branch feature/test
Your branch is behind 'origin/feature/test' by 3 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
nothing to commit, working tree clean

# そのままpushを行ってもエラーとなる
$ git push -u origin feature/test
To https://github.com/org/test.git
 ! [rejected]        feature/test -> feature/test (non-fast-forward)
error: failed to push some refs to 'https://user:pass@github.com/org/test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

# オプション "-f" を付与する
$ git push -uf origin feature/test
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/org/test.git
 + c53hgoehhogoeo53h53hog3l feature/test -> feature/test (forced update)
Branch feature/test set up to track remote branch feature/test from origin.

Rebaseを取り消したい

$ git rebase -i {コミットID}
Successfully rebased and updated refs/heads/feature/feature-xxx.

$ git status
On branch feature/feature-xxx
Your branch and 'origin/feature/feature-xxx' have diverged,
and have 2 and 4 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

$ git reflog
826ab92 HEAD@{0}: rebase -i (finish): returning to refs/heads/feature/feature-xxx
826ab92 HEAD@{1}: rebase -i (pick): xxx -> yyyへ変更
03d8142 HEAD@{2}: rebase -i (pick): yyy
b28cfc2 HEAD@{3}: rebase -i (start): checkout b28cfc2
92db362 HEAD@{4}:
92db362 HEAD@{6}: commit: xxx -> yyyへ変更
58e9522 HEAD@{7}: checkout: moving from develop to feature-xxx

$ git reset --hard HEAD@{6}
HEAD is now at xxxxxxx xxx -> yyyへ変更

$ git reflog
92db362 HEAD@{0}: reset: moving to HEAD@{6}
826ab92 HEAD@{1}: rebase -i (finish): returning to refs/heads/feature/feature-xxx
826ab92 HEAD@{2}: rebase -i (pick): xxx -> yyyへ変更
03d8142 HEAD@{3}: rebase -i (pick): yyy
b28cfc2 HEAD@{4}: rebase -i (start): checkout b28cfc2

Mergeしたcommitを取り消す

$ git branch
* develop
  feature/feature-xxx

$ git revert -m 1 {mergeしたcommit ID}

# 誤ってrevertした場合
$ git reset --hard HEAD~

# 後はcommit, push

.gitignoreが効かない

“.gitignore” は、Remoteを消しつつ、ローカルでファイルを残してコミット対象から無視させる (という理解)。

$ git touch .gitignore
$ vim .gitignore
$ git add .gitignore
$ git commit -m "add gitignore"

# キャッシュを削除する。ローカルのファイルへは影響しない。
$ git rm --cached {FILE_NAME}

# ディレクトリごとキャッシュ削除。
$ git rm -r --cached .

# commit, pushする。
$ git add .
$ git commit -m "remove cache of gitignore"
$ git push -u origin develop

Remoteにファイルを残しつつ、ローカルの変更をコミット対象から無視させる場合は、以下のコマンドを利用する。

$ git update-index --assume-unchanged {FILE_NAME}

# 元に戻す場合
$ git update-index --no-assume-unchanged {FILE_NAME}

# 設定の反映確認
$ git ls-files -v