回答編集履歴
3
勘違いしてた
test
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
-
|
1
|
+
可能です。
|
2
|
+
参考記事: [【Git】別のブランチにpushしたいとき - Qiita](https://qiita.com/yonce/items/b09f35ab301befde7803)
|
2
3
|
|
4
|
+
pushコマンドのブランチ名を省略無しにする必要があります。
|
5
|
+
`git push origin test:master`
|
6
|
+
|
7
|
+
Gitにおける`push`コマンドはのブランチ名の箇所に関しては
|
8
|
+
省略せずに記述すると`ローカルのブランチ名:リモートのブランチ名`となります。
|
9
|
+
省略してブランチ名だけ記述すると勝手に`master:master`等のようになります。
|
10
|
+
|
3
|
-
実際に私がローカルで適当なファイルをコミットして試した履歴が下記になります
|
11
|
+
失敗パターンとして実際に私がローカルで適当なファイルをコミットして試した履歴が下記になります
|
4
12
|
(一部マスキングしています)
|
5
13
|
|
6
14
|
```bash
|
@@ -20,10 +28,24 @@
|
|
20
28
|
Total 0 (delta 0), reused 0 (delta 0)
|
21
29
|
To github.com:xxxx/xxxx.git
|
22
30
|
ef3ba37..8b7ef5f master -> master
|
31
|
+
|
32
|
+
|
23
33
|
```
|
24
34
|
|
25
35
|
このようにtest -> masterはPushが出来ませんでしたが、
|
26
36
|
master -> masterのPushは成功しました。
|
37
|
+
なので一旦状況を戻して`test:master`のブランチ指定を試してみます。
|
27
38
|
|
39
|
+
```bash
|
40
|
+
# masterを元のコミットに復旧させtestブランチにカレントブランチを変更
|
28
|
-
|
41
|
+
$ git reset [元のコミットID]
|
42
|
+
$ git push -f origin master
|
43
|
+
$ git checkout test
|
44
|
+
|
29
|
-
|
45
|
+
$ git push origin test:master
|
46
|
+
Total 0 (delta 0), reused 0 (delta 0)
|
47
|
+
To github.com:xxxx/xxxx.git
|
48
|
+
ef3ba37..8b7ef5f test -> master
|
49
|
+
```
|
50
|
+
|
51
|
+
無事成功しました。
|
2
冒頭の説明文を改良
test
CHANGED
@@ -1,106 +1,29 @@
|
|
1
|
-
プルリクエストというのはGitHubというSNSサービスの機能を利用した
|
2
|
-
「マージしてくれ頼む」という依頼ですので
|
3
|
-
|
1
|
+
不可能です。
|
4
2
|
|
5
|
-
`test`→`master`ならば
|
6
|
-
|
3
|
+
実際に私がローカルで適当なファイルをコミットして試した履歴が下記になります
|
7
|
-
`master`→`test`ならばその逆ですね。
|
8
|
-
`master`は`test`が所持していないコミット履歴を所持している必要があります。
|
9
|
-
|
10
|
-
---
|
11
|
-
|
12
|
-
基本的には開発初期のタイミングでなければ、
|
13
|
-
masterブランチは本番環境や客先等で既に稼働しているものを指します。
|
14
|
-
受け専みたいなところがあるので多くの場面ではmasterから他のブランチへPRを出すような状況になる事はほぼありません。
|
15
|
-
|
16
|
-
ただし、あるかもしれないというケースはあります。
|
17
|
-
git-flowというブランチ戦略ではmasterから別ブランチへマージするフローが存在します。
|
18
|
-
master環境で出た緊急性の高い不具合を修正する為に、master→hotfix→masterという別口でmasterブランチのコミット履歴を進める事があります。
|
19
|
-
なのでmasterとdevelopが相互で所持していないコミット履歴が生まれるので、master→developのマージが発生します。
|
20
|
-
これをPRでやる現場ルールがあれば、masterからPRを出す唯一のレアケースになりえます。
|
21
|
-
|
22
|
-
---
|
23
|
-
|
24
|
-
ここからはどういう状況でマージが必要な状況になるのかを
|
25
|
-
ス
|
4
|
+
(一部マスキングしています)
|
26
|
-
|
27
|
-
> ローカル側に、masterとtestとの2つのブランチがあり、GitHub側にもmasterとtestの2つのブランチがあります。
|
28
|
-
|
29
|
-
ローカルにあるmasterとtestのブランチはGitHubにPush済みであり、
|
30
|
-
それぞれのmasterとtestの同一ブランチ名同士は全く同じコミット履歴になっているとします。
|
31
|
-
|
32
|
-
プロジェクトというのは全くファイルがない真っ白な状態から、
|
33
|
-
ファイルを追加・変更するコミット履歴を1個ずつ積み上げて
|
34
|
-
最終的に顧客の要望しているシステム、自社製品としてマネタイズ出来るシステムを目指すものです。
|
35
|
-
|
36
|
-
この1個1個の積み上げる「コミット履歴」が「≒目的」と言える状態なわけですね。
|
37
|
-
こいつらを例として使う為に連番として「コミット履歴A」「コミット履歴B」と名付けて行きます。
|
38
|
-
|
39
|
-
ブランチ管理戦略の「git-flow」「GitHub Flow」はどちらも`master`ブランチが本番環境で動作している
|
40
|
-
表に出せる最新のファイル構造である状態であるべきです。
|
41
|
-
|
42
|
-
`master`ブランチは真っ白な何もファイルが存在しない状態から始まり、
|
43
|
-
「コミット履歴A」から順番に積み上げられ、
|
44
|
-
A、B、C、D、Eが含まれた状態になっています。
|
45
|
-
|
46
|
-
ここまでが前提条件
|
47
|
-
|
48
|
-
`test`コード書いて自動テストがしたいよね。
|
49
|
-
こういう目的で`A、B、C、D、E`のコミット履歴が詰まった`master`ブランチから枝分かれさせて作りました。
|
50
|
-
テストコードを追加して自動テストが出来るじゃんやったね!これで「コミット履歴F」を作って積み上げました。
|
51
|
-
この「コミット履歴F」を追加した状態の`test`ブランチをGitHubにPushしました。
|
52
|
-
|
53
|
-
この状態であれば、`test`→`master`にプルリクエストを飛ばす事が可能です。
|
54
|
-
その目的はテストコードを追加した「コミット履歴F」を`master`ブランチに入れてくれ。というものになります。
|
55
|
-
|
56
|
-
しかし逆の`master`→`test`のプルリクエストは出来ません。何故か?
|
57
|
-
`master`ブランチがこれまで積み重ねた歴史「A、B、C、D、E」は全て`test`ブランチに含まれています。
|
58
|
-
何のコミット履歴を`test`ブランチへ追加してほしいんだい?何も無ければマージ出来ないんだからPRも出せないぞ。
|
59
|
-
|
60
|
-
これを「`test`ブランチは`master`ブランチよりも進んでいる」と表現したりします。
|
61
|
-
|
62
|
-
---
|
63
|
-
|
64
|
-
次に`master`から`test`ブランチPRが出せるケースに関して考えていきましょう。
|
65
|
-
|
66
|
-
Gitではブランチを分けることで同時並行の開発が可能となります。
|
67
|
-
いちいちファイルをロックしなくて良いのは便利ですね。
|
68
|
-
|
69
|
-
あなたがテストコードを追加する`test`ブランチを枝分かれさせ「コミット履歴F」を作っている間に、
|
70
|
-
別作業者の方が新機能の`feature`ブランチを作って「コミット履歴G」を作って
|
71
|
-
`feature`→`master`ブランチにプルリクエストを作って、無事マージされました。
|
72
|
-
|
73
|
-
この場合状況が込み入った事になります。
|
74
|
-
|
75
|
-
- master: A, B, C, D, E, G
|
76
|
-
- test: A, B, C, D, E, F
|
77
|
-
|
78
|
-
お互いがお互いに存在しないコミット履歴が積み上がった状態になっているわけですね。
|
79
|
-
この時Gitでは双方向でマージすることが可能となりますし、
|
80
|
-
プルリクエストも双方向で飛ばす事が可能となります。
|
81
|
-
|
82
|
-
でもまぁ、基本的には`test`は`master`から一時的にファイルを作る為に枝分かれさせた存在です。
|
83
|
-
なので「なんでコミット履歴Gを持ってないんだい?」と言われる立場です。
|
84
|
-
`master`から`test`に「このコミット履歴Gを追加してくださいお願いします!」という立場ではないので、依頼する事はgit-flowでもない限り基本的にはありえないと言って良いでしょう。
|
85
|
-
|
86
|
-
この場合、`test`ブランチは`master`ブランチにあるコミット履歴を落としてきて下に滑り込ませ、
|
87
|
-
A, B, C, D, E, G, Fのコミット履歴の並びを作って、改めて`test`→`master`にPRを飛ばす事になるでしょう。
|
88
|
-
コマンドの流れはこんな感じになります。
|
89
5
|
|
90
6
|
```bash
|
7
|
+
# テストブランチ作ってコミット履歴を進めてみる
|
8
|
+
$ git checkout -b test
|
91
|
-
$ git
|
9
|
+
$ git add .
|
92
|
-
|
10
|
+
$ git commit -m "tmp"
|
93
|
-
master
|
94
11
|
|
95
|
-
#
|
12
|
+
# 別ブランチからのPushを試してみる
|
13
|
+
$ git push origin master
|
14
|
+
Everything up-to-date
|
15
|
+
|
16
|
+
# testブランチの情報を取り込みmasterブランチでのPushを試してみる
|
96
17
|
$ git checkout master
|
18
|
+
$ git merge test
|
97
|
-
$ git pu
|
19
|
+
$ git push origin master
|
20
|
+
Total 0 (delta 0), reused 0 (delta 0)
|
98
|
-
|
21
|
+
To github.com:xxxx/xxxx.git
|
22
|
+
ef3ba37..8b7ef5f master -> master
|
23
|
+
```
|
99
24
|
|
25
|
+
このようにtest -> masterはPushが出来ませんでしたが、
|
100
|
-
|
26
|
+
master -> masterのPushは成功しました。
|
101
|
-
$ git rebase master
|
102
27
|
|
103
|
-
|
28
|
+
これは単にGitHubのセキュリティ上の制約として
|
104
|
-
|
29
|
+
別ブランチからのPushを許さないようにしているだけだと考えられます。
|
105
|
-
$ git push -f origin test
|
106
|
-
```
|
1
test
CHANGED
@@ -1,17 +1,30 @@
|
|
1
|
+
プルリクエストというのはGitHubというSNSサービスの機能を利用した
|
1
|
-
|
2
|
+
「マージしてくれ頼む」という依頼ですので
|
2
|
-
`master`から別ブランチへマージするケースがあります。
|
3
|
-
|
3
|
+
マージが出来る状況ならば使えます。
|
4
4
|
|
5
|
+
`test`→`master`ならば
|
5
|
-
|
6
|
+
`test`は`master`が所持していないコミット履歴を所持している必要があります。
|
6
|
-
|
7
|
+
`master`→`test`ならばその逆ですね。
|
8
|
+
`master`は`test`が所持していないコミット履歴を所持している必要があります。
|
7
9
|
|
10
|
+
---
|
11
|
+
|
12
|
+
基本的には開発初期のタイミングでなければ、
|
13
|
+
masterブランチは本番環境や客先等で既に稼働しているものを指します。
|
14
|
+
受け専みたいなところがあるので多くの場面ではmasterから他のブランチへPRを出すような状況になる事はほぼありません。
|
15
|
+
|
16
|
+
ただし、あるかもしれないというケースはあります。
|
17
|
+
git-flowというブランチ戦略ではmasterから別ブランチへマージするフローが存在します。
|
18
|
+
master環境で出た緊急性の高い不具合を修正する為に、master→hotfix→masterという別口でmasterブランチのコミット履歴を進める事があります。
|
19
|
+
なのでmasterとdevelopが相互で所持していないコミット履歴が生まれるので、master→developのマージが発生します。
|
20
|
+
これをPRでやる現場ルールがあれば、masterからPRを出す唯一のレアケースになりえます。
|
21
|
+
|
22
|
+
---
|
23
|
+
|
8
|
-
|
24
|
+
ここからはどういう状況でマージが必要な状況になるのかを
|
9
|
-
|
25
|
+
ストーリー仕立てで解説していきます。
|
10
26
|
|
11
27
|
> ローカル側に、masterとtestとの2つのブランチがあり、GitHub側にもmasterとtestの2つのブランチがあります。
|
12
|
-
|
13
|
-
ケースバイケースなので噛み砕く必要があるので、
|
14
|
-
前提条件を整理していきます。
|
15
28
|
|
16
29
|
ローカルにあるmasterとtestのブランチはGitHubにPush済みであり、
|
17
30
|
それぞれのmasterとtestの同一ブランチ名同士は全く同じコミット履歴になっているとします。
|
@@ -29,6 +42,8 @@
|
|
29
42
|
`master`ブランチは真っ白な何もファイルが存在しない状態から始まり、
|
30
43
|
「コミット履歴A」から順番に積み上げられ、
|
31
44
|
A、B、C、D、Eが含まれた状態になっています。
|
45
|
+
|
46
|
+
ここまでが前提条件
|
32
47
|
|
33
48
|
`test`コード書いて自動テストがしたいよね。
|
34
49
|
こういう目的で`A、B、C、D、E`のコミット履歴が詰まった`master`ブランチから枝分かれさせて作りました。
|