-SVNに代わる構成管理。ローカルリポジトリが作成できその中でブランチを切ったりコミットできたりする点がSVNとの違い。リモートリポジトリとローカルリポジトリがあり、混乱する。はっきり言って現状ではSVNのほうがシンプルで操作が楽な印象。バイナリの扱いがダメダメなので個人開発の場合はSVNのほうが良いだろう。

*subversionからの移行 [#le4745fb]

さすがに使う機会が増えてきたのでなれるべく一部移行。下記ドキュメントが良い。

http://d.hatena.ne.jp/idesaku/20090323/1237825080

*用語集 [#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]

*リモートリポジトリ [#j3ba41b4]

|git remote show|リモートとの接続情報|
|git branch -vv|リモートとの接続情報。こちらのほうがより詳細でわかりやすい|


**クローンする [#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:PW@example.com/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 対象ブランチ

-リモートブランチ一発削除

 git push --delete origin ブランチ名

-今のローカルがどのリモートURLに紐づいているか

 git remote -v

-そもそもorigin/masterとは?

 origin: レポジトリの場所(URL)の別名
 master: ブランチの名前

デフォルトの対象はorigin/masterだ。

 git config --list

上記コマンドで今どこを示しているかを確認せよ。

-この状態だとブランチの内容を取り込んでいない!以下のコマンドで取り込む

 git pull origin ブランチ名称

 

-リモートを複数登録できる。

 git remote add NEW_REMOTE git@bitbucket.org:xxxx/foo.git

**コマンド版を使う場合の設定 [#gdfd244b]

-~/.gitconfigに設定を保存しておける。


 [url "https://"]
         insteadOf = git://
 [http]
         sslVerify = false
 [user]
         email = username@example.com
         name = username
 [remote "origin"]
         url = http://GIT_USER:GIT_PASSWORD@git.example.com/test.git

-git config listで今の設定状況を見ることができる

**認証情報の保存 [#effd6eef]

-httpsアクセス時にコマンド対話式の認証をスルーする方法

 1.git config --global credential.helper store
 2.git コマンドを実行してパスワードなどを入力
 3.~/.git-credentialsが作成される

*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と何が違うの?リモートブランチ情報が更新されているかもしれないので事前にfetchしておく!



**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 マージ元のブランチ(リモートを指定してOK)

-コンフリクトの確認

 git status でUnmergedになっているもの




**チェックアウトなど [#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.torutk.com/projects/swe/wiki/CentOS_7%E3%81%A7apache%E7%B5%8C%E7%94%B1%E3%81%AEgit%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E6%A7%8B%E7%AF%89

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を行う。

*svnのリポジトリ移行 [#d1da9895]

 #ローカルリポジトリをチェックアウト
 git svn clone -s https://REPO_URL/
 cd xxx
 git status

*ブランチ間の差分チェック [#ice1c692]

-以下のコマンドで実施可能

 git diff master:対象ファイル branch:対象ファイル

-チェックするシェルを作ってみた

 #!/bin/sh
 LEFT=origin/master
 RIGHT=origin/branch
 DIFFLIST=$1
 while read x; do
 #  echo $x
   git diff $LEFT:$x $RIGHT:$x >> diff_result.txt
 done < $DIFFLIST

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS