14. 11月 2011 · Write a comment · Categories: Git

あちこちいじったけど直近のcommitに戻したい時ってありますよね。

1ファイルだけ元に戻したい時:
(うっかり削除した時もこれで戻せる)

git checkout HEAD /path/to/file

全部戻したい時:

git reset --hard

おまけ
git管理下にないファイルを一覧する
(git statusでも出てくるけど)

git clean -n

削除したファイルをまとめてgit rmする

git add -u

参考:gitでアレを元に戻す108の方法

17. 2月 2011 · Write a comment · Categories: Git

gitで過去のcommitを統合する方法。
直したつもりで直ってなかった時や、やむなく作業途中でcommitしたのを消した
いときに便利。
これ使えばこないだの履歴消去は不要だった気がする…

git rebase -i HEAD~5

とするとエディタが開いて、こんな一覧が出てくる。

More »

01. 2月 2011 · Write a comment · Categories: Git

正確には「履歴を消した新しいリポジトリを作る」
滅多にやらないと思うけどメモ。
forkしたリポジトリを公開する時とか?

リモートに空のリポジトリを作る

mkdir /git/new_repository.git
cd /git/new_repository.git
git init --bare --shared=true

ローカルにcloneして内容をコピー

git clone remote://git/new_repository.git
cd ~/old_repository
git checkout-index -a -f --prefix=export/
cp -r ~/old_repository/export/* ~/new_repository/
cd ~/new_repository
git add .
git commit -m 'moved to new repository'
git push origin master

master以外のブランチも移動するには

cd ~/old_repository
git checkout my_branch
git checkout-index -a -f --prefix=export/
cd ~/new_repository
rm -rf *
git branch my_branch
cp -r ~/old_repository/export/* ~/new_repository/
git add .
git commit -m 'moved to new repository'
git push origin my_branch
27. 11月 2010 · Write a comment · Categories: Git

origin/masterにnon-fast-forwardでpushできなくなった!
さすがにmasterを削除することはできない(元々削除できないが)ので何とかしてみる。

まずローカルのmasterをリネーム(masterは削除できない)

git branch -m master temp

次にリモートのブランチを全て取得

git fetch

そしてリモートのmasterと同じものをローカルに構築

git branch master origin/master

masterに入って

git checkout master

ワークブランチをrebase

git rebase my-work-branch

そしてpush

git push origin master

しかしstageが無かったらどうやって作業したらいいのか分からなくなってしまった。
今さらsvnに戻れとか言われたら発狂する。

15. 11月 2010 · Write a comment · Categories: Git

毎日、作業開始時に

git checkout master
git pull origin master
git checkout my-work-branch
git rebase master

とやってたんだけど、なんか妙なマージコミットが混ざってるよ、と注意された。
git pullはfetch+mergeらしいので、それでかなぁ。
git pull origin masterの代わりにgit pull –rebase origin masterにすればOK。
–rebaseの位置をよく間違える。

More »

15. 11月 2010 · Write a comment · Categories: Git

zshで右プロンプトにgitの状態を表示させてみたが、zshの最近のバージョン(4.3.10)のvcs_infoは、いちいちgitを呼ばなくてもリポジトリの状態を把握できるらしい。
毎回gitが走ると当然遅いので、vcs_infoに切り替えてみた。

More »

zshには右プロンプトというものがある。
何に使うの?と思ってたけど、パスとかを表示させておくと便利(左に表示させるのと比べてカラムがずれないとか)なようなので試してみた。
ついでに、うっかりmasterをいじり回してしまう事故を防ぐために、gitのブランチも表示させてみる。

More »

20. 10月 2010 · Write a comment · Categories: Git

あらすじ:
git commit、git pushして作業終了

翌日、最後のcommitが気に入らなくなってgit checkout HEAD^

そのまま作業終了、commit

fast-forwardでpushできない!

昨日のことを忘れてmergeしたらconflictの嵐

\(^o^)/

解決編:

More »

開発環境はLinuxなのでgrowlはないんだけど、gnomeの通知システムにメッセージを送るnotify-sendというツールがある。
libnotify-binをインストールしておけば、

notify-send '送信したいメッセージ' -i "アイコン"

で通知を送ることができる。なお、アイコンは/usr/share/pixmaps/に置き、拡張子を除いて記述する。
(多分~/.usr/あたりにも置けると思う)

More »

27. 9月 2010 · Write a comment · Categories: Git

リポジトリを特定の時点に戻すには2つの方法がある。
まずgit logで戻したいコミットのハッシュを取得して、

git reset [ハッシュ値]

または

git revert [ハッシュ値]

resetは戻した時点より後のコミットを全て無かった事にする。
revertは「その時点に戻す」差分を作成して現在のコミットの上に積んでくれる。

どっちをやった場合も、

git reset --hard HEAD

を実行するまで実際のファイルはリセットする前のままなので注意。
ちなみに

git checkout HEAD^

でも戻れるが、上記と逆に実際のファイルのみでリポジトリには反映されない。
(形式上、無名のブランチに切り替わる)
そこから編集してコミットすれば、revert+αになる…と思う。