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

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

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

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

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

Q&A

解決済

2回答

2186閲覧

Gitでコミットをまとめたい

imocl

総合スコア13

SourceTree

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

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

0グッド

0クリップ

投稿2018/11/27 07:09

編集2018/11/28 01:49

イメージ説明
Gitでファストフォワードせずにマージしたブランチ上のコミットを、マージコミットとまとめたいです。
具体的には画像で2の緑のコミットと3の青のマージコミットは同じ内容のため、3にまとめて見た目上緑を消したいと思うのですが、後からそういったことは可能でしょうか?
緑のブランチは既に削除している状態です。
ローカルで起きていることで、リモートへはプッシュしていません。

色々調べて、
git rebase -i -p で1のコミットを指定してスカッシュなど試してみましたが、うまくいきません。

独学でGitを触り始めた超初心者です。
主にSourceTree上でGitを触っています。
よろしくお願いいたします。

###頂いた回答を試した結果
私の理解が不十分すぎるため、変なことをしていたらすみません。

>ikedasさん

  1. git rebase -i で1のマージコミットを指定
  2. 2のコミットをdropに指定

でやってみました。すると、
イメージ説明
このようになりました。
ここで緑になったコミットと上部の青のコミットは同じ内容です。

>tamotoさん
仮定通りの状況のため、
git rebase --onto 2のコミット 3のコミット
を行うと、
イメージ説明
このようになりました。
ここでも、上から4つの緑のコミットは青のコミットと同じ内容です。

>Meganezaruさん
5.のcherry pickで躓いてまだ試せていません、すみません(; ;)

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

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

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

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

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

ikedas

2018/11/27 09:16

git rebase -i で、squash以外にdropなどというのもありますが、試してみられましたか。
imocl

2018/11/28 01:59

ありがとうございます! squashとfixupしか見ていませんでした…drop試した結果を質問に追記しました。ご覧いただけますと幸いです。
guest

回答2

0

ベストアンサー

こんにちは。

現状は3から伸びた先端に居て、ワーキングはクリーンであると仮定します。
こういうやり方があります。

sh

1git rebase --onto <2のハッシュ> <3のハッシュ>

投稿2018/11/27 13:24

tamoto

総合スコア4105

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

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

Meganezaru

2018/11/28 00:38

質問者さんではないですが・・・ やっぱり、こういう機能ありますよね(^_^;) 4から上を2に乗せるってイメージで動くんですかね? rebase後、3がどうなるかも気になります・・・
imocl

2018/11/28 01:56

ありがとうございます! 試した結果を質問に追記しました。ご覧いただけますと幸いです。
tamoto

2018/11/28 04:20

Meganezaruさん そのイメージで間違いないです。3を根本としてその先にあるチェーンを、2を根本とした位置に全て付け直します。3についてはそれを辿れるラベルがなくなれば追跡できなくなります。 imoclさん この回答で意図した通りの結果になっています。先端のブランチのみを見れば、「該当のマージコミットが消えただけのログ」となっているはずです。 rebaseは付け直すと言っても「新しいコミットのチェーンを作り直す」というものになるので、rebase前のブランチが別のブランチにマージされていたりしても、それらのログには変化はありません。先端付近で赤のブランチにマージされているチェーンは、rebaseで作り直す前のものから変化しないからです。こういう状況まで進んでしまったブランチを書き換えることは困難です。 gitは本質的に履歴の改変が不可能なようにできているので(改変できたら履歴管理の意味をなさない)、やるなら、意図したコミットツリーの形を「再度構築しなおす」という心積もりで着手する必要があります。 (pushしていないということなので、困難ではありますが、不可能ではないです。)
imocl

2018/11/28 05:16

確かに、先端ブランチのログはマージコミットがないだけの完全なものになっています…!履歴の書き換えはこのように行うのですね。 “本質的に履歴の改変が不可能”というところを理解していませんでした。 私がイメージしていたツリーの形にするのは困難なようですが、大変勉強になりました。ありがとうございました!
Meganezaru

2018/11/28 05:59

tamotoさん 返信ありがとうございました! 勉強になりました。
guest

0

squashでいける気もしますが・・・

あえて別方法で・・・

  1. 2でbranch作成→branch-a(マージ前ブランチを復活)
  2. 青の先頭でbranch作成→branch-b(青ブランチを複製)
  3. 青を1までhard-reset
  4. branch-aを青にffマージ
  5. branch-bの3番(マージコミット)の一つ上コミット以降を、青にcherry pick(rebaseでもできそう)
  6. branch-bを削除

各操作は、調べてみてください!

青のブランチを複製(blue-orgとか)しておけば、やり直しが効くので、安心して試せると思います。

投稿2018/11/27 09:20

Meganezaru

総合スコア715

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

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

imocl

2018/11/28 02:47

ありがとうございます! 試そうとしたのですが、5.で上部のマージコミット(一番上の画像上から4つ目)のコミットをcherry pickしようとしたときに The previous cherry-pick is now empty, possibly due to conflict resolution. If you wish to commit it anyway, use: git commit --allow-empty Otherwise, please use 'git reset' On branch 青 Your branch is ahead of 'origin/青' by 9 commits. (use "git push" to publish your local commits) You are currently cherry-picking commit 4つ目のコミット nothing to commit, working tree clean というエラーが出てそこから進めない状況です…(._.)
Meganezaru

2018/11/28 02:49

前提が複雑でしたね(^_^;) 歴史の書き換えができるrebase(含むcherry pick)系機能は、元のコミットをコピーする機能なので、オリジナルのコミットとは別物になります。新しくできてしまったように見えるコミット(緑色のブランチや黄色のブランチ)がオリジナルのもので、青のブランチにできたものがコピーという位置付けです。 ですので、試されたような結果になります。 赤のブランチも同様に編集する必要がありますね。
imocl

2018/11/28 05:23

最初の投稿時から添付画像を先頭コミットまでの画像にしておくべきでした、すみません… 歴史の書き換えを行うのはオリジナルではない、というところを理解していませんでした。コピーで正しくする、というイメージですね。 cherry pickなどはじめて使ってみて、大変勉強になりました。 ありがとうございました!
Meganezaru

2018/11/28 06:08

cherry-pickを駆使すれば(笑)、赤のブランチも含めて戻せると思います。 時間がある時に、自分の思うがままに歴史を操作してみてください(笑) リモートに上がっているブランチのrebaseが厳禁なのは、rebaseで複製されたコミットがリモートのオリジナルコミットと混在してしまうからです。複製されることがわかっていれば、なんとなく理解できますよね。
imocl

2018/11/28 07:42

確かに、これだとリモートにプッシュした履歴を手元で変更すると大変なことになりそうですね(*_*) 一度、失敗できる環境でいろいろな機能を試してみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問