gitメモ

Android関係ないけど覚え書きとして。

[edit]

checkout

 git branch -a
 git checkout -b develop remotes/origin/develop

作業ツリーを完全に元に戻す(svn revert)

 git checkout <blanch> -f
[edit]

reset系

[edit]

マージ取り消し

 git reset --hard ORIG_HEAD
[edit]

コミット取り消し

  • コミットのみ
 git reset --soft HEAD^
  • ワーキングディレクトリの変更も戻す
 git reset --hard HEAD^
  • 直前にしたコミットをやり直す
 (git add)
 git commit --amend
  • git reset --hard HEAD コミット前に全部、弄る前に戻したいってとき
  • git reset --hard HEAD^ コミットしちゃった後で1つ前のコミットに戻す(使うべきじゃない)
  • git reset --hard ローカルの全てのファイルを最新に変更する
  • git clean -fd ローカルのuntrackedファイル、空ディレクトリを消す
[edit]

ブランチ操作

[edit]

ブランチ一覧

 git branch -a
[edit]

ローカルブランチ削除

 git branch -d hoge
[edit]

リモートブランチ削除

 git push origin :hoge
[edit]

リモートブランチ削除しようと思ったらエラー

 error: dst refspec xxxxxx matches more than one.
 error: failed to push some refs to xxxxxx

タグとブランチの名前が同じだったときにおきる。

 # タグ削除
 git push origin :refs/tags/<tag_name>
 # ブランチ削除
 git push origin :refs/heads/<branch_name>
[edit]

削除されたはずのブランチがなぜか残っている場合

 git fetch --prune
[edit]

ブランチの名前を変える

 git branch -m new-name
[edit]

stash系

現在のブランチのワークツリーを一時してに保存する

 git stash
 git stash list
 git stash pop
 git stash pop stash@{1}

popの代わりに apply を使うと適用された変更は stash から削除されずに残る。

 git stash apply
 git stash apply stash@{1}

stash に保存されている状態を削除する

 git stash drop
 git stash drop stash@{1}

stash の状態とその親コミットとの差を表示する

 git stash show
 git stash show stash@{1}
 また、差分を表示したければ
 git stash show -p

stash からブランチを作る

 git stash branch new-branch
 git stash branch new-branch stash@{1}

インデックスに保存されている変更を除いて stash に保存する

 「-k」か「–keep-index」オプションをつけると、 インデックスに保存されてる変更を除いて stash に保存され、 インデックスはワークツリーにそのまま残る。
 git stash -k
[edit]

origin変更

git remote set-url origin <新しいリポジトリURL>
# ssh://project-master/eoblog-sitemonitor

git remote add origin <新しいリポジトリURL>
#git push origin master:master
git push -u origin master

[edit]

パーミッション(Windows)

file modeの確認

 git ls-tree HEAD ファイル名

file modeの変更

 git update-index --chmod=+x ファイル名
[edit]

git-svn (svnリポジトリをgitに変換)

 git svn clone <repo> <dir>

ブランチなども移行

 git svn clone -T trunk -b branches -t tags <subversion リポジトリ> </subversion>

gitリポジトリをSvbversionリポジトリの最新の状態と同期させる

 git svn rebase

origin追加

 git remote add origin ssh://project-master/jukuzukan.git
 git push origin master:master

git-svnでcloneした既存のWorking copyが手元にあって、そこに別なbranchやtrunkを追加したい場合は、以下のように.git/config ファイルに項目を加えます。

   1  [svn-remote "svn"]
   2    url = http://svn.repos.com/foo/branches/bar
   3    fetch = :refs/remotes/git-svn
   4  [svn-remote "trunk"]
   5    url = http://svn.repos.com/foo/trunk
   6    fetch = :refs/remotes/git-svn-trunk

下の方が今回追加したものです。 あとは、以下のコマンドを実行してSVNからfetchしてきます。

   1  % git svn fetch trunk

そうすると、以下のようなブランチが作成されます。

   1  % git branch -r
   2    git-svn
   3    git-svn-trunk

ここから先は、普通にGitのbranchとしてmergeすればOKです。

[edit]

オレオレリモートリポジトリ作成

 git remote add myrepo homepage@192.168.xx.xx:/var/www/gitrepo/xxx.git
 git remote -v
 
 git fetch myrepo
 git push myrepo develop
 
 git checkout -b localb repo/remoteb
[edit]

複数のコミットをまとめる

 git rebase -i HEAD~4

# fixup は「このコミットでの変更内容を直前のコミットに合成する」
# squash の場合はコミットログを編集できる

[edit]

日付をいじる

rebaseしているとauthor_dateは昔のままでcommiter_dateだけ現在時刻になる。

直前のcommitのタイムスタンプ(Committer date,author date)を現時点に修正

 git rebase HEAD~1 --ignore-date

