Gitで作業履歴を記録する際に、自分がやっている手順をまとめました。
前提
変更内容は、GUIツール(SourceTree)で確認してからコマンドを叩いています(GUIの方が差分が見やすいため)。
git diffで確認するようになりました。
通常フロー
手順 | コマンド | ステータス(更新ファイルの場所) | なぜそれをするのか |
---|---|---|---|
作業ブランチ確認 | git branch | - | 正しいブランチで作業をするため。特にブランチを新規に作成する場合、元となるブランチを間違えると後々面倒になる。 |
(必要に応じて)ブランチ切り替え | git checkout (-b) [ブランチ名] | - | 上に同じ。 |
(必要に応じて)リモートから取得 | git pull origin | - | 他の人の変更をローカルリポジトリに取り込み、競合を防ぐため。 |
ファイル編集(追加、削除含む) | - | 作業ディレクトリ | - |
ファイルステータス確認 | git status | 作業ディレクトリ | 変更したファイル名を確認するため。カレントブランチも確認できる。 |
変更点確認 | git diff | 作業ディレクトリ | 変更した内容を確認するため。間違って不要な箇所を変更していないか、など。 |
コミットにまとめたいファイルをステージングエリアへ | git add [ファイル名/ディレクトリ名/--all/-A] | ステージングエリア | コミットの対象にするものとしないものとを分けるため。 |
ファイルステータス確認 | git status | ステージングエリア | ファイルが過不足なくコミットの対象になっているかを確認するため。 |
コミット | git commit -m "[コミットコメント]" | Gitディレクトリ | 変更を履歴に残すため。 |
コミット確認 | git log --oneline | - | コミットログを確認。コメントが間違っていないかなど。間違っていたら、git commit --amendやgit resetでやり直せる(今なら)。 |
リモートにプッシュ | git push origin [ブランチ名] | - | 他の人が変更を取り込めるようにするため。 |
- add, commit, pushで、ステータスが切り替わる。
マージについて
ローカルとリモートのどちらでマージするかによって、手順が変わる。
A) ローカルでマージをする場合
- プッシュする前にマージ先のブランチに移動(=git checkout [ブランチ名])。
- 取り込みたいブランチをマージする(=git merge [取り込みたいブランチ名])。
- マージ先、マージ元両方のブランチをプッシュする(=git push origin [ブランチ名])。
B) リモートでマージする場合
- 変更したブランチをプッシュ後、リモートでマージしたいブランチに対してプルリクエストを作成する。
- リモートでマージする。
- ローカルでマージ先のブランチに切り替え(=git checkout [ブランチ名])、プルする(=git pull)。
コンフリクトの解決について
どちらかのファイルを正とする場合(ファイル内の差分を見て1つずつ反映させる必要がない場合)は、以下のコマンドで対応できる。
git checkout --theirs [fileName] ・・・ 相手のブランチ(マージした側)を正とする
git checkout --ours [fileName] ・・・ 自分のブランチ(マージされた側)を正とする
やり直したい場合
目的 | コマンド | どうなるか | 意味 |
---|---|---|---|
マージ、プルをなかったことにしたい | git reset --hard ORIG_HEAD | マージ前の状態に戻る | git merge, git pullの取り消し |
特定のファイルの修正を取りやめたい | git checkout [ファイル名] | 指定ファイルだけ最後のコミットの状態に戻る | 変更内容の破棄 |
すべてのファイルの修正を取りやめたい | git reset --hard HEAD | 最後のコミットの状態に戻る | 変更内容の破棄 |
新規に追加したファイルを削除したい | git clean -f | 削除される | 追跡対象外のファイルの削除 |
特定のファイルを特定のコミットの状態に戻したい | git checkout [コミットID] [ファイル名] | 指定ファイルだけ指定したコミットの状態に戻る | ファイルの置き換え |
すべてのファイルを特定のコミットの状態に戻したい | git checkout [コミットID] | 指定したコミットの状態に戻る | ファイルの置き換え |
ステージ済みファイルを戻したい | git reset HEAD | 変更内容が作業ディレクトリに戻る | git addの取り消し |
コミットをなかったことにしたい(変更内容は残す) | git reset HEAD^ | コミットがなくなる、変更内容は作業ディレクトリに残る | git commitの取り消し |
コミットをなかったことにしたい(変更内容も破棄する) | git reset --hard HEAD^ | 1つ前のコミットの状態に戻る | git commitの取り消し、変更内容の破棄 |
コミットの内容を変更したい | 変更したい内容をgit add して、git commit --amend | 直前のコミットに変更内容が追加される | git commitの変更 |
コミットコメントを変更したい | git commit --amend "コミットコメント" | 直前のコミットコメントが変更される | git commitの変更 |
プッシュをなかったことにしたい | git revert [打ち消したいコミットID], git push origin [ブランチ名] | 指定したコミットを打ち消す内容のコミットが作成され、リモートに反映される | git commitの打ち消し |
ブランチを削除したい | git branch -d(-D) [ブランチ名] | ブランチがなくなる | git branchの取り消し |
- git reset=HEADの位置を指定したコミットに移動させることで、変更をなかったことにできる
- Windowsのコマンドラインでは、
git reset HEAD^
が認識されない。git reset "HEAD^"
のように、HEAD^をダブルクォーテーションで囲うと認識される。 - pushの取り消しは、resetで履歴を消すのではなく、revertで打ち消した履歴を残す方が推奨されている。一人プロジェクトの場合は、
git reset --hard HEAD^
で取り消した内容を、git push -f origin [ブランチ名]
で強制的にpushする方法もある。 - 上記例では、1つ前のコミットに戻すことを想定し、HEAD^と指定している。状況に応じて、コミットIDを指定したり、HEAD^^(2つ前のコミット)といった指定が必要。