LoginSignup
45
43

投稿目的

  • 現場での対応の備忘録 兼 Git初心者への情報共有
  • 「ふわっとした理解」を「ぷにっとした理解」くらいに固める
  • 有識者からご指摘をいただく

本記事について

現場に配属されてからというもの、Gitを用いて時空操作することがたびたびありました (Gitでやらかした際に対処する経験を積ませていただきました)。
その時の備忘録 兼 Git初心者の方への知識共有として、本記事を執筆します。
※VSCode & Git Graphを使用しています。

事例紹介「コミットメッセージを間違えた...」

あっ...コミットメッセージに日付を入れるの忘れてpushしてた...
image.png

上記2023/11/20ブランチ(ピンクのブランチ)のコミットメッセージについて、

  • 正 : [日付] コミット内容
  • 誤 : コミット内容(今の内容)

解決策① git commit --amendコマンドを使う

最初に「Git コミットメッセージ 変更」でググると先頭に出てくるこのコマンド。直前のコミットを変更 できるみたいですね。
いったんターミナルでgit commit --amendを実行してみます。
image.png
何やら仰々しい画面が出てきました...
これは「Vim(Wikipedia)」というテキストエディタです。
ログインページ タイトルとテスト修正を編集して、「2023/11/20 ログインページ タイトル文言とテスト修正」に書き換えます。
しかし、back spaceが効かない、、だと、、、という状況になってしまいます。Vimエディタの仕様ですね。

私の場合、

  • Vimエディタ特有の操作知識が求められる
  • Vi(Wikipedia)」ちゃんを愛している
  • 直前のコミットしかコメントを変えられない

ためgit commit --amend兄貴とは疎遠です。:qでさよならします...

解決策② コミット内容の退避→取り込みを繰り返す

(1)git reset --soft HEAD^

このコマンドは、先頭のコミットを取り消して、ファイルをステージングした状態に戻すコマンドです。
image.png
この状態でgit reset --soft HEAD^してみると...
image.png
コミットが取り消された && 変更したファイルがステージングされています。

(2)git stash

このコマンドは、コミットしていない変更を、いったん退避させるコマンドです。
(1)のgit reset --soft HEAD^をした状態でgit stashしてみると...
image.png
緑色の部分に、ステージングされていたファイルがまとめられています。
彼らはコミットされたわけではないのでご安心を。

(3) (1)(2)を繰り返す

今回の場合、コミットメッセージを間違えたコミットは3つです。今はまだそのうちの1つにしか到達できていません。
なので、戻したいコミット分だけ(1)(2)を繰り返していきましょう。
全部やった後がこちら。
image.png

(4)git stash apply 'stash@{[適用したいstashのインデックス]}'とコミットメッセージ修正

あとは、退避させた変更をコミットメッセージを修正した状態で適用すればOKです。
そのために、git stash apply 'stash@{0}'すると...
image.png
インデックス0の内容が適用されています!
あとはコミットメッセージを修正してステージング、「Commit」ボタンを押下すると...
image.png
image.png
修正できました! 今回適用したstashはもう使わないので、git stash drop 'stash@{0}'で削除しておきましょう~
image.png

あとはこの(4)の内容を繰り返していくと...
image.png
無事コミットメッセージを修正できました!!

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をすると...
image.png
エラーが発生します...
「君はリモートにいる2023/11/20君ではないでしょ」とGitが伝えてくれていますね。
なので、git push -f origin 2023/11/20 (force push)すると...
image.png
今度はpushできました!!
リモートの方でコミットメッセージを確認します。ばっちりですね!
image.png
これにて時空操作完了です。

git push -fは、今までのコミットを消してしまう可能性があります。ほかの人との共有ブランチなどでは、git pull origin [ブランチ名]git push origin [ブランチ名]しましょうね。
※私は先輩のコミットを削除してしまったことがありました...申し訳ございません...

解決策③ ブランチを新しく作る

個人的には解決策③が好きです。

(1)ブランチの根元でgit checkout -b [新しいブランチ]

今回の場合は

  1. git checkout a72ca537dd6f3e7e107caa6f2ba99c090b37ea75で根元に移動
  2. git checkout -b 2023/11/20_newで新ブランチ作成 (名前が被っているとNG)
    image.png
(2) git cherry-pick [盗みたいコミットのハッシュ値]

さて、2023/11/20_newブランチに現在います。
このブランチに、2023/11/20ブランチの「ログインページ タイトル追加」のコミットを持ってきたいです。
その時に用いるのがgit cherry-pickコマンド。
ターミナルで、git cherry-pick aec3178b630c381d2351c206bc97d6c5e5306b54を実行すると...
image.png
狙い通り、「ログインページ タイトル追加」のコミットを盗めました!

(3) git reset --soft HEAD^

盗めたはいいものの、コミットメッセージを更新できていません...
もう一度コメントを追加してコミットするため、git reset --soft HEAD^を実行します。
すると...
image.png
ステージング状態に戻せました。
これで、コメントメッセージを更新してコミットすれば正しいコミットメッセージ && コミット内容を実現できますね!
image.png
↑「Commit」ボタンを押下すると...
image.png
コミットメッセージを正しく修正できました!

後は、(1)~(3)を繰り返していきます。
大変ですが、混乱して変なブランチを爆誕させるよりはいいかと...

なお、後から修正はできますが

  • コミットのハッシュ値間違い
  • コミットメッセージ間違い
には注意です!
(4)git branch -m [修正後のブランチ名]

image.png
全てのコミットで、正しいコミットメッセージ && コミット内容を実現できました!
あとはブランチの名称を修正しpushすれば完璧です。

2023/11/20_new2023/11/20としてpushしたい

いったん、2023/11/20に移動し、ブランチ名を変更しましょう。
image.png
この状態で、git branch -m 2023/11/20_oldを実行すると...
image.png
ブランチ名が変更されました!
そして、再び2023/11/20_newに移動し、git branch -m 2023/11/20を実行すると...
image.png
もともと2023/11/20_newであったブランチを2023/11/20として扱えるようになりました!!

(5)git push -f origin [修正後のブランチ名]

解決策②(5)と同じです。ばっちりですね!
image.png

まとめ

時空操作時に役立つコマンドたち
// 今いるブランチの先頭のコミットを、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の内容を中心に執筆しようと思います~

45
43
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
43