はじめに
腰を据えて勉強してこなかったGitに、入社後速攻でつまづいてしまったのでブランチ操作について勉強しました。
基本的な操作(checkout、add、commit、push)は出来る状態だったのですが、コンフリクトの解消や誤った操作の取り消し方法が分からなかったのでその辺りを中心にまとめます。
前提知識
そもそも私はここを全然理解せずに触っていた(危険)。
-
Gitとはバージョン管理をするためのもの
- どのファイルが最新なのか、誰が編集したのか、どんな変更を行なったかの履歴を残す
- チーム内で同時編集した場合に先に編集した人の変更内容が消えることを防ぐ
-
Github上にファイルをUPする際に、ローカルでcommit/pushをする意味
- 自分が作業しているディレクトリを「ワークツリー」と呼ぶ
- commitはローカルリポジトリに直接状態を記録するのではなく、その間に設けられた「インデックス」に状態を記録する
- これがcommitコマンドで行われていること
- インデックスを間に挟むことで必要なファイルのみローカルリポジトリにコミットできる
- つまり「ワークツリー」→→add→→「インデックス」→→commit→→「ローカルリポジトリ」→→push→→「リモートリポジトリ」
コンフリクトが起きそう/起きた時
作業が遅い分、自分が作業している間にリモートリポジトリの状態が進んでしまうことは多い
- mainブランチに戻ってリモートブランチをpull
- 作業していたブランチに戻ってmainブランチをpull(ここ忘れがち!)
- コマンド:
git pull プル先のリモートリポジトリ名 プルするブランチ名
- プル先は「origin」という名称のことが多い
- コマンド:
- この時にエラーになるはずなので、ここでコンフリクトを解消する
-
マージ時のオプション選択で迷ったら以下記事を参照すると良さそう
https://qiita.com/tearoom6/items/0237080aaf2ad46b1963 -
大抵の場合は
git config pull.rebase false
で良いと思っている
-
直前のコミットを取り消したい時
- 作業したファイルは残したい&ステージングも取り消したい
git reset --soft HEAD^
(これが一番使う) - 作業したファイルは残したい
git reset --mixed HEAD^
- 作業したファイルごと消したい
git reset --hard HEAD^
(これはあまり無さそう)- 直前のコミットなのでキャレット
^
は1個だが、数を増やすと取り消す数を指定できる - 数の指定方法も色々ある
- 「
HEAD^^^
とHEAD~3
とHEAD~~~
とHEAD~{3}
と@^^^
は同じ意味」(以下記事参照)
- 「
- 直前のコミットなのでキャレット
コミットメッセージを修正したい時
「ルール通りにコミットメッセージを作成していない!」と気付いた時の対処法
- コミットを取り消さなくてもメッセージだけ書き換えられる
- これを使えば直前のコミット漏れしたファイルを後から追加することも可能
- amendオプションを指定してコミットを行う
git commit --amend
- ファイルを修正
git add 修正したファイル名
-
git commit --amend
(修正したいファイルがないときはここから実施) - エディタが表示されるのでコミットメッセージを変更して終了
-
git log
で履歴を見ると綺麗に修正されているはず=修正履歴が残らない
〜修正したいメッセージが複数ある/直前のコミットメッセージではない場合〜
-
git rebase -i
を使用する-
git log
でコミット履歴を確認、修正したいコミットのうち一番古いもののコミット番号を確認 -
git rebase -i 該当のコミット番号
- 表示されるエディタで修正したいコミットの「pick」を「edit」に書き換え、エディタを閉じる
-
git commit --amend -m 正しいコミットメッセージ
- 複数editにした場合は古いコミットから順に表示されるので、修正したい内容の正しいコミットメッセージをここで入力する
-
git rebase --continue
- 複数editにした場合はこのコマンドで次の修正ポイントに飛ぶ、全て修正完了していればこれで完了
-
〜push後だった場合〜
- push後だった場合、上記作業のみではリモートリポジトリは変更前の状態のままなので
git push -f
(強制プッシュ)を行う
PR出す準備中に修正点に気付いた時
- 基本的には、再度ファイルを修正してリモートリポジトリにpushすれば良い
- コミット履歴をどうしても綺麗にしたい場合は
rebase
を使用する
その他
他にも色々あったので実際に使う場面が出てきたら追記していきます
- 他ブランチの作業を取り込む
cherry-pick
- 散乱したコミットをまとめる
rebase -i ~~~
参考