間違えたブランチで作業し始めてしまった時の対処法「$git stash」。
又、git stashやcheckoutができなくなった時の対処法。
#本記事の狙い
gitで躓いたことを自分用に記録してゆきます。
#問題
間違えて統合ブランチで作業を始めちゃった。。。
ブランチを切り替えようと
$git stash
すると
app/views/layouts/application.html.erb: needs merge
と言われstashできなかった。
#解決方法
###git stashで一時保存する。
以下で$git stashとはなんぞやを説明しています。
知っている方は下記手順まで。
$git stash
を実行することでステージングされている・いないデータを
別の場所でそれぞれ一時保管しておける。
ただし、以下は stash されない。
・まだステージングされていない作業コピー内の新しいファイル
・無視されたファイル(gitignoreに記述されたファイル)
▼参考:作業コピーの位置づけ(スライド15p)
https://www.slideshare.net/yoshinoriyamanouchi12/git-79086120
stash後にcheckoutやその他git操作が行える。
checkoutして本来居たかったブランチに移り
$git stash pop
でstash から変更が削除され、現在のにブランチに再適用される。
又
$git stash apply
を使用してその変更を stash に維持することも可能。
※stash は作業しているローカルの Git リポジトリにのみ適用される。
プッシュ時にサーバーには転送されない。
▼参考:stashについて
https://www.atlassian.com/ja/git/tutorials/saving-changes/git-stash
▼参考:リモート追跡ブランチについて
https://qiita.com/uasi/items/69368c17c79e99aaddbf
#手順
$git status
で問題を特定します。
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: (コンフリクトが起きているファイル)
=>エディターでコンフリクト箇所を修正し、保存。
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
(変更されているがステージング($git add (ファイル名))されていないファイル)
=>コンフリクト修正したファイルもろともステージング
この状態で
$git stash
$git checkout (行きたいファイル)
#git stashの使い方
###$git stash
一時的に作業した内容を保存。
###$git checkout (branch名)
お望みのブランチ(branch名)へ移動。
###$git stash pop
stash前の状態に戻す。
$git stash
$git checkout
$git pop
を行うとcheckout前の状態をcheckout後のブランチへ反映させるため、
コンフリクトが起きます。
またコンフリクトを解消し、ステージング($git add (ファイル名))すれば
checkout、もしくはstash等操作ができる状態になります。
###$git stash apply
お望みのブランチ(branch名)にstashした内容を反映。
因みに…
###$git stash list
stash 中の内容が見れる。
$ git stash list --date=local
とすることで作成日時を表示できる。
###$git stash apply stash@{2}
で望んだstashのみ反映させられる。
▼参考
https://gist.github.com/koudaiii/526707492ebc5915596e
https://ccbaxy.xyz/blog/2020/03/20/ruby33/