2017-07-26 11 views
2

私はrebase -iに私の歴史の中でしばらくして起こったコミットを試みています。Git:コミットの範囲を対話的にリベースします

* 5e32fb0 (HEAD -> master) Add latest feature 
* 106c31a Add new feature 
* 2bdac33 Add great feature 
...100 other commits... 
* 64bd9e7 Add test 3 
* 3e1066e Add test 2 
* 26c612d Add test 1 
* 694bdda Initialize repo 

と3つのテストコミットをスカッシュしたいとします。このような状況では、git rebase -i HEAD~106はあまり実用的ではありません。代わりに私が探しているのはgit rebase -i 64bd9e7:26c612dのようなものです。

gitにはこのような振る舞いがありますか?もしそうなら、どのように使用できますか?

私はthis postを見ましたが、私の質問には答えませんでした。

+2

それはそれまでさかのぼる歴史の中で到達した変更をしようとすることはまれ賢明だ上で、それをリベース。あなたが過去に変更したものも、現在のものを変更することを覚えておいてください。押しつぶされたすべてのコミットは、この新しい履歴を提供するために、異なる新しいコミットにコピーされます。 – torek

答えて

2

これら3つのコミットをつぶすために、あなたは全体リポジトリの再書き込み歴史する必要があります。つまり、これらのテストコミットが変更された後に、コミットのためのすべてのコミットハッシュが行われます。

  1. 一時的なブランチを作成し、64bd9e7を指すチェックアウトを行うのが最も簡単な方法です。
  2. 3つのコミットをスカッシュします。
  3. メインブランチをチェックアウトし、64bd9e7の直後にコミットにリセットします。
  4. は一時枝
1

rebase -iを使用して、そのコミットのみをスカッシュしてください。

git rebase -i <main_branch> 
# Now just add `s` in front of all the commits you want to squash 

あなたは多くのコミットをしていた場合、私はrebase --ontoを見てみることをお勧めしたい -

git rebase --onto <final_base_commit> <initial_base_commit> <head> 

git rebase --onto 694bdda 64bd9e7 5e32fb0 

注:書き換え歴史は、高度な操作ですので、注意して踏みます。

Git rebase tutorial

+0

これは唯一の方法ですか? 100以上のコミットのリストをナビゲートするのは難しいので、私は代替案を探しています。 – adc17

+0

更新された回答を確認してください。 – hspandher

関連する問題