回答編集履歴

3

勘違いしてた

2022/02/14 14:06

投稿

miyabi-sun
miyabi-sun

スコア21158

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
- これは単にGitHubセキュリティ上の制約として
41
+ $ git reset [元コミットID]
42
+ $ git push -f origin master
43
+ $ git checkout test
44
+
29
- 別ブランチからのPushを許さないようにしているだけだと考えられます。
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

冒頭の説明文を改良

2022/02/14 13:58

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -1,106 +1,29 @@
1
- プルリクエストというのはGitHubというSNSサービスの機能を利用した
2
- 「マージしてくれ頼む」という依頼ですので
3
- マージが出来る状況ならば使えます。
1
+ 不可能です。
4
2
 
5
- `test`→`master`ならば
6
- `test`は`master`所持していコミット履歴を所持している必要ります
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 branch
9
+ $ git add .
92
- * test
10
+ $ git commit -m "tmp"
93
- master
94
11
 
95
- # masterブランチを更新
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 pull origin master
19
+ $ git push origin master
20
+ Total 0 (delta 0), reused 0 (delta 0)
98
- $ git checkout test
21
+ To github.com:xxxx/xxxx.git
22
+ ef3ba37..8b7ef5f master -> master
23
+ ```
99
24
 
25
+ このようにtest -> masterはPushが出来ませんでしたが、
100
- # masterが持っている新しいコミット履歴を、testブランチの下に滑り込せる
26
+ master -> masterのPushは成功しした。
101
- $ git rebase master
102
27
 
103
- # testブランチコミット履歴下にぶら下げたこでコミット履歴の改ざんがされいるので
28
+ これは単にGitHubセキュリティ上制約
104
- # testブランチをForceオプションを利用して強制Pushす
29
+ ブランチからのPushを許さないようにしているだけだと考えられま
105
- $ git push -f origin test
106
- ```

1

2022/02/14 10:29

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -1,17 +1,30 @@
1
+ プルリクエストというのはGitHubというSNSサービスの機能を利用した
1
- 実はgit-flowというブランチ戦略
2
+ 「マージしてくれ頼む」という依頼すので
2
- `master`から別ブランチへマージするケースがあります。
3
- hotfix適用行われ度にそうますしね
3
+ マージ出来状況らば使えます。
4
4
 
5
+ `test`→`master`ならば
5
- プルリクエストというの「マージしてくれ頼む」とうSNS機能利用た依頼でので
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`ブランチから枝分かれさせて作りました。