// 下階層用テンプレート #topicpath ---- //ここにコンテンツを記述します。 #contents *** コマンドのエイリアスをつける [#i29876dd] $ cat ~/.gitconfig ... [alias] co = checkout b = branch logg = log --decorate --oneline --graph $ これで git co , git b , git logg とかでコマンドを実行できる。 ***Git Flow/GitHub Flow 整理中 [#sb3ae51a] -[[見えないチカラ: A successful Git branching model を翻訳しました>http://keijinsonyaban.blogspot.jp/2010/10/a-successful-git-branching-model.html]] わかりやすい -[[Git-flowって何? - Qiita>http://qiita.com/KosukeSone/items/514dd24828b485c69a05]] わりと具体例 -[[git flowとgithub flowとは?その違いは? - Qiita>http://qiita.com/mint__/items/bfc58589b5b1e0a1856a]] -[[git flow × Pull Request を使ってモダンな開発してみた - Qiita>http://qiita.com/Tamiiy/items/86f122d40ef6b158c2ab]] -[[git flow してみた - Qiita>http://qiita.com/satomyumi/items/d6b6d434c7b6c282b9fb#_reference-9a74218b4f5f5878611d]] -[[Git Flowによるリリース | Developers.IO>http://dev.classmethod.jp/tool/git/git-flow-release/]] **コマンド基本 [#gc95b0e7] ***リポジトリからマスターをClone [#veba0d86] git clone https://github.com/masatomix/ui-router-sample.git ←URLは例 cd ui-router-sample ***ブランチを切替 [#v0e1c5aa] git branch 一覧をみる git branch dev 作成する git checkout dev 切替える ***いろいろ修正、そのあとコミット [#vdd421ed] git diff ←差分チェック git commit コミットされた(( not stagedなファイルがあれば -a オプションつける)) ***リポジトリへプッシュ [#se9421f6] git push origin dev ***ステータスのチェック [#o727c9d3] git status ** git branch まわりの覚え書き。 [#cbaa2a2f] $ git clone https://github.com/masatomix/helloworld.git Cloning into 'helloworld'... remote: Counting objects: 28, done. remote: Total 28 (delta 0), reused 0 (delta 0), pack-reused 28 Unpacking objects: 100% (28/28), done. Checking connectivity... done. $ cd helloworld/ *** ローカルブランチの表示 git branch [#lc83b490] $ git branch * master *** リモートブランチの表示 git branch -r [#sb85587a] $ git branch -r origin/HEAD -> origin/master origin/dev origin/dev2 origin/master *** どっちも表示 git branch -a [#y8f7e50b] $ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/dev remotes/origin/dev2 remotes/origin/master *** 追跡ブランチも表示 git branch -vv [#gfcf6d63] $ git branch -vv * master 5e1dd3a [origin/master] Merge pull request #5 from masatomix/dev この状態で git push origin master すると、origin/master へプッシュされます *** リモートのブランチから、ローカルブランチを作成する1 git checkout -b [#w14e4599] $ git checkout -b dev_local origin/dev Branch dev_local set up to track remote branch dev from origin. Switched to a new branch 'dev_local' $ git branch -vv * dev_local 925a9e4 [origin/dev] closes #1,#4 master 5e1dd3a [origin/master] Merge pull request #5 from masatomix/dev リモートブランチからブランチすると、自動的に追跡ブランチがセットされます。 *** リモートのブランチから、ローカルブランチを作成する2 git checkout -t [#j9d25715] $ git branch -vv * master 5e1dd3a [origin/master] Merge pull request #5 from masatomix/dev $ git checkout -t origin/dev <- devを作成、元は origin/dev で origin/dev を追跡状態 Branch dev set up to track remote branch dev from origin. Switched to a new branch 'dev' $ git branch -vv * dev 925a9e4 [origin/dev] closes #1,#4 master 5e1dd3a [origin/master] Merge pull request #5 from masatomix/dev -t オプションで、リモートブランチをブランチすることで、ローカルブランチ名を指定しないでブランチが可能です。 *** 追跡ブランチを はずす。 git branch --unset-upstream [#r427da4e] $ git branch --unset-upstream $ git branch -vv * dev_local 925a9e4 closes #1,#4 master 5e1dd3a [origin/master] Merge pull request #5 from masatomix/dev 外れました。この状態で git push origin dev_local すると リモートに origin/dev_local が作成されてプッシュされます。 *** 追跡ブランチを設定する。 git branch --set-upstream-to / -u [#a4158e3a] $ git branch --set-upstream-to origin/dev2 <- もしくは -u だけ Branch dev_local set up to track remote branch dev2 from origin. $ git branch -vv * dev_local 925a9e4 [origin/dev2] closes #1,#4 master 5e1dd3a [origin/master] Merge pull request #5 from masatomix/dev ちなみにgit push コマンドは、指定したローカルブランチ(dev_local)を、設定されたリモートブランチ(origin/dev2)へプッシュするコマンドで、上記のunsetされた状態だと、設定されたリモートが存在しないため新規作成されます。 [[[git]ローカルからpushした時に自動的に追跡ブランチにする - dackdive's blog>http://dackdive.hateblo.jp/entry/2014/09/10/121945]] *** ローカルブランチからローカルブランチを作成1 git checkout -b [#kb7a4a90] $ git checkout -b dev2 dev <- dev2を作成、元は dev なので、追跡はナシ Switched to a new branch 'dev2' $ git branch -vv dev 925a9e4 [origin/dev] closes #1,#4 * dev2 925a9e4 closes #1,#4 ←追跡なし master 5e1dd3a [origin/master] Merge pull request #5 ちなみに、ブランチを移動しないで作成だけなら $ git branch dev2 dev *** ローカルブランチからローカルブランチを作成2 git checkout -b [#xadf1591] $ git checkout -b dev3 ←いまいるローカルブランチ(dev2) を元にdev3を作成 Switched to a new branch 'dev3' $ git branch -vv dev 925a9e4 [origin/dev] closes #1,#4 dev2 925a9e4 closes #1,#4 * dev3 925a9e4 closes #1,#4 ←当然追跡なし master 5e1dd3a [origin/master] Merge pull request #5 $ git log --decorate --oneline 925a9e4 (HEAD -> dev3, origin/dev, dev2, dev) closes #1,#4 ←わかりにくいけど、dev2から作られている ***違う名前のリモートブランチにプッシュする git push origin local:remote [#oe1264d1] $ git checkout -b dev_spike origin/dev Branch dev_spike set up to track remote branch dev from origin. Switched to a new branch 'dev_spike' $ git branch -vv * dev_spike 925a9e4 [origin/dev] closes #1,#4 master 5e1dd3a [origin/master] Merge pull request #5 from masatomix/dev dev_spike はリモートのorigin/devからブランチしたので、追跡ブランチはそれになってるのですが、 $ git push origin dev_spike:dev_spike_spike Total 0 (delta 0), reused 0 (delta 0) To https://github.com/masatomix/helloworld.git * [new branch] dev_spike -> dev_spike_spike $ とプッシュ時にコロンでリモートブランチ名を指定することで、別のリモートブランチにプッシュすることも可能です。 $git branch -r origin/HEAD -> origin/master origin/dev origin/dev_spike_spike <-作成されてる origin/master ** ローカルのブランチがどのリモートを追跡しているかを確認する git branch -vv [#n4b5ce6e] $ git branch -vv * master 5e1dd3a [origin/master] Merge pull request #5 <- master がorigin/masterを追跡している。 たとえば、--trackオプション(-t もおなじ) で、リモートと同名のブランチを作成したとすると $ git checkout --track origin/dev Branch dev set up to track remote branch dev from origin. Switched to a new branch 'dev' $ git branch -vv * dev 925a9e4 [origin/dev] closes #1,#4 master 5e1dd3a [origin/master] Merge pull request #5 $ origin/dev からdevが作成され、--trackオプションにより、追跡の設定も自動で行われていることが確認できました。 つぎに、ためしにローカルブランチからブランチさせてみます。ローカルのブランチからブランチを作成する場合、この場合は自動で追跡ブランチは作成されないため、、、、 $ git checkout -b dev2 dev ← ローカルのdevから、dev2ブランチを作成 Switched to a new branch 'dev2' $ git branch -vv dev 925a9e4 [origin/dev] closes #1,#4 * dev2 925a9e4 closes #1,#4 ←追跡ブランチを表示するカッコがない master 5e1dd3a [origin/master] Merge pull request #5 $ ようするに、dev2は追跡ブランチが存在しないことが確認出来きます。ややこしいのですが、リモートのブランチ origin/dev からブランチを--trackオプションで同名ブランチを作成する場合((これは、git checkout -b dev3 origin/dev などとローカルブランチ名を指定しながらブランチする場合も同様で自動で追跡される。))は、自動で追跡ブランチが設定されますが、ローカルからブランチする場合は、追跡ブランチは設定されない、という事が分かります。 ちなみに、追跡ブランチが存在しない、この状態でpushすると、、、、、 $ git push origin dev2 Total 0 (delta 0), reused 0 (delta 0) To https://github.com/xxxx/helloworld.git * [new branch] dev2 -> dev2 $ 追跡ブランチが存在しないローカルブランチは、サーバにブランチを作成することが分かりました。 リモートブランチdevから別名でブランチして、んでコミットをプッシュしたら、別名のブランチが作られるかdevにプッシュされるかってはなしになって、ブランチの切り方で挙動が変わることがわかり、あらためて整理したのでした。 [[Git - リモートブランチ>https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81#%E8%BF%BD%E8%B7%A1%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81]] ** コミットを一つにまとめる git rebase -i [#k6ac16c1] $ git log --decorate --oneline 050ea7f (HEAD -> master) 005 1d71318 004 cfb0c7a 003 608528b 002 a4431df 001 003,004のコミットを一つにしたい場合。 $ git rebase -i 608528b ←1つにしたいコミットの、一個前を指定。 エディタが開きます pick cfb0c7a 003 pick 1d71318 004 pick 050ea7f 005 これを pick cfb0c7a 003 squash 1d71318 004 ←うえのコミットにまとめるの意味。 pick 050ea7f 005 に書き換えて保存します。すると、もいちどコミットメッセージを入れる画面が開くので、メッセージを記載して再度保存します。 [detached HEAD f9f948f] 003 + 004 Date: Wed Dec 21 13:19:43 2016 +0900 1 file changed, 2 insertions(+) Successfully rebased and updated refs/heads/master. $ git log --decorate --oneline 6fb9004 (HEAD -> master) 005 f9f948f 003 + 004 608528b 002 a4431df 001 コミットが一つに書き換えられました。書き換えた場所以降のコミットも、新たなコミットの扱いになってますね。 pick cfb0c7a 003 squash 1d71318 004 squash 050ea7f 005 など複数指定することもできます。直前のコミットにまとめる、という意味なのでこの場合は004,005のコミットを003にまとめることになります。 環境によっては Could not execute editor というエラーが出る場合があります。そんなときは.gitconfigにエディタの情報を追記しておきます。 $ cat ~/.gitconfig ... ... [core] editor = /usr/bin/vim **リビジョン番号の確認、HEADの位置の確認 git log --oneline --decorate [#nc442e88] $ git checkout master $ git log --oneline --decorate 09a6a5a (HEAD -> master, dev3, dev) dev commit 9210c21 dev commit 3fc335e dev commit 0e46a27 (dev6, dev5, dev4, dev2) dev2 commit e97cefa dev2 commit c39d327 dev2 commit 366da11 master commit ** リビジョン番号からBranch git checkout -b [ブランチ名] [リビジョン番号] [#aab87e06] $ git show dev4 commit 0e46a2730ab69f1a270ce92bee88fc9eda97538a ... 略 $ git checkout -b dev_dest 0e46a2730ab69f1a270ce92bee88fc9eda97538a 枝分かれのブランチっても、作成した瞬間はおなじ状態です。 $ git show dev4 commit 0e46a2730ab69f1a270ce92bee88fc9eda97538a .. $ git show dev_dest commit 0e46a2730ab69f1a270ce92bee88fc9eda97538a .. 単なる別名って感じでしょうか。 ** コミットをまとめる git merge --squash [#z70aaf13] dev_#35_spike でチマチマコミットしていた内容を dev_#35 へまとめる対応 # git checkout dev_#35 <- チケット番号のイメージ # git merge --squash dev_#35_spike **addしないでコミット [#uc88ddd1] git commit -a 新規作成されたファイルはだめで、素直に git add xxx.txt とかやりましょう **リモートのブランチの削除 [#o7f554bf] [[Githubのブランチ削除 - Qiita>http://qiita.com/kwgch/items/98bbaae8e9f40a9548e0]] **ローカルのブランチの削除 git branch -d [#m06eba01] > git branch * dev-spike master > git checkout master Switched to branch 'master' Your branch is up-to-date with 'origin/master'. > git branch -d dev-spike Deleted branch dev-spike (was c5776c5). > git branch * master 消えました [[4. ブランチを削除する【チュートリアル1 ブランチを使ってみよう】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ>http://www.backlog.jp/git-guide/stepup/stepup2_5.html]] **GitHubのページに出てた、Gitのコマンド(Get Startedみたいなヤツ)。。 [#nc21142c] GitHubから初期状態をCloneするやり方ではなく、ローカルで作ったリポジトリをリモートにつなげるやり方です。 touch README.md git init //ローカルリポジトリの初期化 git add README.md //ローカルへ追加 git commit -m "first commit" //ローカルへコミット git remote add origin https://github.com/masatomix/Hello-World.git //既に存在するリモートのリポジトリを指定し、それにorigin って名前をつける git push -u origin master //リモートリポジトリにローカルの情報を反映 こんな意味って感じ? **push の -u オプション [#m77f09b1] push の -u オプションは、追跡ブランチを設定するコマンドで、 $ git branch -vv * master e54f1e4 first $ git push origin master Counting objects: 3, done. Writing objects: 100% (3/3), 216 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To https://github.com/masatomix/helloworld1.git * [new branch] master -> master $ git branch -vv * master e54f1e4 first とプッシュしても、追跡ブランチを設定しないままとするか $ git push -u origin master Branch master set up to track remote branch master from origin. Everything up-to-date $ git branch -vv * master e54f1e4 [origin/master] first $ と指定したリモートブランチを追跡ブランチとして設定するか、の違いがあります。 **名前が違うリモートブランチへのプッシュ [#h1401292] $ git branch -vv * develop1 bd5e49a [origin/master] Initial commit ← develop1 は origin/master をプッシュ先指定されている master 86c2453 [origin/master: ahead 1] develop $ git config --global push.default upstream ←デフォルトをupstream に(--set-upstream-to で指定されたブランチを参照) $ git push origin develop1 Everything up-to-date ← develop1は origin/master にプッシュしにいって、空振りした。 $ git config --global push.default simple ←デフォルトをsimple に変更する $ git push origin develop1 Total 0 (delta 0), reused 0 (delta 0) To https://github.com/masatomix/hello.git * [new branch] develop1 -> develop1 ← プッシュ先は自分の名前と同じモノになった。 $ どうもこの push.default 自体のデフォルト値が Gitクライアントのバージョンによって違うらしく((macOS Sierraは2.0でsimpleがデフォ))環境によって挙動が違うポイのでご注意。。 参考 -[[git push引数省略時のデフォルト動作設定 - Qiita>http://qiita.com/dehali22/items/09cc89ed87f022668d80#_reference-1f6ac4b2abec1b44b4c3]] -[[gitのpush.defaultに関するノウハウ - Qiita>http://qiita.com/awakia/items/6aaea1ffecba725be601]] **関連リンク [#wf62dfd7] -[[Git - Downloads>http://git-scm.com/downloads]] -[[Gitリモートリポジトリ構築 CapmNetwork>http://capm-network.com/?tag=Git%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E6%A7%8B%E7%AF%89]] -[[Git がわからなくても Github を利用しよう - そんなこと覚えてない>http://blog.eiel.info/blog/2013/02/06/how-to-use-github/]] -[[サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ>http://www.backlog.jp/git-guide/]] -[[すぐ分かる! git の origin と master ってなんだ? - Qiita>http://qiita.com/hshimo/items/99811144bf4a081319e5]] -[[Git - 変更内容のリポジトリへの記録>http://bit.ly/1YiOXgJ]] ---- この記事は #vote(おもしろかった,そうでもない) #comment #topicpath SIZE(10){現在のアクセス:&counter;}