以前、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"
$ git checkout master
$ git checkout -b aaa
$ git merge --squash work/aaa
$ git commit -m "squash merge"
$ git branch -D work/aaa
ああ、消えた!!!
$ git checkout master
$ git merge aaa
$ git branch -d aaa
むう、ブランチaaaがあったことすらわからないのか。
reflogには残っているけど、手元に残っているだけだろう。
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つのブランチでの作業が大きくなってしまう。。。
そんなときは、気付いた時点でさらにブランチを作っておけばよいのかもしれん。
あれこれ試して、自分というかチームにあう運用スタイルを作っていくしかなかろう。
私は、もともとmercurialを使っていて、
返信削除終わったブランチは閉鎖する運用していたのですが、
これだとコミット履歴は全部残っている上、
生きているブランチ数も絞られます。
世の中のデファクトスタンダードがGitになっているので、
Gitを使い始めたのですが、なんだかコミットが消えるのは気持ち悪いです…。
コメントありがとうございます!
削除この記事を書いてから1年半・・・私もいろいろなGit管理を見てきました(たぶん)。
未だにうまく運用できているとは思ってないですが、ずいぶんとGit文化に慣れてきた気がします。
"git rebase"で履歴をきれいにする方法を読んだときには「なんでそんな必要があるのよー」と思ったのですが、履歴をきれいにするという方式を選ぶ/選ばないということができることがいいんじゃないかな、という理解になってます。
まあ、うん、好みですよね。