3

私は3つのブランチで作業しており、同時に1つのブランチを他の2つのブランチからリベースしたいと考えています。


私が得たもの

git log --graph --decorate --pretty=oneline --abbrev-commit

次のとおりです。

ブランチA:

* f751d1a (A) commit2
* 4e552f3 (master) commit1

ブランチB:

* 3770d35 (B) commit3
* 4e552f3 (master) commit1

ブランチC、最初にAからリベースし、次にBからリベースしました。

* 9740b0e (HEAD, C) commit4
* a280f0a commit2                   //same commit name but different sha code
* 3770d35 (B) commit3
* 4e552f3 (master) commit1

演奏するとき

git checkout C
git rebase A

私は次のものを手に入れました:

* 2e08816 (HEAD, C) commit4
* bbc77ad commit3                   //different sha-code
* f751d1a (A) commit2
* 4e552f3 (master) commit1

演奏するとき

git checkout C
git rebase B

私は次のものを手に入れました:

* bf67d55 (HEAD, C) commit4
* f69ecdd commit2                   //different sha code
* 3770d35 (B) commit3
* 4e552f3 (master) commit1

しかし、私が本当に必要としているのはCブランチを作ることです

* 1234567 (HEAD, C) commit4
* 3770d35 (B) commit3
* f751d1a (A) commit2
* 4e552f3 (master) commit1

ブランチAとBを変更せずに。

私はいくつかの調査をしましたが、その方法を理解できませんでした。それは可能ですか、これを達成する方法はありますか?

言い換えれば、どうすれば変換できますか

master---A
      \
       B---C
or

master---B
      \
       A---C

       A
      /
master---B
      \
       A---B---C

or something like this.

前もって感謝します...

追加の質問:

ありがとう、(@ Brian Phillips、@ Useless)!マージした後、それは私が望むように機能したようでした。しかし、後で、私はBでコミットを行い、git rebase master -i行を使用して「修正」を行いました。

pick 3770d35 commit3
fixup 3cbf79d commit4

次のようになりましたgit merge B

*   5fa9192 (HEAD, C) Merge branch 'B' into C
|\  
| * 147258a (B) commit3 //changed content after fixup
* |   7768962 Merge branch 'B' into C
|\ \  
| * | 3770d35 B commit3
| |/  
* | f751d1a (A) commit2
|/  
* 4e552f3 (master) commit1

また、とするとgit rebase B、次のようになります。

* 0e1355b (HEAD, C)
* 147258a (B) commit3 //changed content after fixup
* 4e552f3 (master) commit1

次のように維持する方法はありますか?

*  (HEAD, C) 5454215 Merge branch 'B' into C
|\ 
| * 147258a (B) commit3 //changed content after fixup
| |  
* | f751d1a (A) commit2
|/  
* 4e552f3 (master) commit1
4

2 に答える 2

2

gitのSHA1コミットIDは、コミットの内容だけでなく、それらのコミットの時間と祖先(とりわけ)に基づいて作成されるため、要求することは不可能です。コミットID3770d35は、それが最初にあった場所以外のものとして存在することはできません(SHA-1ハッシュの衝突を除く)。このトピックに関心がある場合は、git internalsについてもっと読むことをお勧めします(http://git-scm.com/book/en/Git-Internals-Git-Objectsは初心者に適しているかもしれません)。

IDをコミットすることをそれほど重要視せず、コミットの内容(および、関心がある場合は順序付け)についてもっと考えることをお勧めします。上にリストした最初の試み(git checkout C; git rebase A)は、意味的にはあなたが探しているもののようです。

于 2012-11-07T13:17:34.777 に答える
2

リベースするときは、同じ内容で新しいメタデータ(祖先など)を使用して新しいコミットを作成します。したがって、これを行うためにリベースを簡単に使用することはできません。

ターゲットの状態を見てみましょう。

           2 [A]
          /
1 [master]--- 3 [B]
          \
           2 -- 3 -- 4 [c]

(ブランチ名と一緒にコミットを表示して書き直しました)。メタデータが異なるコミット3のコピーが2つあるため、これは不可能です(親コミットが異なります)。

ただし、これを行うことができます。

           2 [A] ----
          /           \
1 [master]--- 3 [B] -- m -- 4 [C]

ブランチAとBを結合するマージコミット(m)を作成し、その上にCをリベースします。

于 2012-11-07T14:31:30.230 に答える