1. ホーム
  2. git

[解決済み] Gitによるhotfixブランチのfeatureブランチへのマージ

2022-03-16 10:04:30

質問

例えば、Gitで次のような状況があるとします。

  1. 作成されたリポジトリ。

    mkdir GitTest2
    cd GitTest2
    git init
    
    
  2. マスターでいくつかの変更が行われ、コミットされます。

    echo "On Master" > file
    git commit -a -m "Initial commit"
    
    
  3. Feature1 は master からブランチされ、いくつかの作業が行われました。

    git branch feature1
    git checkout feature1
    echo "Feature1" > featureFile
    git commit -a -m "Commit for feature1"
    
    
  4. 一方、マスターコードにバグが発見され、hotfix-branchが確立される。

    git checkout master
    git branch hotfix1
    git checkout hotfix1
    
    
  5. このバグは hotfix ブランチで修正され、(おそらくプルリクエストやコードレビューの後に) master にマージされます。

    echo "Bugfix" > bugfixFile
    git commit -a -m "Bugfix Commit"
    git checkout master
    git merge --no-ff hotfix1
    
    
  6. feature1の開発を続けています。

    git checkout feature1
    
    

例えば、featureブランチでもバグが発生しているため、featureブランチにホットフィックスが必要だとします。どうすれば、featureブランチにコミットを重複させることなく、この問題を解決できますか?

featureブランチに、機能の実装とは関係のない2つの新しいコミットが入るのを防ぎたいのですが。これは、プルリクエストを使う場合に特に重要だと思います。これらのコミットはすべてプルリクエストに含まれ、レビューされなければなりませんが、これはすでに行われています(ホットフィックスがすでにマスターに含まれているため)。

をすることができません。 git merge master --ff-only : "fatal: Not possible to fast-forward, aborting."ですが、これが役に立ったかどうかはわかりません。

解決方法は?

masterブランチをfeatureブランチにマージする方法は?簡単です。

git checkout feature1
git merge master

ここで無理に早送りマージを行うことはできないので、意味がありません。あなたは feature ブランチと master ブランチの両方にコミットしました。早送りはもう不可能です。

をご覧ください。 GitFlow . これはgitのブランチングモデルで、それに従うことができます。また、これはGitの拡張機能で、新しいワークフローのステップのためにいくつかのコマンドを追加し、そうでなければ手動で行う必要があったことを自動的に行うものです。

では、あなたのワークフローでは何が正しかったのでしょうか?feature1 ブランチは、GitFlow では基本的に "develop" ブランチとして扱われます。

masterからhotfixブランチを作成し、それをマージして戻しました。そして今、あなたは立ち往生しています。

GitFlow のモデルでは、hotfix も開発ブランチにマージするよう求めています。

ということで、本当の答えはこうなります。

git checkout feature1
git merge --no-ff hotfix1

これは、Hotfix 内で行われたすべての変更を feature ブランチに追加するものですが のみ これらの変更は これらの変更はブランチ内の他の開発用変更と衝突する可能性がありますが、最終的に feature ブランチを master にマージする際には master ブランチと衝突することはありません。

リベースには十分注意してください。リベースは、あなたが行った変更があなたのリポジトリにとどまる場合にのみ行ってください。例えば、他のリポジトリにブランチをプッシュしていない場合です。リベースは、ローカルでのコミットを世に送り出す前に有用な順序に並べるための素晴らしいツールです。しかし、後からリベースを行うと、あなたのような git 初心者にとっては物事がめちゃくちゃになります。