はじめに
gitのコマンドライン操作について手元のメモを書き出してみた
なお、サルでも分かるGit入門が分かりやすい。
Web上で疑似的にgitコマンドを使って学べるサイト
http://k.swd.cc/learnGitBranching-ja/
前提
- リモートに、マスターブランチ(origin)として develop が作成されている
- developブランチをベースに作業ブランチ(feature)を作成する。
- 作業ブランチへのコミットは一人で行う。(他の人によるコミットは発生しない)
任意タイミングで使用するコマンド
ブランチの一覧を表示する
$ git branch # ローカルのブランチのみ
# originのブランチも含めて表示する場合
$ git branch -a
作業対象のブランチに切り替える
$ git checkout feature/<ブランチ名>
作業ブランチを作成する
$ git checkout develop # ブランチ作成元(develop)をチェックアウト
$ git fetch # originの最新状態を取得する
$ git pull # origin/developをローカルに反映(fast forwardマージになるはず)
$ git branch feature/<ブランチ名> # ブランチ作成
$ git checkout feature/<ブランチ名> # 作成したブランチを作業対象にする
結果、自分のローカルにブランチが作成される。
クローン元であるGitHubに反映するには push が必要。
$ git push
作業ブランチの作成とブランチ切り替えを一度に行う
$ git checkout -b feature/<ブランチ名>
ローカルのブランチを削除する
$ git checkout develop # 削除対象から他のブランチに移動
$ git branch -D feature/<branch名>
未ステージング、ステージング、コミットなどの状態を表示する。
$ git status
コミット履歴を見る
$ git log
originのコミット状態を取得する。
$ git fetch
ローカルのファイルにはマージしない。
リポジトリに登録されていないファイルを削除する
ビルドで生成されるファイルとかですね。git add するときに邪魔なので、それを消す方法です。
$ git clean -df
未ステージング状態(addしていない)で使用するコマンド
ステージングする
$ git add --all
最新コミットとの差分を表示する
$ git diff
作業環境を最新コミットの状態にリセットしたい(ローカルの作業を無かった事にする)
$ git reset HEAD --hard
ファイル単位で最新コミットの状態にリセットしたい
$ git checkout filename
作業中状態を一時保存する
(他のブランチに移動する場合など)
$ git stash # 作業中の状態を保存
$ git checkout feature/<他のブランチ>
(何か作業)
$ git checkout feature/<元のブランチ>
$ git stash pop # 保存した状態を取得
ブランチを作らずにファイルを更新してしまった場合(masterで作成していた!)
$ git stash # 作業中の状態を保存
$ git checkout [元ブランチ] # 作業ブランチ作成元のブランチに移動
$ git checkout -b [実際の作業ブランチ名] # 作業ブランチ作成
$ git stash pop # 保存していた状態を取得
ステージング済み(git addした状態)で使用するコマンド
コミットする
$ git commit -m "コミットコメント"
$ git commit -amend # 継ぎ足しコミット
addしたファイルをリセットして最新コミットと同じ状態に戻す
$ git checkout HEAD filename
ステージ内容と最新コミット(HEAD)の差分を見る
# コンソールに表示する
$ git diff --cached
コミット済み状態で使用するコマンド
クローン元の変更内容をローカルにマージする。
$ git pull
コミット済みファイル名変更
作業環境のファイルシステム上でリネームすると、
別ファイル扱いとなりコミット履歴が切れてしまうので、
このコマンドを使用する。
$ git mv oldname newname
ローカルで最新のコミットを無かったことにする
$ git reset HEAD^ # HEADを1つ前に移動するだけ。ワークのファイルは変化しない。
リベース
$ git checkout feature<ブランチ名>
$ git rebase origin/develop
<コンフリクト修正>
$ git add filename
$ git rebase --continue (コミット相当)
$ git rebase --abort (中止)
originのブランチにプッシュする
$ git push
プッシュ済みのコミットを改変した場合(--amendやrebaseを使用した場合)
$ git push -f # originを上書き
ブランチを作らずにローカルのmasterにコミットしてしまった!
$ git log # コミットログを調べる
$ git reset [間違ったコミットの直前のコミットID] # 間違ったコミットの直前にHEADを戻す
# 間違ったコミットのファイルが未ステージングに戻る
$ git stash # 対象ファイルを保存
$ git checkout -b [実際の作業ブランチ名] # 作業ブランチ作成&移動
$ git stash pop # 保存していた状態を取得
$ git add *
$ git commit -m "comment"
$ git push
GitHub連携
GitHubのリポジトリをローカルにクローンする
GitHubのリポジトリを開き、「Clone or download」ボタンを押した先のURLをコピーし、以下コマンドを実行する。
$ git clone <url>
コミットをissueに紐づける
$ git commit -m "#7 コミットコメント"
issue番号をコミットコメントに含める。
コミットと同時にissueをクローズする
$ git commit -m "close #7 コミットコメント"
'close'をコミットコメントに含める。
作業フロー例
ブランチへのコミット
$ git checkout feature/<ブランチ名> # ブランチ切り替え
<ファイルの編集作業>
$ git status # ワークのファイルを確認する
$ git add --all # 変更・追加・削除を行ったファイルをステージングする
$ git status # ステージング状態を確認する
$ git commit -m "#7 コミットコメント" # コミットする。
# コミットコメントにissue番号を含めると("#番号")issueに紐づけてくれる
# コミットと同時にissueをクローズする時は、"close #7 コミットコメント"と記述する。
$ git push # originのfeature/<ブランチ名>に反映する
リポジトリの最新コミットに継ぎ足しでコミットする
$ git add --all # 変更・追加・削除を行ったファイルをステージングする
$ git commit --amend # リポジトリの最新コミットに継ぎ足しする
$ git push -f # 既存のコミット履歴を改変するので -f (force)を付ける
リポジトリの最新コミットをその一つ前のコミットにマージする
$ git reset HEAD^ # "最新コミット"位置(HEAD)を1つ前に移動
$ git add --all # 最新コミットだったファイルが未コミットに戻るので改めてステージングする
$ git commit --amend # 最新コミットに継ぎ足す
$ git push -f # プッシュ済みの履歴を置き換えるので -f を付ける
複数個のコミット履歴を一つにまとめる(rebaseを使用)
まず、コミット履歴を取得する
$ git log # コミット履歴を取得する
ログの例)
コミット履歴が新しい順に表示される。
ここでは、[コミット1]と[コミット2]を一つにまとめたい。
---
commit 1fb0ae70a2f9bcb6f10b07d4b38de20620457c7d
Author: 名前 <mailaddress>
Date: 日時
コミット2
commit 8122fda4ccd5ab345c5670a0b19890312999c90f
Author: 名前 <mailaddress>
Date: 日時
コミット1
commit 91c77131208667833b07a652d1c9723fb187ae7c
Author: 名前 <mailaddress>
Date: 日時
ブランチ作成元(このコミットは変更しない)
---
$ git rebase -i 91c77131208667833b07a652d1c9723fb187ae7c # [ブランチ作成元]の"commit"を指定する
<エディタが開いて以下が表示される>
---
pick 9128e80 コミット1
pick ed55805 コミット2
# (説明書き...)
---
2行目以降の'pick'を全て's'に変更してエディタを閉じる。(コミットが1行目に集約される)
再度エディタが開くので、コミットコメントを1行にまとめて書く。
<変更前>
---
# This is a combination of 2 commits.
# The first commit's message is:
コミット1
# This is the 2nd commit message:
コミット2
---
<変更後>
---
コミット1と2の対応
---
$ git push -f # プッシュ済みの履歴を置き換えるので -f を付ける
originの最新developに単純マージ出来るようにする(fast-forward)
作業ブランチで作業を行っている間に、ブランチ作成元のdevelopでは、
他のコミットがマージされていることが有る。
この時、originの最新developを作業ブランチにマージする必要が有るが、
コミット履歴をシンプルに出来るという点で、rebaseを使用する。
$ git checkout develop # ブランチ作成元(develop)をチェックアウト
$ git fetch # originの最新状態を取得する
$ git branch # ブランチの一覧を表示する
$ git checkout feature/<ブランチ名> # 作業ブランチに切り替える
$ git rebase origin/develop # origin/develop を指定する。
rebaseでは、コミット履歴を辿ってコンフリクトを解消していく。
修正箇所にコンフリクトが発生した場合。
以下のようなメッセージが表示されるので、そのファイルを修正する。
CONFLICT (content): Merge conflict in <filename>
$ git add * # 修正したファイルをステージング
$ git rebase --continue # rebaseでのコミット
コンフリクトが無くなればrebaseモードから抜ける。
rebaseを中止する場合は以下を実行。(rebase前の状態に戻る)
$ git rebase --abort