-SVNに代わる構成管理。ローカルリポジトリが作成できその中でブランチを切ったりコミットできたりする点がSVNとの違い。リモートリポジトリとローカルリポジトリがあり、混乱する。はっきり言って現状ではSVNのほうがシンプルで操作が楽な印象。バイナリの扱いがダメダメなので個人開発の場合はSVNのほうが良いだろう。 *用語集 [#v992a99e] 難解かつ耳慣れない言葉ばかり |bareリポジトリ|管理用のファイルのみ、ワーキングディレクトリを持たないリポジトリ。| |non-bareリポジトリ|ワーキングディレクトリを持つ| |mirrorリポジトリ|bareリポジトリのリモートリポジトリバージョン| *インストール [#a68280d1] CentOS6系だとあまりに古いバージョンが入るのでコンパイルしたほうが良いだろう。 **コンパイル [#zcc6aeab] #必要ライブラリインストール yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker #ソースダウンロード wget https://www.kernel.org/pub/software/scm/git/git-2.4.10.tar.gz tar zxvf git-2.4.10.tar.gz cd git-2.4.10 # コンパイル make prefix=/usr/local all make prefix=/usr/local install *参考サイト [#ic89dc18] https://try.github.io/levels/1/challenges/1 *新しいブランチを作ってコミットするまで [#wf8fe668] git checkout -b feature/mynewbranch git push origin feature/mynewbranch -n git push origin feature/mynewbranch *チェックアウト手順 [#ufb0915a] **クローンする [#j7096e54] git clone http://example.com/git 任意のディレクトリ名 cd 任意のディレクトリ名 -自己証明書でチェックアウトしたい場合は以下のコマンドを打ち込むべし。打ち込まないと「fatal: unable to access 'https://www.example.com/test/test.git': SSL certificate problem: self signed certificate」のエラーが出てしまう。 git config --global http.sslVerify false **pullする [#mb9757b4] git pull origin testing *コマンド版 gitローカルリポジトリ作成 [#ea6e8add] -ローカルリポジトリを作る場合。 git init -既存のリポジトリをクローンする場合はinit 不要 git clone http://example.com/hoge/git.git [hoge以外の名前を付けたい場合] git clone http://ID:[email protected]/git イメージ的には以下構成となる。 DIR/hoge/.git →http://example.com/hoge/git.git DIR/fuga/.git →http://example.com/fuga/git.git -リモートのブランチ一覧 cd xxx git branch -r git branch 対象ブランチ git checkout 対象ブランチ #一度にやる場合は下記 git checkout -b 対象ブランチ -今のローカルがどのリモートURLに紐づいているか git remote -v -そもそもorigin/masterとは? origin: レポジトリの場所(URL)の別名 master: ブランチの名前 デフォルトの対象はorigin/masterだ。 git config --list 上記コマンドで今どこを示しているかを確認せよ。 -この状態だとブランチの内容を取り込んでいない!以下のコマンドで取り込む git pull origin ブランチ名称 -リモートを複数登録できる。 git remote add NEW_REMOTE [email protected]:xxxx/foo.git **コマンド版を使う場合の設定 [#gdfd244b] -~/.gitconfigに設定を保存しておける。 [url "https://"] insteadOf = git:// [http] sslVerify = false [user] email = [email protected] name = username [remote "origin"] url = http://GIT_USER:[email protected]/test.git -git config listで今の設定状況を見ることができる *SVNとの違い [#n055d4dc] ローカルリポジトリ、index、リモートリポジトリと構成要素が複雑怪奇。ブランチがSVNより増える傾向がある。 |add|コミット準備領域であるindexに追加する| |commit|あくまでローカルリポジトリに対してのコミット。-aオプションをつけないと変更してもコミット対象にはならない| |PUSH|リモートリポジトリへのコミット。SVNでいうところのコミットと同義。リモートリポジトリがすっからかんの場合は git push -u origin master| |FETCH|SVNでいうところのアップデート(ローカルへのマージは行わない?)| |PULL|SVNでいうところのアップデート(ローカルへのマージまで行うFETCH+MERGE)| |clone|チェックアウトだが、gitではブランチの切替に利用する| |fork|githubの機能。cloneと似ているが、分散開発用に元の所有者に通知がいく。forkするという行為はオリジナルへの貢献を前提とする。| |アップストリーム ブランチ|ローカルに対して上流にあるブランチ。cloneした場合はclone元だが、指定もできる| |branch -a|リモート含むブランチ一覧の表示| |branch -d|ブランチの削除。すっからかんじゃないと削除不可能| |git log --pretty=oneline pom.xml|ログを省略形の一行で表示。| |git log --abbrev-commit pom.xml|コミットIDを省略系。一行で表示。| |git log -p ファイル or ディレクトリ|指定のファイル or ディレクトリ以下の更新のみ表示| **checkout [#he929032] ローカルブランチを作成して、そこにリモートを紐つけ |git checkout -b local_branch origin/remote_branch| このあとgit fetchが必要。git pullと何が違うの? **push [#q16baf87] 引数なしのpushは非常に危険 http://dqn.sakusakutto.jp/2012/10/git_push.html |ブランチ指定してPUSH|git push --set-upstream origin testing| |実際には実行しない(dry-run)|git push -n | **pull [#p7b70014] リモートから取得する(fetch+merge) |git pull origin testing|originリポジトリのtestingブランチを取り込む| **元に戻す系 [#c71d875d] svnのように簡単ではない。svn revertはgit checkout file名 |checkout ファイル名|svn revert ファイル名| |checkout .|すべてのファイルのローカル変更を取消!| |revert|コミットを取り消す| |reset|ある時点のコミット以降をすべて取り消す!| |reset --hard|revertみたいなもの。ローカルコミットは取り消さない| **マージ [#p19140e0] -マージしたいブランチに移動 git checkout merged -マージ git merge マージ元のブランチ **チェックアウトなど [#nf5acd65] **ファイルの変更サイクル [#u3f54039] +変更 +add(ステージングにファイルが追加) +commit(ここまではローカルリポジトリ) +push(リモートリポジトリにコミット) *ブランチ運用 [#d3c4cf5a] masterブランチを統合ブランチとして、リリース向けに運用する。トピックブランチは機能追加、バグ修正のタイミングで作成され、リリース前に統合ブランチにマージされる。 branch -aでリモート含むブランチ状況を確認しながら作業する。 |git branch testing|testingブランチ追加| |git checkout testing|testingブランチに切替| *マージ [#t98d0533] **first-forwardマージ [#u38007d6] 分岐以降統合ブランチに変更がない場合、統合ブランチのコミット履歴はトピックブランチのコミット履歴とイコールになる。シンプルなので早送りマージと呼ばれる。ただしトピックブランチの履歴は残らないので、たとえfirst-forwardが可能であってもやらないほうがよい。 **マージ [#b3f859c6] 通常のマージ。統合とトピックブランチをマージしたというコミットが作成される。 **rebase [#v0c83a97] ブランチの履歴を消してマージ。トピックブランチが小さいものが多く、頻発するのであればこちらの運用が良いかもしれぬ。 **特定のコミットのみマージ [#w2962240] -なんとコミットのリビジョンを指定すると、一気にそれまでの更新をマージしてしまうので、カスレベルの使いづらさ。 git cherry-pick 5d0b85e02f5ae4c4984fac388015fe5ce1918673 git cherry-pick 1ea6be61498f49f00cfd0fd5a0a08590087930a6 *いろいろためした [#d38dc474] -最新のときにgit status $ git status On branch MyBranche Your branch is up-to-date with 'origin/NewBranch'. nothing to commit, working directory clean -古いときにgit status。リモートリポジトリに6コミット分あるよ。 $ git status On branch development Your branch is behind 'origin/Develop' by 6 commits, and can be fast-forwarded. (use "git pull" to update your local branch) nothing to commit, working directory clean *トラブルシューティング [#t3c60e84] error: failed to push some refs to 'http://example.com/git' To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details. **Your local changes to the following files would be overwritten by checkout: [#rf5dd1a5] ブランチ移動時に未コミットのファイルがあると上記エラー。 消してもいいなら以下のコマンドでローカルの変更を戻す。 git checkout . *Install [#f702a558] It's easy to install from source! just configure and make and make install! *apache [#d069f138] git-http-backendがソースコンパイルだとないため、下記はバイナリーインストールのときのみ可能。 http://www.proton.jp/main/programming/git/smart-http.html SetEnv GIT_PROJECT_ROOT /usr/local/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/local/libexec/git-core/git-http-backend/ <locationMatch "/git"> AuthType Basic AuthName "Git Area" AuthUserFile /usr/local/apache2/htdocs/.htpasswd require valid-user Order allow,deny Allow from all </locationMatch> ***AWSの場合 [#ufbe663d] -git init [root@ip-172-31-17-50 git]# git init Initialized empty Git repository in /var/www/git/.git/ -/etc/httpd/conf.d/git.conf #Alias /git /var/www/git SetEnv GIT_PROJECT_ROOT /var/www/git/.git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ <Directory /var/www/git> Options +ExecCGI AddHandler cgi-script .cgi DirectoryIndex gitweb.cgi </Directory> *gitstatsの使い方 [#z53e663b] まずはgitをクローンする。そのうえで以下のように実行するとoutput_dirにhtmlが出力される。 gitstats git_clone_dir/ /var/www/html/new_dir -オプションで特定のブランチやらを設定できる(解析時間は変わらず) gitstats -c commit_begin=ハッシュ(短いのでもOK) http://manpages.ubuntu.com/manpages/trusty/man1/gitstats.1.html **文字化け [#r6bbb050] 内部でgnuplotを呼んでいる。フォントがないとarialを使おうとするので、以下のコマンドで回避 yum install vlgothic-fonts.noarch export GDFONTPATH=/usr/share/fonts/vlgothic export GNUPLOT_DEFAULT_GDFONT=VL-Gothic-Regular *httpとの連携 [#a14d3ec5] http://int128.hatenablog.com/entry/20130118/1358440428 *ハマリポイント [#s7e08e67] **リモートと同名のブランチがローカルにも簡単に作れてしまう [#a962e01d] 既存branchの切り替えにはcheckoutを使うが、間違ってbranchを使うと作成されてしまう。 オペレーションミスだが、警告すら出ないのが問題。一度そうなると修正するのが面倒なのでgit cloneしたほうがよい。 **アップストリームとブランチ名の関係が不明瞭 [#d24a5ebd] 分かりにくい原因がこれに尽きる。サーバーの最新状態をorigin(接続先のエイリアス)/masterであらわされたとするとローカルのmasterはこの時点のスナップショット。リモートと同期するにはgit fetch originを行う。