Top / GitHub / TIPS集

アップロードした鍵検証

ssh -T git@github.com -i ~/.ssh/秘密鍵名

パスフレーズを入れた後

Hi m-kino! You've successfully authenticated, but GitHub does not provide shell access.

とかでればOK!

間違ったコミットをなかったことにする

# git reset --soft HEAD^   ←一つ戻す。ワークスペースは戻さない
# git reset --hard HEAD^   ←一つ戻す。ワークスペースも戻す。

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

.gitignoreの自動生成。

gitignore.io - Create Useful .gitignore Files For Your Project

なにもない空のコミットを実行

git commit --allow-empty -m '空コミット!'

コマンドのエイリアスをつける

$ cat ~/.gitconfig
...
[alias]
	co = checkout
	b = branch
	logg = log --decorate --oneline --graph
$

これで git co , git b , git logg とかでコマンドを実行できる。

Git Flow/GitHub Flow 整理中

コマンド基本

リポジトリからマスターをClone

git clone https://github.com/masatomix/ui-router-sample.git     ←URLは例
cd  ui-router-sample

ブランチを切替

git branch   一覧をみる
git branch dev  作成する
git checkout dev 切替える

いろいろ修正、そのあとコミット

git diff  ←差分チェック
git commit

コミットされた*1

リポジトリへプッシュ

git push origin dev

ステータスのチェック

git status

git branch まわりの覚え書き。

$ 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

$ git branch
* master

リモートブランチの表示 git branch -r

$ git branch -r
  origin/HEAD -> origin/master
  origin/dev
  origin/dev2
  origin/master

どっちも表示 git branch -a

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev
  remotes/origin/dev2
  remotes/origin/master

追跡ブランチも表示 git branch -vv

$ git branch -vv
* master 5e1dd3a [origin/master] Merge pull request #5 from masatomix/dev

この状態で

git push origin master

すると、origin/master へプッシュされます

リモートのブランチから、ローカルブランチを作成する1 git checkout -b

$ 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

$ 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

$ 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

$ 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

ローカルブランチからローカルブランチを作成1 git checkout -b

$ 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

$ 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

$ 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

$ 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オプションで同名ブランチを作成する場合*2は、自動で追跡ブランチが設定されますが、ローカルからブランチする場合は、追跡ブランチは設定されない、という事が分かります。

ちなみに、追跡ブランチが存在しない、この状態で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 - リモートブランチ

コミットを一つにまとめる git rebase -i

$ 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

$ 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 [ブランチ名] [リビジョン番号]

$ 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

dev_#35_spike でチマチマコミットしていた内容を dev_#35 へまとめる対応

# git checkout dev_#35  <- チケット番号のイメージ
# git merge --squash dev_#35_spike

addしないでコミット

git commit -a

新規作成されたファイルはだめで、素直に git add xxx.txt とかやりましょう

リモートのブランチの削除

Githubのブランチ削除 - Qiita

ローカルのブランチの削除 git branch -d

> 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入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ

GitHubのページに出てた、Gitのコマンド(Get Startedみたいなヤツ)。。

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 オプション

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
$

と指定したリモートブランチを追跡ブランチとして設定するか、の違いがあります。

名前が違うリモートブランチへのプッシュ

$ 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クライアントのバージョンによって違うらしく*3環境によって挙動が違うポイのでご注意。。

参考

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

具体的には

$ mvn gitflow:release-start

でリリースブランチが作成され*4、たとえば

$ mvn clean deploy

などでMavenリポジトリにリリースしたあと

$ mvn gitflow:release-finish

とすればOKです。

コンフリクトした場合の対処

Mergeでコンフリクト

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

6. マージでの衝突を解決する

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

rebaseでコンフリクト

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

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

とするようです。*5

関連リンク


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / GitHub / TIPS集

現在のアクセス:555


*1 not stagedなファイルがあれば -a オプションつける
*2 これは、git checkout -b dev3 origin/dev などとローカルブランチ名を指定しながらブランチする場合も同様で自動で追跡される。
*3 macOS Sierraは2.0でsimpleがデフォ
*4 この時点でpom.xmlのSNAPSHOTが消される
*5 まだちゃんと検証できてませーーん

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-06-13 (水) 09:21:39 (35d)