// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents

*** アップロードした鍵検証 [#ib1e75e2]
 ssh -T git@github.com -i ~/.ssh/秘密鍵名

パスフレーズを入れた後
 Hi m-kino! You've successfully authenticated, but GitHub does not provide shell access.
とかでればOK!


*** 間違ったコミットをなかったことにする [#r79e04ef]
 # git reset --soft HEAD^   ←一つ戻す。ワークスペースは戻さない
 # git reset --hard HEAD^   ←一つ戻す。ワークスペースも戻す。

どちらも積み上げたコミットを削除するので、プッシュしちゃってるといろいろおかしな事になりそうですね。。。



***.gitignoreの自動生成。 [#j51a501e]

[[gitignore.io - Create Useful .gitignore Files For Your Project>https://www.gitignore.io/docs]]

***なにもない空のコミットを実行 [#lf7b634d]
 git commit --allow-empty -m '空コミット!'

*** コマンドのエイリアスをつける [#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ブランチモデルについて ::ハブろぐ>https://havelog.ayumusato.com/develop/git/e513-git_branch_model.html]] Git-Flowとは限定してないが開発スタイル
-[[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/]]
-[[git-flow cheatsheet>http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html]]



**コマンド基本 [#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]]


mavenを使うプロジェクトの場合、gitflow-maven-plugin を入れることで、releaseブランチの作成,verのSNAPSHOTを削除してコミット、masterとdevelopへのマージとtagづけ、でdevelop上でverの数字をインクリメントしてSNAPSHOTのsuffixをつけてコミット、を自動化できます。

具体的には
 $ mvn gitflow:release-start
でリリースブランチが作成され((この時点でpom.xmlのSNAPSHOTが消される))、たとえば
 $ mvn clean deploy
などでMavenリポジトリにリリースしたあと
 $ mvn gitflow:release-finish
とすればOKです。


**コンフリクトした場合の対処 [#e99dbcc2]
*** Mergeでコンフリクト [#x4e98d84]
git merge したときに、マージ先のブランチでおなじファイルをいじっていたばあいなど、単純なマージではいかない場合は人間が競合を取り除くコミットを手動で行うことで、マージ処理を行います。それについてはこちらに詳しく書いてありますのでそちらをご参照のこと。

[[6. マージでの衝突を解決する>http://www.backlog.jp/git-guide/stepup/stepup2_7.html]]

 # git checkout dest
 # git merge source     <- dest ブランチ にsource ブランチをマージ。ココでコンフリクトした場合、
 # 基本は普通に競合したファイルを修正し、
 # git add Hoge.java
 # git commit -m 'merge commit'

***rebaseでコンフリクト [#f6e56e7d]
リベースでコンフリクトした場合の参考になるリンクはこちら。

-[[git rebaseでのブランチ融合でコンフリクト解消 - Qiita>http://qiita.com/shizuma/items/82bb439e8899c1bd3114]]


 # git checkout dest
 # git rebase source     <- dest ブランチ をsource ブランチでリベース。ココでコンフリクトした場合、
 # 基本は普通に競合したファイルを修正し、
 # git add Hoge.java  ←あ、これ修正しているソースです
 # git rebase --continue

とするようです。((まだちゃんと検証できてませーーん))





**関連リンク [#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;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS