LoginSignup
0
0

【Git】プッシュしたいブランチに既に別のコミットがプッシュされていた際にやったこと

Last updated at Posted at 2023-12-17

タイトルの問題を解決する際に行なったことをまとめます.
類似の問題が発生した際の参考としていただけると幸いです.

投稿主はGitの経験が浅いため,本記事で紹介する内容は不正確,または遠回りなものである可能性があります.

問題の詳細

Screenshot 2023-12-17 at 14.34.36.png

コミット2を基にコミットAをローカルで作成したが,いざリモートにプッシュしようとするとコミット2から派生したコミットBが既にプッシュされていた,という問題です.

解決の形

コミットBを取り消すことは望ましくなかったため,コミットAでの変更をコミットBに反映することで解消する,ということを解決の形としました.

なお,コミットAとコミットBで扱うファイル数は同じ,コミットA-コミットB間で名称が異なるファイルは存在しないものとします.

実際に行なったこと

1. コミットAの内容をスタッシュに保存する

コミットAの内容をスタッシュに保存します.

コミットAの内容をスタッシュに保存

# コミットAの内容をスタッシュに保存
$ git stash

# コミットAの内容をスタッシュに保存(新規作成ファイルも保存する場合)
$ git stash -u

# スタッシュへの保存を確認
$ git stash list

スタッシュへの保存を確認したら,コミットAのあるブランチに移動します.

$ git checkout [コミットAのあるローカルブランチ名] 

2. リモートの最新コミットBの内容をローカルに持ってくる

コミットAの内容をリセットしてコミット2の状態(コミットAをコミットしていない状態)に戻します.

コミットAをリセット

こうすることで,コミットBの内容をローカルにプルすることが可能となります.

# コミットAをリセット
$ git reset --hard [コミットAのハッシュ値]

続いて,コミットBの内容をローカルに反映します.反映先は先ほどリセットコマンドで戻ったコミット2になります.

# コミットBをプル
$ git pull [リモートリポジトリURL] [コミットBのあるリモートブランチ名]

3. スタッシュをコミットBにマージする

ここまででローカルにもコミットBが反映された状態となるので,ローカルのコミットBに先ほど保存したスタッシュの内容をマージします.

ローカルにコミットBが反映された状態

# スタッシュの内容をローカルのコミットBにマージ
$ git merge stash

コミットBにマージしてできたコミットをコミットCとします.

4. マージ後のコミットCをリモートにプッシュする

スタッシュマージ後

これでローカルの最新コミットであるコミットCは,コミットBから派生し,かつコミットAの変更を反映したコミットであるため,リモートのコミットBの先にプッシュすることが可能です.

このコミットCをリモートにプッシュします.

$ git push [リモートリポジトリのURL] [コミットCのあるローカルブランチ名]

以上で,求める解決の形が実現できました!

0
0
0

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
0
0