11

次のグラフを想定します。

A -- B -- C -- D -- E -- F
      \
       G -- H -- I

インタラクティブなリベースでコミットをつぶすことができるようにするために見つけたいと思いますG(ただし、トピックブランチに1つのコミットを保持します)。これは後でレビューおよびマージされます。ブランチがあり、それがマージされたという情報を保持したいので、ブランチ全体をリベースしたくありません。

(履歴を見て、コミットの SHA チェックサムを使用するだけでよいことはわかっていますが、手動で情報を掘り下げたり、作成されたコミットの数を数えたり、 ~ from HEAD を使用したりすることなく、それを行う方法を探していますその数)。

編集:私が達成したいことの明確化:

私はこれを避けたい:

A -- B -- C -- D -- E -- F -- J
      \                      /
       G -- H -- I -- -- -- -

代わりに次のようなものがあります。

A -- B -- C -- D -- E -- F -- J
      \                      /
       G' -- -- -- -- -- -- -

言い換えれば、トピック ブランチでインタラクティブなリベースを使用してコミットを 1 つにまとめたいと考えていますが、それでもブランチを保持し、通常のマージを使用してトピック ブランチからの変更をマスターに統合します。

4

3 に答える 3

15

git には「ブランチ上」のコミットはありません。ブランチから到達可能なコミットのみがあります。そして、その情報は、そのコミットが元々どのブランチに属していたかを示す良い指標ではありません。したがって、あなたの質問を解釈するには2つの方法があります。

  • ブランチの側にあるbranchマージベースの後の最初のコミットを見つけたいです。master
  • branchからではなく から到達できる最初のコミットを見つけたいですmaster

私はあなたが2番目のものを意味したと仮定するつもりです. それに対する答えは、次のコマンドによって返されます。

 git rev-list ^master mybranch | tail -n 1

注:トピック ブランチから分岐すると、これはすべてひどく失敗します。


あなたが何を達成したいのか、私は少し混乱しています。ブランチ全体を 1 つのコミットで表現したいが、それでもマージが必要な場合は、次のようにする必要があります。

git checkout mybranch
git reset --soft `git merge-base mybranch master`
git commit -m 'All of Mybranch'
git checkout master
git merge --no-ff mybranch

これにより、最初のマージベースでスカッシュが開始されることに注意してください。master以前にマージした場合、これはあなたが望むものではないかもしれませんmybranch。2 番目のコマンドを次のように置き換えることで、これを変更して、マスターではなく mybranch での最初のコミットから開始することができます (複雑な履歴では奇妙で予期しない結果になる可能性があります)。

 git reset --soft `git rev-list ^master mybranch | tail -n 1`^
于 2013-04-11T13:22:06.020 に答える
7

git merge-baseで B を取得します

git merge-base F I

またはもっと簡単に

git merge-base my_branch my_other_branch

その後、結果でリベースできます

git rebase -i B

そして、最初のコミット G を保持し、他のすべてを押しつぶします。

于 2013-04-11T12:46:02.887 に答える
1

git merge-baseB. I の祖先でもある B のすべての直接の子が必要です。これは、git で次のコミットを見つけるにはどうすればよいですか? に関連しています。Git でコミットの子を参照する。次のようなものを試してください:

root=$(git merge-base master topic-branch)

git rev-list --parents ^$root topic-branch | grep " $root" | cut -f1 -d' '

これにより、ルートから先端までのすべてのコミットtopic-branchとその親が一覧表示され、親がルートであるコミットが表示されmerge-baseます。

トピック ブランチにはマージが含まれる場合があるため、トポロジ的に、ブランチに複数の「最初の」コミットが存在する場合があります。

于 2013-04-11T13:15:53.123 に答える