1

この一連のコミットを考えてみましょう。

foo: a => b => c => d
                      \bar: => e => f => g

ブランチから始めて、時々からfoo新しいブランチを作成します。今、ブランチで commit に取り組んでいると、 commit を間違えたことに気づきました。それで、編集のためにコミットを実行して開きます。変更を加えてステージングし、実行します。barfoohbarcgit rebasecgit rebase --continue

今、私のbarブランチが更新されました。ただし、fooブランチはまだコミットの元の欠陥のあるバージョンを指していcます。

特定のコミットへのポインターを含むすべてのブランチが識別され、一度に 1 つずつリベースされる、レポ全体のリベースを実行する方法はありますか?

私は手動の方法を知っています-fooをリベースし、新しいSHAを挿入/チェリーピックしますが、どのブランチがコミットを参照しているかを知る必要があります。しかも手作業が必要です。

4

1 に答える 1

2

ブランチが git でどのように機能するかを誤解していると思います。それらは全履歴ではなく、単一のコミットへのポインタです。つまり、fooは の同義語でdあり、barは の同義語ですg。リベースbarはまったく影響fooしません。

foo を new に設定したい場合d(これを と呼びましょうd')、次のようにします。

git checkout foo
git reset --hard d'

あなたの例に基づいた例を次に示します。

a <- b <- c <- d <- e <- f <- g
               ^              ^
               |              |
              foo            bar

でリベースを行った後、bar分岐した履歴があります。

          /- c <- d   
         /        ^
a <- b <-         |
         \       foo
          \
           \- c' <- d' <- e' <- f' <- g'
                                      ^
                                      |
                                     bar

上記のコマンドを使用して、 をfooポイントするだけです。d'reset

  a <- b <- c' <- d' <- e' <- f' <- g'
                  ^                 ^
                  |                 |
                 foo               bar

この操作は孤児cであり、d最終的にはガベージ コレクションを取得します。

于 2013-06-19T21:12:31.837 に答える