#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