36
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

パッケージソフトウェア開発Advent Calendar 2014

Day 6

トピックブランチを切る運用と切らない運用

Last updated at Posted at 2014-12-06

本記事は、「パッケージソフトウェア開発 Advent Calendar」6日目の記事です。

以前、Git を用いてチーム開発をするにあたって、トピックブランチを切ることの理由を問われたことがありました。
そのとき、うまく答えられなかったので整理してみます。

なお、GitHub などの Pull request を使用していない Git を利用した開発の話を想定した内容です。

1人でトピックブランチを切る運用をした場合

1人でトピックブランチを切る運用をした場合の内容をコミットツリーの図で表現してみます。

1.png

まず修正を開始するためにブランチを作成し HEAD をそれに切り替えるため、git checkout -b <トピックブランチ名>を実行します。

2.png

次にトピックブランチでローカルで実施した修正をgit commitなどでコミットします。

3.png

トピックブランチの内容をmasterに反映するため、一旦 HEAD を master に移動させます。

4.png

git merge --no-ff <トピックブランチ名>でトピックブランチを master にマージします。

5.png

不要になったトピックブランチをgit delete -d <トピックブランチ名>で削除します。

6.png

正直面倒な感じです。
ただ、コミットツリーが枝分かれしていることで、master ブランチに修正を取り込んだということが伝わりやすい利点もあります。

1人でトピックブランチを切らない運用をした場合

次に1人でトピックブランチを切らない運用をした場合の内容をコミットツリーの図で表現してみます。

1.png

ローカルで実施した修正をgit commitなどでコミットします。

7.png

とても簡単に終わります。
コミットツリーが一直線になっていきます。

複数人でトピックブランチを切る運用をした場合

今度はチームで開発する場合の場合について述べていきます。

では、複数人でトピックブランチを切る運用をした場合の内容をコミットツリーの図で表現してみます。

8.png

まず、Aさんが「1人でトピックブランチを切る運用をした場合」でやったようにトピックブランチを切って master にマージします。

9.png

そして、A さんが git push origin master でリモートに反映します。

10.png

さて、B さんが別の修正を実施していて、トピックブランチにコミットしました。

11.png

B さんは master にマージする前に master ブランチが他の誰かの修正を取り込んでいるかもしれないので、git pull origin master で master を最新にします。

この際の pull では master に対して何も修正していないため、Fast-forward マージとなります。

12.png

B さんは、最新にした master をチェックアウト後、master にトピックブランチをマージします。
この際、master との内容によってはコンフリクトがこのタイミングで発生します。

13.png

最後に B さんが git push origin master でリモートに反映します。

14.png

この方法とった場合の利点はリモートにあるブランチである master に対しては、push する直前以外には修正をしないことです。
これにより、B さんが master を pull するタイミングでは Fast-forward マージになるのが保証されているので、そのタイミングでコンフリクトが起こることがありません。

また、このコミットツリーの構成は Pull request 運用した場合と同様の形になります。

複数人でトピックブランチを切らない運用をした場合

最後に複数人でトピックブランチを切らない運用をした場合の内容をコミットツリーの図で表現してみます。

8.png

A さんがローカルでコミットをします。

15.png

A さんは git push origin master でリモートに反映します。

16.png

B さんが別の修正を実施していて、ローカルでコミットしました。

17.png

B さんは master にマージする前に master ブランチが他の誰かの修正を取り込んでいるかもしれないので、git pull origin master で master を最新にします。

そうした場合、Fast-forward マージはできません。
そのため、場合によってはコンフリクトがこのタイミングで起きます。

18.png

B さんはgit push origin master でリモートに反映します。

19.png

個々の作業自体は簡単です。
ですが、1人でやった場合と異なって、コミットツリーが一直線にはならなくなります。

また、pull のタイミングでコンフリクトが発生する可能性があるので、個人的にはあまり直観的ではない気がしています。

まとめ

コミットツリーの図を用いて、トピックブランチを切った場合と切らなかった場合、どのようになるかを述べました。

ちなみに自分の場合、個人ではトピックブランチを切らない形で、社内などのチームでやる場合はトピックブランチを切る形で運用しています。
実際にどう運用するかは上記 4 パターンの挙動を理解した上で、好みで決めればよいと思っています。

36
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?