2

master 、 joy の 2 つのブランチがあります。「hello」という名前のファイルがあり、「git rebase joy」コマンドを入力すると、競合が発生し、競合の内容が奇妙になります。

以下は手順ごとの詳細です

  • 1.

git チェックアウト マスター

猫こんにちは

表示 ==>

 Hello world
  • 2.

git チェックアウトの喜び

猫こんにちは

表示 ==>

Hello world
one line
two line
  • 3.

git チェックアウト マスター

git rebase 喜び ==>

First, rewinding head to replay your work on top of it...
Applying: cherry-pick
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging hello
CONFLICT (content): Merge conflict in hello
Failed to merge in the changes.
Patch failed at 0001 cherry-pick

猫こんにちは==>

Hello world
<<<<<<< HEAD
one line
two line
=======
add one line
add 2nd line
>>>>>>> cherry- pick

しかし、私が見つけたいのは矛盾ではなく、内容は

Hello world
one line
two line
  • 5.

以下の私のバージョン ツリーは、勉強した後ではかなり複雑です。

* <b04ea3b> 2012-06-09 [yaoyangyong]  (HEAD, joy) test rebase
* <5b595d6> 2012-06-09 [yaoyangyong]  joy clear hello
| * <eeba7d9> 2012-06-09 [yaoyangyong]  (master) clean hello
| *   <1dbc3b8> 2012-06-09 [yaoyangyong]  merge confilct
| |\  
| |/  
|/|   
| * <3cb9d88> 2012-06-09 [yaoyangyong]  modify master 1st line
* | <b1724ad> 2012-06-09 [yaoyangyong]  test merge
| *   <89a692f> 2012-06-09 [yaoyangyong]  merge from joy
| |\  
| |/  
|/|   
* | <dc96da9> 2012-06-09 [yaoyangyong]  modify second line
| *   <816f575> 2012-06-08 [yaoyangyong]  joy
| |\  
| |/  
|/|   
* | <93b5982> 2012-06-08 [yaoyangyong]  3line
| * <4400260> 2012-06-08 [yaoyangyong]  cherry-pick
* | <233d6f2> 2012-06-08 [yaoyangyong]  2nd line comment
* | <60d6edc> 2012-06-08 [yaoyangyong]  modify hello,add one line
|/  
:
* <b04ea3b> 2012-06-09 [yaoyangyong]  (HEAD, joy) test rebase
* <5b595d6> 2012-06-09 [yaoyangyong]  joy clear hello
| * <eeba7d9> 2012-06-09 [yaoyangyong]  (master) clean hello
| *   <1dbc3b8> 2012-06-09 [yaoyangyong]  merge confilct
| |\  
| |/  
|/|   
| * <3cb9d88> 2012-06-09 [yaoyangyong]  modify master 1st line
* | <b1724ad> 2012-06-09 [yaoyangyong]  test merge
| *   <89a692f> 2012-06-09 [yaoyangyong]  merge from joy
| |\  
| |/  
|/|   
* | <dc96da9> 2012-06-09 [yaoyangyong]  modify second line
| *   <816f575> 2012-06-08 [yaoyangyong]  joy
| |\  
| |/  
|/|   
* | <93b5982> 2012-06-08 [yaoyangyong]  3line
| * <4400260> 2012-06-08 [yaoyangyong]  cherry-pick
* | <233d6f2> 2012-06-08 [yaoyangyong]  2nd line comment
* | <60d6edc> 2012-06-08 [yaoyangyong]  modify hello,add one line
|/  
* <aeae413> 2012-06-08 [yaoyangyong]  add hello file
  • 6

比較として、以下のようにバージョン ツリーが非常に単純なクリーン フォルダーを再作成し、リベースを実行すると成功します。

* <0d63388> 2012-06-09 [yaoyangyong]  (joy) add two lines
* <1f9d2f4> 2012-06-09 [yaoyangyong]  (HEAD, master) add hello file
4

1 に答える 1

1

これは私には少し奇妙に見えます。通常、マスターをリベースする必要はありません。通常、リベースはプライベート ブランチで行われるため、マージ時に早送りマージが実行されます。rebase -i を使用してリベースすると、コミットをパブリック ブランチ (マスター) にマージする前に、コミットをスカッシュして修正する機会も得られます。

リベースとは何かを理解するために、ここを見てみましょう: http://git-scm.com/book/en/Git-Branching-Rebasing

あなたの例を使用すると、次のようなことが期待されます。

1.

git checkout master
cat hello

==>を示しています

Hello World

2.

git checkout joy
cat hello

==>を示しています

Hello World
one line
two line

3.

この時点で 2 つのコミットがあります。最初のコミットは master と joy の両方に存在し、2 番目のコミットは joy にのみ存在します。これでマージできましたが、joy のコミットがきれいに適用されるようにしたいと思います (マージ コミットを回避します)。これを行うには、喜びを master にリベースします。

引き続きジョイブランチで運用中

git rebase master

または、スカッシュ、修正、並べ替えなどを実行できるインタラクティブ モードを使用することもできます

git rebase -i master

4.

これでジョイ ブランチが希望どおりに見え、マスターにリベースされたので、マスターに切り替えてマージを実行するだけで見栄えの良い履歴を取得できます。

git checkout master
git merge joy

5.重要

リベースを行うと、それらのコミットの SHA-1 識別子が変更されます。これらのコミットに基づいて作業を行っている人は、コミットの親が存在しなくなるため、対処しなければならない多くの厄介なことになります。これが、公開ブランチをリベースしない理由です。

于 2012-06-09T21:51:25.800 に答える