はじめに
git による開発をしていた時に、困った事例とその対応策についてまとめてみました。
困った事例
現在ブランチでの変更をコミットしていないので、ブランチ移動が出来ない
問題
現在ブランチでの変更をコミットせずに他のブランチに移ろうとすると、
以下エラーによりブランチ移動ができない。
$ git checkout master error: Your local changes to the following files would be overwritten by checkout: test.txt Please commit your changes or stash them before you switch branches. Aborting
解決策
stash コマンドで、コミットしていない変更を一時的に保存しましょう。
コメントは書いても書かなくてもいいですが、後で戻すことを考えると絶対にあった方がいいです。
$ git stash save {{好きなコメント}} $ git stash list //確認用
e.g.
$ git branch * feature/hoge $ git stash save tmp $ git stash list stash@{0}: On hoge: tmp
Tips
① 以下コマンドで一時的に保存した変更を元に戻せます。
$ git stash list $ git stash apply {{stash list の番号}}
e.g.
$ git stash list stash@{0}: On hoge: tmp $ git stash apply 0
n 個前のコミットを修正したい
問題
n 個前のコミットの変更内容が間違っていたので、さかのぼって修正したい。
解決策
① rebase コマンドを実行し、テキストエディタにより修正する過去コミットを選択します。(このエディタ内でコミット内容を修正できるわけではありません。)
各コミットを pick から edit に変更することで、そのコミットが修正対象となります。
エディタでの編集を保存すると、実際にコミット内容の修正へと遷移します。
$ git rebase -i HEAD~{{さかのぼりたいコミット数}} === pick {{コミットID}} {{コミットメッセージ}} → edit {{コミットID}} {{コミットメッセージ}} //さかのぼりたいコミットを pick から edit に変更する (省略) ===
e.g.
$ git rebase -i HEAD~2 === pick 1f52419 commit1 → edit pick 1f52419 commit1 pick 48c680f commit2 ===
② reset コマンドによって、作業ディレクトリの状態を巻き戻します。
--mixed
オプションを付けることで、add する直前の状態に戻ることが可能です。
$ git reset --mixed HEAD^
③修正が完了したら、再度 add → commit を行います。
この時、複数回コミットして、コミット内容を分割することも可能です。
$ git add {{ファイル名}} $ git commit -m {{コミットメッセージ}}
④すべての修正が完了したら、rebase コマンドを実施します。
$ git rebase --continue Successfully rebased and updated xxx. ↑これが出れば、全修正が完了したことになります。
※ ①で複数コミットを対象とした場合(= 複数コミットを pick から edit に変更した場合)は、②~④を複数コミット分繰り返す必要があります。
まとめ
もっと困ったことがたくさんあった気がするのですが、まとめようと思ったら意外と思いつかなかったです。
また困ったら追記していきます。
菅谷 歩 (記事一覧)