投稿目的
- 現場での対応の備忘録 兼 Git初心者への情報共有
- 「ふわっとした理解」を「ぷにっとした理解」くらいに固める
- 有識者からご指摘をいただく
本記事について
現場に配属されてからというもの、Gitを用いて時空操作
することがたびたびありました (Gitでやらかした際に対処する経験を積ませていただきました)。
その時の備忘録 兼 Git初心者の方への知識共有として、本記事を執筆します。
※VSCode & Git Graphを使用しています。
事例紹介「コミットメッセージを間違えた...」
あっ...コミットメッセージに日付を入れるの忘れてpushしてた...
上記
2023/11/20
ブランチ(ピンクのブランチ)のコミットメッセージについて、
- 正 : [日付] コミット内容
- 誤 : コミット内容(今の内容)
解決策① git commit --amend
コマンドを使う
最初に「Git コミットメッセージ 変更」でググると先頭に出てくるこのコマンド。直前のコミットを変更 できるみたいですね。
いったんターミナルでgit commit --amend
を実行してみます。
何やら仰々しい画面が出てきました...
これは「Vim(Wikipedia)」というテキストエディタです。
ログインページ タイトルとテスト修正
を編集して、「2023/11/20 ログインページ タイトル文言とテスト修正」に書き換えます。
しかし、back spaceが効かない、、だと、、、
という状況になってしまいます。Vimエディタの仕様ですね。
私の場合、
- Vimエディタ特有の操作知識が求められる
- 「Vi(Wikipedia)」ちゃんを愛している
- 直前のコミットしかコメントを変えられない
ためgit commit --amend
兄貴とは疎遠です。:q
でさよならします...
解決策② コミット内容の退避→取り込みを繰り返す
(1)git reset --soft HEAD^
このコマンドは、先頭のコミットを取り消して、ファイルをステージングした状態に戻すコマンドです。
この状態でgit reset --soft HEAD^
してみると...
コミットが取り消された && 変更したファイルがステージングされています。
(2)git stash
このコマンドは、コミットしていない変更を、いったん退避させる
コマンドです。
(1)のgit reset --soft HEAD^
をした状態でgit stash
してみると...
緑色の部分に、ステージングされていたファイルがまとめられています。
彼らはコミットされたわけではないのでご安心を。
(3) (1)(2)を繰り返す
今回の場合、コミットメッセージを間違えたコミットは3つです。今はまだそのうちの1つにしか到達できていません。
なので、戻したいコミット分だけ(1)(2)を繰り返していきましょう。
全部やった後がこちら。
(4)git stash apply 'stash@{[適用したいstashのインデックス]}'
とコミットメッセージ修正
あとは、退避させた変更をコミットメッセージを修正した状態で適用すればOKです。
そのために、git stash apply 'stash@{0}'
すると...
インデックス0の内容が適用されています!
あとはコミットメッセージを修正してステージング、「Commit」ボタンを押下すると...
修正できました! 今回適用したstashはもう使わないので、git stash drop 'stash@{0}'
で削除しておきましょう~
あとはこの(4)の内容を繰り返していくと...
無事コミットメッセージを修正できました!!
※stash
のインデックスは、「一番最近stash
されたものが0」になります。変化しているかもしれないので、git stash apply
前にインデックスを確認しましょう。
※現場ではstash@{0}
でstashの適用・削除が可能でしたが、家だと'stash@{0}'
とシングルクオートが必要でした。
→PowerShellを使っている場合に{0}
が式だと認識される影響のようですね~ ※エンジニ屋 TFUMIAKI様 (外部リンク)
(5)git push -f origin [修正後のブランチ名]
あとはpushすれば時空操作
完了です!
しかし、この状態でgit push origin 2023/11/20
をすると...
エラーが発生します...
「君はリモートにいる2023/11/20
君ではないでしょ」とGitが伝えてくれていますね。
なので、git push -f origin 2023/11/20 (force push)
すると...
今度はpushできました!!
リモートの方でコミットメッセージを確認します。ばっちりですね!
これにて時空操作
完了です。
※git push -f
は、今までのコミットを消してしまう可能性があります。ほかの人との共有ブランチなどでは、git pull origin [ブランチ名]
→git push origin [ブランチ名]
しましょうね。
※私は先輩のコミットを削除してしまったことがありました...申し訳ございません...
解決策③ ブランチを新しく作る
個人的には解決策③が好きです。
(1)ブランチの根元でgit checkout -b [新しいブランチ]
今回の場合は
-
git checkout a72ca537dd6f3e7e107caa6f2ba99c090b37ea75
で根元に移動 -
git checkout -b 2023/11/20_new
で新ブランチ作成 (名前が被っているとNG)
(2) git cherry-pick [盗みたいコミットのハッシュ値]
さて、2023/11/20_new
ブランチに現在います。
このブランチに、2023/11/20
ブランチの「ログインページ タイトル追加」のコミットを持ってきたいです。
その時に用いるのがgit cherry-pick
コマンド。
ターミナルで、git cherry-pick aec3178b630c381d2351c206bc97d6c5e5306b54
を実行すると...
狙い通り、「ログインページ タイトル追加」のコミットを盗めました!
(3) git reset --soft HEAD^
盗めたはいいものの、コミットメッセージを更新できていません...
もう一度コメントを追加してコミットするため、git reset --soft HEAD^
を実行します。
すると...
ステージング状態に戻せました。
これで、コメントメッセージを更新してコミットすれば正しいコミットメッセージ && コミット内容を実現できますね!
↑「Commit」ボタンを押下すると...
コミットメッセージを正しく修正できました!
後は、(1)~(3)を繰り返していきます。
大変ですが、混乱して変なブランチを爆誕させるよりはいいかと...
なお、後から修正はできますが
- コミットのハッシュ値間違い
- コミットメッセージ間違い
(4)git branch -m [修正後のブランチ名]
全てのコミットで、正しいコミットメッセージ && コミット内容を実現できました!
あとはブランチの名称を修正しpushすれば完璧です。
2023/11/20_new
を2023/11/20
としてpushしたい
いったん、2023/11/20
に移動し、ブランチ名を変更しましょう。
この状態で、git branch -m 2023/11/20_old
を実行すると...
ブランチ名が変更されました!
そして、再び2023/11/20_new
に移動し、git branch -m 2023/11/20
を実行すると...
もともと2023/11/20_new
であったブランチを2023/11/20
として扱えるようになりました!!
(5)git push -f origin [修正後のブランチ名]
まとめ
// 今いるブランチの先頭のコミットを、git addした状態に戻せるよ
git reset --soft HEAD^
// まだコミットしていない変更を退避できるよ
git stash
// 退避したファイルを適用できるよ
git stash apply 'stash@{[stashのインデックス]}'
// 退避したファイルを削除できるよ
git stash drop 'stash@{[stashのインデックス]}'
// 指定したコミットIDのコミット内容を持ってこれるよ
git cherry-pick [コミットID]
// 今いるブランチの名前を変えられるよ
git branch -m [新しい名称]
// 時空を歪めたブランチをもう一度originにpushできるよ(使い方注意)
git push -f origin [ブランチ名]
最後に
Git Graph様は最高です。VSCode民の皆様はぜひご活用ください。
間違いやGitに関する武勇伝などございましたら、コメントいただけますと幸いです!
今後は、最近勉強しているNext.js/Reactの内容を中心に執筆しようと思います~