はじめに
この記事は、プログラミングを学んでいる初心者が書いた記事になります。
Git操作で躓いた部分をまとめてみました。
git cherry-pickを使うに至ったシナリオ
私は最近、作業ブランチ(feature/active-storage)での修正を別ブランチ(develop)に反映する必要があり、git cherry-pick を使いました。
シナリオの詳細
個人開発ですが、以下のようにdevelopブランチを用いた運用で開発を行っていました。developブランチにはcoderabbitを住まわせ、AIによるコードレビューを行っていました。
mainブランチ (本番環境)
↑
developブランチ(coderabbitによるコードレビュー)
↑
機能開発(feature)ブランチ(今回はfeature/active-storageブランチ)
ローカルにて、
feature/active-storageブランチをpushし、develop ← feature/active-storageのプルリク提出。
その後、AIによるレビューの指摘事項を修正し、commit、push、mergeして終了のところをpushし忘れそのままmergeしてしまいました。
つまりcommit内容が反映されないままmergeさせてしまいました。
さらにはそのままリモートのfeature/active-storageブランチを削除してしまいました。
理想
現実:commitをpushし忘れ
pushし忘れに気づいた後
慌ててdeleteしたリモートのfeature/active-storageブランチをrestoreし、pushしましたが、
❯ git commit -m 'fix: coderabbit指摘事項修正'
[feature/active-storage 7f93fd0] fix: coderabbit指摘事項修正
3 files changed, 4 insertions(+), 4 deletions(-)
❯ git push origin feature/active-storage
Enumerating objects: 21, done.
Counting objects: 100% (21/21), done.
Delta compression using up to 8 threads
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 985 bytes | 985.00 KiB/s, done.
Total 11 (delta 9), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (9/9), completed with 9 local objects.
To github.com:tantp-1111/mini_memory.git
16100ac..7f93fd0 feature/active-storage -> feature/active-storage
merge後にpushされたcommitは、そのプルリクには自動では紐づかないようです。(上記のログを見ると問題なくpushできてそうに見えるのですが。)
やりたいこと
もうdevelop ← feature/active-storageのプルリクは閉じてしまったので、main ← developのプルリクにcommit内容(ID: 7f93fd0)を取り込ませようと考えました。
つまりやりたいことは
ローカルのfeature/active-storageブランチのcommit(ID: 7f93fd0)をdevelopブランチに適用することです。
commitを別ブランチ(developブランチ)に適用する手順
commitを取り込みたいブランチ(developブランチ)に移動します。
git checkout develop
ブランチを最新にします。
git pull origin develop
該当するcommitを今いるdevelopブランチに適用します。
git cherry-pick 7f93fd0
コンフリクトがあれば適宜修正します。
developブランチをpushし、developブランチのcommit内容としてプルリクにあげます。
git push origin develop
git stashとの違い
どちらも変更を移動するコマンドですが、内容は全く異なります。
git stashはコミットせずに作業途中の変更をセーブしたまま別のブランチに移動(退避)したい場合stashを使用します。
git stash
git stash list # セーブ内容を見れる
git stash pop <stash名> # 変更内容の復元
git stashは未コミットの変更を退避させる目的のため使用しますので、git cherry-pickとは使用用途が異なります。
| コマンド | 内容 | 目的 |
|---|---|---|
| git stash | 未コミットの変更 | 作業中断・一時退避 |
| git cherry-pick | すでにあるコミット | 別ブランチに取り込む |
参考