0

リモートとローカルのコミットを分ける

前回gitlogを汚さない方法とか書いたけど、実はpush時に問題があって-fオプションを使う必要があったりで実はもう使ってない。
これはこれでいいのかもしれないけど、そもそもやりたかった事は以下の二つ。

  • ローカルのリポジトリは俺俺ハックや中途半端なものも置いておきたい。デイリーのバックアップ用途としても使いたい。
  • リモートのリポジトリはいつpullされるか分からないのでちゃんと動くものだけを置いておきたい。

未だやり方が定まったわけではないけど2つの方法を試し中。
■merge –squashを使う。
開発はmaster以外で必ず行い、リモートへプッシュできるものをmasterへ置く。

ここではdevというブランチで開発を行う。
$ git checkout -b dev

人にはみせれないようなcommitをたくさんする。
$ /Users/aokitakashi/gittest% git log --pretty=oneline
0fcbf10805bfca369ea39d32a3e280c59c5c0093 8割動いてきた
a987a670a442c7dc39db955e16c2f51bf1917413 4日修正分
3ec6ad445ab9bda66f05e00ecde6c1bea0615b8b 3日修正分
d319dbca73bc44d9412b22952674011d72d9560e 2日修正分

マスターに戻る
$ git checkout master

ここで–squashオプションを付けてマージするとコミット前のステージングに反映される。devブランチでのcommitログはなくなる。
devでの4つのcommit分を合わせて改めてcommitする。
$ git commit -m "ログイン用プラグイン実装"
$ git push

■ひたすらstashする。
masterでもok。
stashは一つしか保存できないと思い込んでいたけど、そんな事はない。
適当にバックアップとりたい時にstashする
$ git stash
$ git stash apply

履歴も見れる
$ git stash list

ワーキングディレクトリが最新なのでcommit。
$ git commit -m "ログイン用プラグイン実装"
$ git push

ちなみに前の状態に戻すのも簡単。
$ git checkout -b temp stash@{3}

参考: 6. 鎖をつなぐ最後の輪: stash と reflog

今のところ前者の方が扱いやすい感はある。
後者は名前・コメントがつけれなかったり、git stash/git stash applyの連打が気持ち悪い。

0

gitのログを汚さない方法

自分専用のリポジトリでおらおらcommitしまくってると、git logを見ると残念な気分になるので無駄なcommitを削除する方法。
しかもファイルはワーキングツリーに残したまま。
revertやresetやrebaseをよく分からぬまま使ってると、ワーキングツリーからファイルがなくなったり新たにlogが残ったりするのでそれ備忘録も兼ねて。
そもそもrevertの「commitを打ち消す」というのを使うべき時に出くわした事がない。

こんなlogがあるとして
$ /Users/aokitakashi/gittest% git log --pretty=oneline
bd8b1801f30354138248a49c8f5764b9e39565d2 Cさん.txt追加
3ec6ad445ab9bda66f05e00ecde6c1bea0615b8b Bさん.txt追加
d319dbca73bc44d9412b22952674011d72d9560e Aさん.txt追加

「Cさん.txt」にもっと情報を追加してcommitすると無駄に増えるのでamendオプションを使って最後のcommitにねじ込む
$ git commit --amend
git reset –soft HEAD^ してcommitしなおすのもだいたい同じ。ワーキングツリーにはC.txtは存在する。

最新ならamendでいいけど、調子にのって無駄なcommitをしまくって以下のような状態になった時

4705656d3c70cdff66dbc107c320dcf6e3d57986 なんかちょっと修正
ef602ec65f24449d1edeb27ae50239e412d0137b test
ff1fae93d9abbbc3ed2a379fad3a2b96ab8e0ef5 ほげほげ
f86cff03d1ca87cc3bca3f54dc39ccea21867622 メンバー情報の保存方法をテキストベースに変更
bd8b1801f30354138248a49c8f5764b9e39565d2 Cさん.txt追加
3ec6ad445ab9bda66f05e00ecde6c1bea0615b8b Bさん.txt追加
d319dbca73bc44d9412b22952674011d72d9560e Aさん.txt追加

rebaseを使う。
$ git rebase -i HEAD~4
エディターが開く。
pick 3ec6ad4 なんかちょっと修正
pick a987a67 test
pick cfb7a8a ほげほげ
pick 0fcbf10 メンバー情報の保存方法をテキストベースに変更

なくしたいcommitのpickをsquashに変更して保存してやれば3つのcommitは消えて下のcommitにねじ込まれる。

squash 3ec6ad4 なんかちょっと修正
squash a987a67 test
squash cfb7a8a ほげほげ
pick 0fcbf10 メンバー情報の保存方法をテキストベースに変更

revertと違って打ち消したというlogも残らないしワーキングツリーからもファイルは消えない。

f86cff03d1ca87cc3bca3f54dc39ccea21867622 メンバー情報の保存方法をテキストベースに変更
bd8b1801f30354138248a49c8f5764b9e39565d2 Cさん.txt追加
3ec6ad445ab9bda66f05e00ecde6c1bea0615b8b Bさん.txt追加
d319dbca73bc44d9412b22952674011d72d9560e Aさん.txt追加

これで共有リポジトリに突っ込んでも恥をかかないはず。

0

remoteへpush/pullする時ブランチ名を省略する方法

remoteを管理する(git cloneしない)ユーザーだとローカルとリモートのブランチ名を指定する必要がある。
git push origin masterの「origin master」の部分。
きっと省略する方法はあるのだろうと思いつつはや数年。

調べるとあっさり見つかった。

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

とすると、.git/configに以下のような2行が追記されgit push/pull だけでいける。

[branch "master"]
remote = origin
merge = refs/heads/master