1. ホーム
  2. git

[解決済み] 異なるブランチの特定のコミットからブランチを作成する方法

2022-05-30 03:24:33

質問

masterブランチでいくつかのコミットを行い、devブランチにマージしました。

devブランチの特定のコミットからブランチを作成したいのですが、masterブランチで最初にコミットされたコミットです。

コマンドを使いました。

git checkout dev
git branch  <branch name> <commit id>

しかし、これでは期待したdevブランチではなく、masterブランチからブランチが作成されます。コミットIDはmasterブランチとdevブランチとで同じです。 そこで、異なるブランチで同じコミットIDを区別するにはどうしたらよいでしょうか。

追記: githubに例を作りました。 https://github.com/RolandXu/test_for_branch

コマンドを使いました。

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8

私が期待するのは、テストブランチが aa.txt bb.txt cc.txt を含んでいることです。しかし、テストブランチには aa.txt と cc.txt しか含まれていません。masterブランチから作成された可能性が高いです。

どのように解決するのですか?

もし、この形式の branch コマンドを使用する場合(始点付き)には、どこで HEAD がどこにあるかは関係ありません。

何をしているのか

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8

  • まず HEAD をブランチの dev ,

  • 次に、コミット時に新しいブランチを開始する 07aeec98 . このコミットには bb.txt がありません (あなたの github リポによると)。

新しいブランチを開始したい場合 をチェックアウトした場所で開始したい場合。 という場合は、開始点を指定せずにブランチを実行することができます。

git branch test

または、他の方が回答されているように、ブランチとチェックアウトを1つの操作で行うことができます。

git checkout -b test


という事実に戸惑っているのではないでしょうか。 07aeec98 はブランチの一部であり dev . 確かにこのコミットは dev の最新コミットに到達するために必要な変更です。 dev . しかし、それらは最新の dev の履歴にあるわけではありません。 07aeec98 .

8480e8ae (bb.txt を追加した場所) は、例えば、履歴にない 07aeec98 . から分岐した場合 07aeec98 によって導入された変更を取得することはできません。 8480e8ae .

言い換えると、AブランチとBブランチをCブランチにマージし、Aのコミットで新しいブランチを作成した場合、Bで導入された変更を取得することはできません。

同じように、master と dev という二つの並行したブランチがあり、dev でマージしたとします。master のコミット (マージより古いもの) からブランチアウトしても、dev の変更は得られません。


もし、あなたが 永久に master からの新しい変更を自分の機能ブランチに統合したい場合、マージする必要があります。 master をマージしてください。しかし、これは機能ブランチにマージコミットを作成することになります。

機能ブランチを公開していない場合は、更新された master にリベースすることもできます。 git rebase master featureA . 起こりうるコンフリクトを解決する準備をしておいてください。

マージコミットなしで機能ブランチで作業でき、なおかつmasterの新しい変更と統合できるようなワークフローを希望する場合、以下をお勧めします。

  • すべての新しい機能ブランチを master のコミットに基づかせます。
  • ブランチを作成する dev ブランチを作成します。
  • 機能ブランチが master の新しい変更とどのように統合されるかを確認する必要がある場合は、master と機能ブランチの両方をマージして dev .

にコミットしないでください。 dev に直接コミットせず、他のブランチをマージするときにのみ使用してください。

例えば、機能Aと機能Bに取り組んでいる場合。

a---b---c---d---e---f---g -master
    \       \
     \       \-x -featureB
      \
       \-j---k -featureA

ブランチをマージして dev ブランチにマージして、新しいマスターでうまく動くかどうかチェックします。

a---b---c---d---e---f---g -master
    \       \            \
     \       \            \--x'---k' -dev
      \       \             /    /   
       \       \-x----------    /    -featureB
        \                      /
         \-j---k--------------- -featureA

機能ブランチでの作業を続けながら、master と機能ブランチの両方から新しい変更点を dev に定期的にマージすることができます。

a---b---c---d---e---f---g---h---i----- -master
    \       \            \            \
     \       \            \--x'---k'---i'---l' -dev
      \       \             /    /         /
       \       \-x----------    /         /  -featureB
        \                      /         /  
         \-j---k-----------------l------ -featureA

新機能を統合する段階になったら、機能ブランチをマージします( dev をマスターに入れる。