committer date を author date と同じ値にする

 git rebase HEAD~1 --committer-date-is-author-date
[edit]

diff, patch

 git log --oneline
 git diff --no-prefix 67c4b35 87a45ba > diff.patch
 git diff --no-prefix HEAD~ > diff.patch

パッチの作成

 git-format-patch -r HEAD~ (パッチファイルが作成される)

format-patchで作られたパッチをあてる

 git-am 0001-Changed-hoge.patch

diffで作られたパッチをあてる

 git apply 001-Changed-hoge.patch

パッチをチェックする

 git apply --check 001-Changed-hoge.patch
[edit]

差分ファイル検出

 git archive --format=zip HEAD `git diff --diff-filter=d --name-only HEAD^ HEAD` -o archive.zip
[edit]

git add したけど commit してないファイルが消えたので復活させる

checkout したときや reset --hard したときなど

 git fsck --lost-found
 git show xxxxxxxxxxxxxxxxxxxxxxx > tmp.txt
 git apply tmp.txt
[edit]

git ignore 関連

[edit]

既にトラックされたファイルを無視対象にしたい

git rm --cached を使う。

 $ git rm --cached hoge.txt # 上記のトラックされたファイルをインデックスから削除すれば(ワークツリーはそのまま)
 
 # もしhoge.txtをcommit済みの場合
 $ git commit -m 'delete hoge.txt' # コミットしてリポジトリからも消す
[edit]

自分の環境でだけ除外したい(他の人と除外設定を共有しない)

.git/info/exclude に書く。

[edit]

git pull(fetch) 詳細

 git fetch <repository> <refspec>
 <refspec> = <src>:<dst>

gitconfig内の記述
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
→ git fetch ってやったらデフォルトで
git fetch origin +refs/heads/*:refs/remotes/origin/*
が実行される

参考

[edit]

git status, diff

[edit]

git status を svn status っぽく表示

 git status --short --branch
[edit]

git diff で変更ファイルの一覧を見たい

 git diff --name-status HEAD HEAD^
[edit]

index とワーキングツリーの差分(まだaddしてないもの。ただし新規ファイルは除く)

 git diff
[edit]

index と HEAD の差分(commit対象のもの)

 git diff --cached
[edit]

HEAD とワーキングツリーの差分(commit済の状態からどれだけ変更されているか。add無視)

 git diff HEAD
[edit]

HEAD と HEAD^ の差分(さっきcommitしたもの)

 git diff HEAD^ HEAD --stat
[edit]

misc

[edit]

HEAD^ とかの意味

  • HEAD : 最新
  • HEAD^ :1つ前
  • HEAD^^ (=HEAD~2) :2つ前
  • ORIG_HEAD:リセットしたやつ
[edit]

GitExtensions パスワード記憶

設定→SSH→Configure Git credential helper

 !"C:/Program Files (x86)/GitExtensions/GitCredentialWinStore/git-credential-winstore.exe"
[edit]

GitExtensions コミット状態(数)が表示されない

gitのプロセスがどっかで詰まってる。SSHアクセスしようとしてパスワードで詰んでる可能性。

[edit]

gitリポジトリのサイズ

git count-objects -v

[edit]

コンフリクトの解決を記録して再適用する

git rerere

 git config rerere.enabled true

または、.git ディレクトリ以下に rr-cache ディレクトリが存在していれば有効になります。

[edit]

commitの分割

git reset HEAD~1
でcommit前の状態にもどしてから再add, commitする

[edit]

空コミット

初めのコミットは空コミットにしておくとよい

 git commit --allow-empty -m "first commit"
[edit]

元に戻す関連

  • ブランチ名とファイル名が同じ場合などは、「--」の後にファイル名を書く。
  • git checkout に -m オプションをつけてマージする
[edit]

FILE をインデックスの状態にする(インデックスに登録した後のコミットの変更を取り消す)

 git checkout FILE
[edit]

FILE を最後のコミット時の状態にする

 git checkout HEAD FILE
 git checkout HEAD -- FILE
[edit]

FILE を特定のコミット時の状態にする

 git checkout [commit] -- FILE
 (FILE は*を指定可)
[edit]

作業ディレクトリの内容が混沌としてきた。一度綺麗な状態にしたい。

 git checkout HEAD -- 
 git checkout -- *
[edit]

作業ディレクトリにゴミファイルが溜まってきた。一度綺麗な状態にしたい。

 git clean -n (見るだけ)
 git clean -f (消す)(戻せない!!!)
[edit]

git stash pop したらconflictした

  • 現在のコミットを採用する場合
 git checkout --ours <FILE>
  • stashを採用する場合
 git checkout --theirs <FILE>
 git reset <FILE>
 git add <FILE>
[edit]

git log

 git log --graph --oneline --decorate=full
[edit]

git reflog

 git reflog
 git reset --hard HEAD@{1}