- 追加された行はこの色です。
- 削除された行はこの色です。
// 下階層用テンプレート
#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!
** コミットを一つにまとめる [#k6ac16c1]
*** 間違ったコミットをなかったことにする [#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にエディタの情報を追記しておきます。
**リビジョン番号の確認、HEADの位置の確認 [#nc442e88]
$ 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作成 [#x56bbec7]
$ git branch dev_dest dev_source
$ git checkout -b dev_dest dev_source <-作成 & 移動
dev_sourceのリビジョンを元に、dev_destブランチを作成します。
** リビジョン番号からBranch [#aab87e06]
** リビジョン番号から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
..
単なる別名って感じでしょうか。
** コミットをまとめる [#z70aaf13]
** コミットをまとめる git merge --squash [#z70aaf13]
dev_#35_spike でチマチマコミットしていた内容を dev_#35 へまとめる対応
# git checkout dev_#35 <- チケット番号のイメージ
# git merge --squash dev_#35_spike
**違う名前のリモートブランチにプッシュする [#oe1264d1]
> git checkout -b dev-spike
> git branch -a
* dev-spike
master
remotes/origin/HEAD -> origin/master
remotes/origin/master
> git push origin dev-spike:dev-spike1
To https://github.com/masatomix/hello.git
* [new branch] dev-spike -> dev-spike1
**addしないでコミット [#uc88ddd1]
git commit -a
新規作成されたファイルはだめで、素直に git add xxx.txt とかやりましょう
**リモートのブランチの削除 [#o7f554bf]
[[Githubのブランチ削除 - Qiita>http://qiita.com/kwgch/items/98bbaae8e9f40a9548e0]]
**ローカルのブランチの削除 [#m06eba01]
**ローカルのブランチの削除 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;}