web-dev-qa-db-ja.com

Git:ブランチをマスターにマージするか、マスターをブランチにマージします

最初にマスターを別のブランチにマージしてから、マスターにマージして戻すことで間違いを犯しているのではないかと思います。

次のブランチを作成し、それぞれに個別のコミットがあるとします。

            mkdir git_merging
            cd git_merging/
            git init
            touch on_master
            git add .
            git commit -m "Initial commit on master"

            git checkout -b x
            touch on_branch_x
            git add .
            git commit -m "Initial commit on branch x"

            git checkout master
            touch on_master_again
            git add .
            git commit -m "Commit on master after branching"

今、私はマージしたいと思います。通常、私は最初にマスターをxにマージし、次にxをマスターにマージすることを好みます。

            git checkout x
            git merge -m "Merge master into x" master 
            echo "test results"
            git checkout master 
            git merge x

そうすれば、マスターにマージする前にテストを行うことができ、常に機能しているマスターブランチがあることを確認できます。私の知る限り、xを直接マスターにマージする場合と比較して、機能的な違いはありません。

            git merge -m "Merge x into master" x
            git checkout x 
            git merge master 

しかし実際には、マスターに排他的にマージされているように見えるリポジトリに遭遇することがよくあります。私のアプローチに何か欠点はありますか?私がこれをすべきではない理由は何ですか?

13

これはかなり主観的な質問ですが、かなり客観的な答えを思いつくことができると思うので、パスを与えます。

マスターをマージする前に、マスターをブランチにマージして戻すのはすばらしいプラクティスです。 (あなたが指摘したように)あなたが実装したばかりの機能を壊す何かを他の誰かが犯した場合はどうなりますか?または、誰かがあなたが行ったのと同じコードを変更し、マージの競合を引き起こした場合はどうなりますか?私は実際にマスターをあなたのブランチにマージすることをお勧めします非常に頻繁に。これにより、マージの競合を解決するために1日半を費やす必要がなくなるだけでなく(ただし、ブランチが大きすぎることを示している可能性がありますが、それは別の話です)、プロジェクトの変更に合わせて調整することもできます。進化します。

マスターの上にコミットをリベースするべきだと言う人もいるかもしれません。私の短いバージョンは次のとおりです。機能が実行されていない場合でも、開発プロセスの非常に早い段階でプルリクエストを開くことをお勧めします。これは、コードをリモートサーバー(GitHubなど)にプッシュしている可能性が高いことを意味します。コミットをリベースするには、git履歴を書き換えてプッシュし、プッシュを強制する必要があります。強制プッシュはワークフローの決定としては不十分であり、コミット履歴に(ほぼ)永続的な損傷を与える可能性があるため、避ける必要があります。

そうです、マージを検討する直前にマスターからマージし直してください。それ以外の場合はできるだけ頻繁にマージしてください。 GitHubを使用している場合は、新しい保護されたブランチ機能を使用して、マージする前にマスターでブランチを更新することを強制することをお勧めします。

require branches to be updated before merging -- GitHub

15
Kyle Macey