2016-12-21 7 views
0

私は2つの枝を持っています。 branch1には最新の変更が加えられ、もう1つ(branch2)にはリモートにある最新の変更が含まれています。git rebase <SHA1>は、コミットを潰すようではありません。

SHA=$(git merge-base branch1 branch2) 

が、私は

git checkout branch1 
git rebase ${SHA} 

をリベース実行し、私が午前問題はこれがに表示されないということです。

は、だから私はそうのようなコミット共有、最新を取得している私は何をすべきかブランチ1をコミットしてください。それはコミットを押しつぶす必要があり、私の概要は間違っていますか?

対話型オプションでrebaseを使用する場合は、コミットをスカッシュするかどうかを指定します。

それがコミットを潰しことが、私の概要が間違っているなら、多分私はそうリベースコマンドで

git rebase -s ${SHA} 

または多分

git rebase --autosquash ${SHA} 
+0

Rebaseは、デフォルトではsquahsingではありません。たぶんあなたはrebaseリストを編集することができる-iフラグを探しています – frlan

答えて

2

のようないくつかのオプションを使用する必要がある場合、私は疑問に思って?

いいえ、デフォルトではありません。

概念的には、リベースは、ブランチが常に別のコミットの上にあるようなふりをするのと同じです。たとえば、ここでは機能が分からないブランチがあります。

A - B - C - D - E [master] 
     \ 
      F - G - H [feature] 

我々はgit merge masterでしたが、その後、マージがコミット乱雑があるでしょう。代わりに、featureを常に `masterの先端にあるように書き換えることができます。

  • git checkout feature
  • git rebase master

今、私たちは古い枝がまだそこにあることを...

    F1 - G1 - H1 [feature] 
       /
A - B - C - D - E [master] 
     \ 
      F - G - H 

注意を持って、それが最終的にクリーンアップされます。


代わりにお探しのものはgit merge --squashです。

枝を潰すことはお勧めしません。なぜなら、コード考古学にとって有用な重要な履歴を失う(つまり、そのように書かれた理由を理解することです)。入力ミスのような簡単なコミットを取り除くためには、

代わりに、「フィーチャーバブル」をおすすめします。上記のようにブランチを再構築してから、git merge --no-ff(Gitを早送りではなくマージさせる)。これは

    F1 - G1 - H1 
       /   \ 
A - B - C - D - E ------------ I [master] 

あなたは線形の歴史を取得する(git logはIが表示されます...その結果、H1、G1、F1、E、D、...)、F1、G1、およびH1が関連している詳細なコミット情報を保持し、コミットメッセージIを使用してブランチの内容を記述することができます。

+0

ughh与えられたSHAの後に自動的に全てのコミットを盛り上げる方法が必要ですか?私は対話的にそれをする必要はありません、右か? –

+0

@AlexanderMills私が言ったように、 'git merge --squash'。また、私が言ったように、私は自分自身をスカッシュを使用しないで、それを奨励しないので、私はそれについて多くを言うことはできません。 – Schwern

+0

でも、どんなコンテキストでgit merge --squash?問題の文脈とは異なる文脈であると思われる。もしそうなら、あなたが召集できる説明を加えてください。 –

関連する問題