質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

GitLab

GitLabは Gitoliteをブラウザから管理できるようにする Rubyアプリケーションで、 GitHubのようなサービスをクローズドな環境に独自で構築できるように 公開されたものです。

Q&A

2回答

419閲覧

リベースで特定のコミットのみまとめず残したい

ruuuu

総合スコア176

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

GitLab

GitLabは Gitoliteをブラウザから管理できるようにする Rubyアプリケーションで、 GitHubのようなサービスをクローズドな環境に独自で構築できるように 公開されたものです。

0グッド

0クリップ

投稿2024/04/30 02:23

以下にコミット履歴が4つありますが、このうち最初の3つの中から1番上のコミットと3番目のコミットをリベースでまとめたいと考えています。

commit 822 (HEAD -> feature/test-1) コード整形 commit a87 (origin/feature/test-1) Merge: 0105cc8 603d1ec Merge branch 'develop' of test.git.backlog.com:/test/test into feature/test-1 commit 010 ログイン画面の実装 commit 603d (origin/develop, origin/HEAD) APIの実装

今までは、git rebase -i developとして開いたエディターから一番上のみpickとして後は、squashすることで一つにまとめていましたが、真ん中ののコミットのみまとめない場合どうすれば良いでしょうか。
どなたかご助言頂けましたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bsdfan

2024/05/01 14:40

パッと見だけですが、ログにある2番目のコミットは、3番目のコミットに、4番目のコミットをマージしたときのコミットなのではないですか? だとすると、勘違いか思い込みで間違ったことやろうとしているように思います。 (別質問にあるプルリクのためでしたら、このようなことをやる意味はほとんどないでしょう)
guest

回答2

0

(コミットの編集内容に衝突がなければ)git rebase -i 時の行入れ替えにより、コミット順序の並べ替えができます

順序並べ替えの実行例

$ git log --oneline

ddddddd (HEAD) commit4 ccccccc commit3 bbbbbbb commit2 aaaaaaa commit1

$ git rebase -i head~4

rebase内容:before

1pick aaaaaaa commit1 2pick bbbbbbb commit2 3pick ccccccc commit3 4pick ddddddd commit4

rebase内容:after

1pick aaaaaaa commit1 2pick ccccccc commit3 3pick bbbbbbb commit2 4pick ddddddd commit4

$ git log --oneline

hhhhhhh (HEAD) commit4 ggggggg commit2 fffffff commit3 eeeeeee commit1

順序並べ替え&squashをまとめて実行もできます例

$ git log --oneline

ddddddd (HEAD) commit4 ccccccc commit3 bbbbbbb commit2 aaaaaaa commit1

$ git rebase -i head~4

rebase内容:before

1pick aaaaaaa commit1 2pick bbbbbbb commit2 3pick ccccccc commit3 4pick ddddddd commit4

rebase内容:after

1pick aaaaaaa commit1 2s ccccccc commit3 3pick bbbbbbb commit2 4pick ddddddd commit4

$ git log --oneline

kkkkkkk (HEAD) commit4 jjjjjjj commit2 iiiiiii commit1 & 3

(2024/05/07 10:35頃追記)

マージコミットを履歴グラフに残したい場合

$ git rebase --rebase-merges -i head~4

※ここでlabel等がたくさんある一見複雑な編集内容が表示されますが
実際にやる内容は前述の『順序並べ替え&squashをまとめて実行』と同様に

  1. squashしたいcommit3 の行を commit1 の行の直下に移動
  2. picks(squash)に変える

この2つだけです。
それ以外はそのまま変更せずに、通常通り保存→エディタ終了で、マージを含まない場合と同様にリベースが進行します。

投稿2024/05/01 07:51

編集2024/05/07 01:36
pecmm

総合スコア612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2024/05/01 12:34 編集

質問では2番目のコミットがマージコミットのようなんですが、その場合もgit rebase -iでコミットの順序を入れ替えられるのでしょうか。私の回答では、自信がなかったので遠回りなやり方をしています。
ruuuu

2024/05/07 00:46

ご回答ありがとうございます。 以下の方法でコミットをまとめられればベストなようにも思えますが、一度テスト用のブランチを作り検証してみます。 pick aaaaaaa commit1 s ccccccc commit3 pick bbbbbbb commit2 pick ddddddd commit4
pecmm

2024/05/07 01:24

すみませんマージコミットの件、完全に見落としておりました… マージしたコミットグラフを残したい場合は `--rebase-merge` オプションが必要になります。 これを付けないと、マージした変更内容自体は残りますが、履歴のグラフからマージコミットが辿れなくなります。 グラフを残したい場合の手順は回答本文に追記します
guest

0

  1. commit 822 (HEAD -> feature/test-1)
  2. commit a87 (origin/feature/test-1)
    Merge: 0105cc8 603d1ec
  3. commit 010

ここから1.と3.をまとめるのですね。

一時的な作業用のブランチを作成して途中のコミットを移動させればできるのではないでしょうか。

git checkout -b tmp 010 # コミット3.を先頭に持つブランチtmpを作成 git cherry-pick 822 # コミット1.を持ってくる git rebase -i HEAD~2 # ここで、コミット1.と3.をsquashする

この時点でtmpブランチは、先頭に元のコミット1.と3.が squashされたものがあるがマージコミット2.を含まない状態になります。その後、

git checkout feature/test-1 # 作業ブランチに戻る git reset --hard HEAD~2 # コミット1.とマージコミット2.を消す git rebase tmp # 元のコミット1.と3.をまとめたものを持ってくる git merge --no-ff develop # マージをやりなおす git branch -D tmp # 変更が終わればtmpブランチは不要なので削除する

で、次の結果になると思います。

  1. commit YYY (HEAD -> feature/test-1)
    Merge: XXXXXXX 603d1ec
  2. commit XXX (元の1.と3.)

おかしいところがあったら指摘ください (なお、ブランチのバックアップをとってから試すことをお勧めします)。

投稿2024/04/30 11:36

編集2024/04/30 22:08
ikedas

総合スコア4441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruuuu

2024/05/07 00:43

ご丁寧にありがとうございます。 安全に行おうとした場合、少々手順を踏む必要があるということですね。 別回答で頂きましたが、そもそもプルする際にrebaseを行うことが無難なようなですので、そちらの方法を検討してみたいと思います。
ruuuu

2024/05/07 00:44 編集

また、rebaseについては理解が曖昧な為、また調べた後に別途質問を立てさせて頂こうとも考えております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問