2013年になって、ようやくお仕事の都合もあり、Gitを使って見ることにしました。
Redmineとの連携も体験したかったので、ALMiniumをUbuntu上に展開し、そこにリモートリポジトリを作成して練習してみました。
ということで、その時の練習メモです。
本家:
勉強した時の参考資料:
各種参考資料からの抜き書き。(もしかしたら間違ってるかもしれないので注意)
$ git config --global user.name "FirstName FamilyName" $ git config --global user.email foo@example.com $ git config --global core.editor "/usr/bin/vim"
SSLの証明書検証を無視させる:社内LAN上のサーバを参照する場合など。
$ git config --global http.sslverify false
今回検証に使ったCygwin Gitのバージョン
$ git --version git version 1.7.9
LANG環境変数
$ echo $LANG ja_JP.UTF-8
"git diff"文字化け対策(?):
$ export PAGER="lv"
コミットログ編集時文字化け対策:
$ git config --global i18n.commitencoding UTF-8
"git status"文字化け対策:
$ git config --global core.quotepath false
参考:
"git add"をskipしてcommit
$ git commit -a
"git add"したファイルを"Stage(Index)"から外したい
$ git status -s M hello.txt $ git add hello.txt $ git status -s M hello.txt
→これを戻す:
$ git reset -- hello.txt Unstaged changes after reset: M hello.txt $ git status -s M hello.txt
→さらに、hello.txtの変更も無効化して最後の状態に戻すには:
$ git checkout -- hello.txt
HEAD自体が参照しているリビジョンは動かさずに、Stage(Index)とWorking Directoryを巻き戻す:
$ git checkout HEAD^ $ git branch * (no branch) master
その後、調べ物が終わったので、masterのHEADに戻す:
$ git checkout master
HEAD自体を巻き戻す:
$ git reset HEAD^
→ただし、これだと"Stage(Index)"を1つ手前に戻した状態となる。HEADを移動させるには、リビジョンのID指定で"git reset"し直す必要がある。
ファイル名の変更
$ git mv old new
ファイルの削除
$ git rm file
ファイルの移動
(普通にOSのファイル移動コマンドでOK)
unixコマンドのオプションの一般的な慣習として、"--" 以降はオプションではなくファイル名のみを指定する慣習があり、Gitでもそれに倣っている。
なぜそういう慣習ができたかというと、ファイル名として "-" から始まるものがあると、ファイル名を指定したのかオプションを指定したのか、区別が出来ないため、"--" をオプションの終端として使うようになったらしい。
参考:
3行でまとめると:
$ git reset HEAD -- (file名)
→ git-reset は Index に対して特定の commit 内容を反映させるコマンド。commitとしてHEADを指定すれば、HEAD内容を反映させる事になり、事実上、git-add したのを取り消す効果になる。
(1) HEAD working-tree Index file1(HEAD) file1(edit1) - (= file1(HEAD)) (2) git add HEAD working-tree Index file1(HEAD) file1(edit1) ----> file1(edit1) (3) git reset HEAD HEAD Index file1(HEAD) ----------------> file1(HEAD) -> equals to (1) state: HEAD working-tree Index file1(HEAD) file1(edit1) - (= file1(HEAD))
なお、git-resetはあくまでもIndexに作用するコマンドのため、working-treeが変更されることは無い。
$ git checkout -- (file)
→git-checkout は working-tree に対して特定の branch or commit 内容を反映させるコマンド。commit省略時はHEADが参照され、HEAD内容をworking-treeに反映させる事になり、事実上、working-tree への変更を取り消す効果になる。
(1) git checkout -- file1 HEAD working-tree file1(HEAD) --> file1(=HEAD) (2) edit HEAD working-tree file1(HEAD) file1(edit1) (3) git checkout -- file1 HEAD working-tree file1(HEAD) --> file1(=HEAD)
なお、git-checkoutはあくまでもworking-treeに作用するコマンドのため、Indexが変更されることは無い。
3行でまとめると:
ユースケース
解法1: "core.pager" 設定を "cat" にする。
$ git config --global core.pager cat
解法2: gitのオプション、"--no-pager" を指定する。
$ git --no-pager diff
参考:
基本は "man gitignore" 参照。
参考:
$ git checkout -b b2 ... some modification ... $ git commit -a $ git push origin b2 Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 313 bytes, done. Total 3 (delta 1), reused 0 (delta 0) To http://shade1.glamenv-septzen.net/git/testproject1 * [new branch] b2 -> b2
$ git pull remote: Counting objects: 5, done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From http://shade1.glamenv-septzen.net/git/testproject1 * [new branch] b2 -> origin/b2 Already up-to-date. $ git checkout b2 ... $ git commit -a $ git push Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 343 bytes, done. Total 3 (delta 1), reused 0 (delta 0) To http://shade1.glamenv-septzen.net/git/testproject1 e90b0d3..bd9b8ae b2 -> b2
$ git branch b1 * b2 master $ git pull remote: Counting objects: 5, done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From http://shade1.glamenv-septzen.net/git/testproject1 e90b0d3..bd9b8ae b2 -> origin/b2 You asked me to pull without telling me which branch you want to merge with, and 'branch.b2.merge' in your configuration file does not tell me, either. Please specify which branch you want to use on the command line and try again (e.g. 'git pull <repository> <refspec>'). See git-pull(1) for details. ...(省略)... See git-config(1) for details. →怒られたので、originとブランチ名を指定してみる: $ git pull origin b2 From http://shade1.glamenv-septzen.net/git/testproject1 * branch b2 -> FETCH_HEAD Updating e90b0d3..bd9b8ae Fast-forward hello2.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) →masterブランチにmergeして、pushする。 $ git checkout master Switched to branch 'master' $ git merge b2 Updating 8914003..bd9b8ae Fast-forward hello2.txt | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) $ git push Total 0 (delta 0), reused 0 (delta 0) To http://shade1.glamenv-septzen.net/git/testproject1 8914003..bd9b8ae master -> master
最初にローカルから削除。 $ git branch -d b2 Deleted branch b2 (was bd9b8ae). 続いてリモートから削除。 $ git push origin :b2 remote: error: denying ref deletion for refs/heads/b2 →???
ALMiniumとGitのアカウントの連携の設定が影響してるのか、リモートブランチ削除できない・・・。順番がおかしいのか?謎。
リモート(origin)のb1ブランチを削除する例:
$ git push origin :b1
→git-push では、push「元」(src)とpush「先」(dst)を、 "src:dst" という形で指定することが出来る。"git push origin :b1" というのは src が空文字列、つまり空っぽの内容を b1 にpushすることになり、結果として、リモートのb1ブランチを削除したことになる。
":"(コロン)記法が覚えづらい場合は、素直に "--delete" オプションを使うと良い。originのb1ブランチの削除であれば、以下のようになる:
$ git push --delete origin b1
参考
1.7.9 以上なら、時間を決めてキャッシュ出来るようになりました。専用のデーモンが裏で起動されてキャッシュしてくれるようです。
$ git config --global credential.helper 'cache --timeout=3600' → 1時間キャッシュしてくれる。
古いバージョンだと、originサーバのURLにユーザ名・パスワードを仕込んでおいたり、"~/.netrc" に書いたりしてたようです。
参考:
GitHub用に調整されたMarkDownになっているそうです。
使いこなしガイド:
オンラインでプレビューできるサービス:
チートシート:
Cheat Sheetもいろいろあるらしく、Cheat Sheet自体のまとめサイトが出てきてる。
色々バリエーションがあると思いますが、2013年前半で試した感じでは TortoiseGit 1.8系 + msysgit 1.8系で安定して利用できています。
インストールする順番としては、TortoiseSVN -> msysgitの順っぽいです。
msysgitですが、git-scm.comからWindows用をダウンロードすれば問題ありません。ドキュメントによっては "Full installer for official Git for Windows" とか書いてあったりして混乱しそうですが、少なくともgit-scm.comからのWindows用ダウンロードで一般的な利用には問題ないと思います。
以下、 "Git-1.8.3-preview20130601.exe" のインストールの流れです。
3. コンポーネントの選択 : msysgitのため、msys側のbashとの連携オプションが選べます。・・・が、TortoiseGitにフロントエンドは一任するのであれば、各種連携機能をOFFにしても問題ありません。
4. ということで連携コンポーネントは全部OFFにして "Next"
5. GitへのPATH設定ですが、これもTortoiseGitをフロントエンドにして、そちらで直接git.exeへのフルパスを指定出来ますので、"Use Git Bash Only"を選択して、システム全体への環境変数は弄らないようにしておきます。
6. 改行コードです。変に自動変換されるとトラブルの元ですので、as-isにします。
8. あとは、TortoiseGit側のMSysGitの設定で↑でインストールしたgit.exeのbinフォルダを指定すればOKです。