#author("2021-04-14T07:28:26+00:00","default:wikiadmin","wikiadmin")
#author("2021-06-17T10:03:42+00:00","default:wikiadmin","wikiadmin")
-SVNに代わる構成管理。ローカルリポジトリが作成できその中でブランチを切ったりコミットできたりする点がSVNとの違い。リモートリポジトリとローカルリポジトリがあり、混乱する。はっきり言って現状ではSVNのほうがシンプルで操作が楽な印象。バイナリの扱いがダメダメなので個人開発の場合はSVNのほうが良いだろう。と思っていたがもはやブランチ切り替えの速さでsvnには戻れない・・・といいつつ個人開発はまだsvnである。

*fork github to gitlab [#m8fc29ab]

git remote add upstream https://github.com/user/repo

Now you can fetch and pull from the upstream should there be any changes. (You can also push or merge to it if you have access rights.)

git pull upstream master

Finally, push back to your own GitLab repository:

git push origin master


*用語集 [#w559af73]

|項目|説明|備考|
|Fast Forward|ブランチ分岐したものの、その間に分岐下のコミットがない場合はコミットをブランチの先頭に進める。これをFast Forwardという|ブランチの作業内容がわからなくなるので人によっては嫌がる|
|merge commit|ブランチマージ時に作成される。--no-ffをつけるとfast forwardできる場合でもmerge commitを作成||
|git flow|ブランチ戦略のコマンドツール|

*基本操作一覧 [#ba209603]

|タグを指定してチェックアウト|git checkout -b TAGNAME refs/tags/TAGNAME|
|新規作成したブランチをpush|git push origin HEAD|
|最新のコミットだけclone|git clone --depth 1 URL|
|shallow cloneを元に戻す|git fetch --unshallow|
|shallow clonにする|git fetch --depth 1|


*github [#yb93c5db]

**無料プランの制約 [#n91449dc]

privateリポジトリが無制限になったので個人開発には十分


**SSH公開鍵認証にする。 [#s04ac702]

 ssh-keygen -t ras -C コメント

**.ssh/configに以下のような設定を入れる [#jeccf3ff]


**Personal access tokens [#va7b0ec3]

https://github.com/settings/tokens

二段階認証を設定した時にgit cloneなどの時に必要なアクセストークン。普遍にできるし、いつでも無効化できるので、環境変数などに設定しておく。macかつbrewでgitインストールしているとosxkeychainを介して初回のみアクセストークンいれればOK

*TIPS [#h28179c6]

**特定のコミット時点に戻す [#x91c3b79]

 git reset --hard コミットハッシュ

**一部のディレクトリだけチェックアウト [#e8dae67a]

***一回全部持ってきてから設定で対象パスのみ記載するという方法。 [#m7ac1d5c]

 git clone https://YOUR_GIT_URL
 git config core.sparsecheckout true
 echo "reservepath/reserve" > .git/info/sparse-checkout
 git read-tree -m -u HEAD


***HISTORYを持ってこない(ちょっと目的とは違うが、ディスク容量は軽くなる) [#cd9d683a]




**ブランチ間の差分でファイル名のみ [#d20830cd]

今いるブランチとリモートのnew_branchの差分表示

 git diff origin/new_branch --name-only

*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]

リポジトリには作業ディレクトリを含むものと含まないベアリポジトリがある。サーバー側はベアリポジトリにするが、ローカルはノンベアリポジトリにするべし

-ローカルリポジトリを作る場合。

 mkdir testproject
 cd testproject
 git init
 echo "git test" > readme
 git add .
 git commit -m "first commit"
 git remote add origin http://www.example.com/testproject.git
 git push origin master

-既存のリポジトリをクローンする場合は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 fetchしてリモートのリポジトリ情報を更新しておく

|git checkout -b local_branch origin/remote_branch|

このあとgit fetchが必要。←間違い!git pullと何が違うの?リモートブランチ情報が更新されているかもしれないので事前にfetchしておく!

**リモートのリポジトリの内容に合わせる [#fccfc2cf]

 git fetch origin
 git reset --hard origin/master

**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|コミットを取り消す。git revert commit番号|
|reset|ある時点のコミット以降をすべて取り消す!|
|reset --hard|revertみたいなもの。ローカルコミットは取り消さない|
|show|git show commit番号:ファイル名|

**pushされたコミットを打ち消す [#dce2b1ec]

 git log 
 git revert コミットID
 git push 

**マージ [#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]

ブランチの履歴を消してマージ。トピックブランチが小さいものが多く、頻発するのであればこちらの運用が良いかもしれぬ。

**コメント修正 [#ue27ca33]

 git commit --amend

**特定のコミットのみマージ [#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