gitで困ったことまとめ

記事タイトルとURLをコピーする

f:id:swx-sugaya:20210914182236p:plain

はじめに

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 コマンドによって、add コマンドを実施する前の状態に作業ディレクトリを巻き戻します。
--mixed コマンドの場合、作業ディレクトリで行った過去の変更までリセットされるわけではないので安心してください。

$ git reset --mixed HEAD^

③修正が完了したら、再度 add → commit を行います。
この時、複数回コミットして、コミット内容を分割することも可能です。

$ git add {{ファイル名}}
$ git commit -m {{コミットメッセージ}}

④すべての修正が完了したら、rebase コマンドを実施します。

$ git rebase --continue
Successfully rebased and updated xxx.
↑これが出れば、全修正が完了したことになります。

※ ①で複数コミットを対象とした場合(= 複数コミットを pick から edit に変更した場合)は、②~④を複数コミット分繰り返す必要があります。

まとめ

もっと困ったことがたくさんあった気がするのですが、まとめようと思ったら意外と思いつかなかったです。

また困ったら追記していきます。

菅谷 歩 (記事一覧)