2018/05/20

[git]ブランチを消すとcommit履歴も消える

以前、gitでちまちまcommitするので、Pull Requestしてマージするときにまとめたい話をした。

http://hiro99ma.blogspot.com/2018/05/git-merge-squash.html


merge --squashするときれいになったので、こりゃいいや、と使っていた。

それはよかったのだが、てっきりこう思っていたのだ。

Pull Request用に作ったブランチにcommitがまとまっただけで、ローカルにはcommit履歴が残っている

しかし、ひさびさにcommit履歴を見てみると、squashでまとめたものしか残っていない。。。
あれ、commitの履歴って、全部残っているものではないの??


わからないときは、実験だ。


$ git init
$ touch test.txt
$ git add test.txt
$ git commit -m "first"
$ git checkout -b work/aaa
$ (test.txtを編集)
$ git commit -a -m "hello"
$ (test.txtを編集)
$ git commit -a -m "world"
$ (test.txtを編集)
$ git commit -a -m "morning"

image

$ git checkout master
$ git checkout -b aaa
$ git merge --squash work/aaa
$ git commit -m "squash merge"

image

$ git branch -D work/aaa

image


ああ、消えた!!!


$ git checkout master
$ git merge aaa
$ git branch -d aaa

image


むう、ブランチaaaがあったことすらわからないのか。
reflogには残っているけど、手元に残っているだけだろう。

image


fast-forwardだったから、ログに残っていないのだろうか?


fast-forwardを無効にしてやってみよう。

$ git config merge.ff false
(同じ手順でやっていく)
$ git merge --squash work/aaa
fatal: You cannot combine --squash with --no-ff.

ダメやん。

$ git merge --ff --squash work/aaa

これならできたけど・・・branchを消すと当然同じ結果になった。



そもそも、私は何がしたかったのかというと、以下を何とかしたかったのだ。

  • mergeしたという記録が見えない
    • ログで残すしかない?
  • --squashしたcommitの履歴が残らない
    • squashしたブランチを消さない?


--squashした記録は、ログで残すしかなさそうだ。
上でやった手順では commit -mとコメントを指定したのだが、-m なしで実行するとエディタが起動して、squash対象のcommit logを自動的に埋めん込んでくれていた。

ただ、これはこれで悩ましいな。
commitを頻繁にするのは、細かく履歴を残しているときもあるが、別の環境に移動する際にgit経由でやる場合もあるからだ。
「家に帰るのでcommit」とかも、しばしば。

まあ、ログを編集すれば良いのだけど、それだったら自分で「mergeした」と入れるだけでもよい気がする。


それよりも、問題は2番目だ。
commitはgitのどこかに必ず残っていて、ブランチはcommit idをつなげているだけだと思っていたのだ。
しかし、ブランチを削除してcommit履歴も消えると言うことは、commitはブランチに紐付いているということになる。
今までsquashせずにmergeしていて、commit履歴が全部残っていたので、そう勘違いしていたのだろう。


ブランチを消さなければ残るのだろうが、私はそこまでして履歴を残したいのだろうか?
「この行は何のためにこうしたんだっけ?」という確認をしたいときに見るかもしれないけど、そもそも記憶にないのにcommitログを見ただけでわかるとは思えない。
それよりは、mergeする単位を大きくしすぎないというか、1つの目的のためにmergeするようにしておけばよいのではなかろうか。


issueを上げて対応するためにブランチを作っていたのだけど、複数の問題が絡んでいる場合がある。
そうすると、1つのブランチでの作業が大きくなってしまう。。。

そんなときは、気付いた時点でさらにブランチを作っておけばよいのかもしれん。
あれこれ試して、自分というかチームにあう運用スタイルを作っていくしかなかろう。

2 件のコメント:

  1. 匿名09:37

    私は、もともとmercurialを使っていて、
    終わったブランチは閉鎖する運用していたのですが、
    これだとコミット履歴は全部残っている上、
    生きているブランチ数も絞られます。

    世の中のデファクトスタンダードがGitになっているので、
    Gitを使い始めたのですが、なんだかコミットが消えるのは気持ち悪いです…。

    返信削除
    返信
    1. コメントありがとうございます!

      この記事を書いてから1年半・・・私もいろいろなGit管理を見てきました(たぶん)。
      未だにうまく運用できているとは思ってないですが、ずいぶんとGit文化に慣れてきた気がします。
      "git rebase"で履歴をきれいにする方法を読んだときには「なんでそんな必要があるのよー」と思ったのですが、履歴をきれいにするという方式を選ぶ/選ばないということができることがいいんじゃないかな、という理解になってます。
      まあ、うん、好みですよね。

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。