狠狠撸

狠狠撸Share a Scribd company logo
図解 gitworkflows(7)
@ktateish
gitworkflows(7)とは?
Gitプロジェクト自体で使われているワークフローで
す。
詳細はGitとともに配布されているオンラインマニュ
アル gitworkflows(7) にあります。
なぜgitworkflowsなのか?
● 統合ブランチにpush -fできる
● トピックを気軽にマージできる
● masterを安定させ、綺麗な歴史を残せる
● 開発者の人数に対してスケーラブル
Gitをつかうとコミットやトピックブランチを好きなよう
に修正できますが、gitworkflowsを使うと統合ブラ
ンチに対しても好きなように修正できるようになりま
す。
このスライドでは
簡単なコミットグラフの図を使ってgitworkflows※
を解説します。
このワークフローは少しややこしいのですが、図に
よってわかりやすくなると思います。
では始めます。
※ このスライドはgitworkflows(7)の私の解釈に基づくので、 git.gitで使われている実際のワークフローとは
少しちがうかもしれません。
ここにイニシャルコミットがあります。
ここから始めましょう。
master
これは ‘master’ ブランチ
これは ‘master’ ブランチ
最初のリリースにむけて3つのトピック(A, B, C)が必要だとし
ます
A
B
C
これらのブランチを成長させて…
A
B
C
完成しました。
master に統合します?
いいえ、‘master’ はトピックが一度マージされ(、公開リポジト
リにpushされ)るとresetできません。
かわりに「使い捨て」統合ブランチを使います。
‘pu’ はその使い捨て統合ブランチの名前です。puは
‘Proposed Update’ の略です。
pu
‘pu’ は使い捨てでない、最も進んだブランチの先端から分岐させ
ます。今回の場合 ‘master’ が適切でしょう。
(git branch pu masterでできます)
トピックブランチをマージしていきます。Aと…
(checkout pu および merge topic-A)
merge
続いて B ...
merge
それから C を ‘pu’ にマージします。
merge
マージしたらテストします。特に(各ブランチではテストできない)
マージしたトピック/機能同士の相互作用?影響などについてテ
ストします。
ちなみに ‘pu’ は、必要があれば公開リポジトリにpushして構い
ません。(push origin pu)
例えばCIサーバがテストを走らせるのに公開リポジトリを監視し
ていて、そこにpushしたい場合などです。
3つのトピックを統合した状態の ‘pu’ にはバグや足りない機
能などが見つかるかもしれません。
トピック A にそういったバグがひとつ見つかりました。そのよ
うな問題はトピックAで修正します。
commit
他の問題等に対しても、それぞれのブランチ上にコミットを追
加したり修正したりします。
commit
ひきつづき ‘pu’ にマージする?
いいえ。 ‘pu’ は使い捨て統合ブランチです。
ですから、‘pu’ を ‘master’ にリセットします。
(checkout pu および reset --hard master を実
行)
reset
これで古い ‘pu’ は捨てられます。.
続いてマージをやり直し…
merge
続いてマージをやり直し…
merge
続いてマージをやり直し…
merge
これで3つのトピックを綺麗にマージした ‘pu’ になりました。
全ての開発者は ‘pu’ の上で作業できないことに注意してくだ
さい。全てのトピックは ‘master’ から分岐する必要がありま
す。
リセットしない場合、結果として得られるブランチ / コミットグラフ
は、同じツリーにも関わらず少しややこしくなります。
この2つのコミットのツリーは同一
- with reset
- without reset
それでは新しい ‘pu’ を公開リポジトリにpushしてテストしましょ
う。
一度古い ‘pu’ をpushしていた場合、新しい ‘pu’ はoriginにある
古い ‘pu’ の直接の子孫ではないので、push -f origin pu
または push origin +pu する必要があります。
テストの後、A と B の機能は良く出来ていて安定していること、C
はそうでもないことがわかりました。
A と B は十分安定しているので ‘master’ にマージすることにし
ます。
トピック A と…
(checkout master と merge topic-A を実行)
merge
トピック A と B を ‘master’ にマージします。
merge
# トピック A, B はこのスライドではもう重要ではないので
# グレーアウトします
同時にCのバグが発見?修正されました。 ‘pu’ を再構築しましょ
う。
commit
再び ‘pu’ を ‘master’ にリセットします
(checkout pu と reset --hard master を実行)
reset
‘pu’ リセットするということは、古い ‘pu’ を捨てることになりま
す。
その后...
C をマージしたら、 ‘master’ と ‘pu’ を push します。
‘pu’ は強制 push が必要なので、次を実行します:
git push origin master +pu
(ブランチ名の前の ‘+’ は強制pushを意味します)
merge
トピックCを安定させるのにもう少し時間が欲しいので、最初
のリリースはすでに‘master’にマージされたふたつの機能で
作ることにします。
リリースを作成するには ‘master’ に注釈付きタグをつけます。
tag
v1.0.0
リリースタグの名前は ‘v1.0.0’ です。その後pushします
(tag -a ‘v1.0.0’ master および push origin
v1.0.0)
tag
v1.0.0 がリリースされました。
v1.0.0
リリース作成の後、新しく作成されたトピックを受け取りまし
た。 それらは ‘master’ から分岐しているはずです
new topics
新しいトピックはよく出来たものもあれば、そうでないものもあ
ります(何か壊しているかも)
というわけで、新しいトピックはまず ‘pu’ にマージします。
merge
もうひとつのトピックも ‘pu’ にマージし、pushします。
merge
テストすると3つのアクティブなブランチのうち、2つは良さそう
なことがわかりました。しかし、少し心配事があります...
Good
Good
心配事とは: - 実装は安定しているか
- 良い設計になっているか
- そもそもその機能は必要なのか
等です
一見よさそうでしばらく変更もしないトピックを ‘pu’ に保持して
おくのは面倒ですが、もしかしたら変更?削除する可能性もあ
るので、 ‘master’ にマージするのもためらわれます。
言い換えると、安定化?テストあるいはプレビューのための統合
ブランチがあると嬉しいのです。
‘next’ はそのような統合ブランチです。これは使い捨てとそう
でないブランチのハイブリッドなブランチであり、開発者にア
ナウンスすればresetも可能です(高頻度にはできませんが)
next
tag
‘next’ は ‘master’ から分岐させます。
(branch next master)
古いアクティブトピックのCからマージして... (checkout
next and merge topic-C)
merge
新しいブランチ(D)もマージします。
merge
さて、 ‘pu’ は常に最も進んだ非-使い捨てブランチから分岐させる
のでした
というわけで今回は ‘pu’ を ‘next’ の上に再構築します
(checkout pu and reset --hard next)
reset
古い ‘pu’ は(そのうち)削除され...
その后...
残りの新トピック(E)をマージします
merge
そうしたら ‘next’ と ‘pu’ をpushします
(push origin next +pu)
統合マネージャを含め、全ての開発者は ‘next’ の上で作業
できないことに注意してください。全ての機能ブランチは
‘master’ から分岐させるべきです。
ところで ‘next’ と ‘pu’ の違いは何でしょうか?
‘pu’ は簡単に捨てられますが、‘next’ はそうではありません
例えば ‘pu’ にのみマージされたあるトピックにバグがあり、それ
を修正したとします…
commit
その場合、単に ‘pu’ を ‘next’ にresetして…
(checkout pu and reset --hard next)
reset
その後そのトピックの新しい先端をマージします
(つまり ‘pu’ を巻き戻して再構成します)
merge
一方、‘next’ にあるトピックもうひとつバグがあった場合...
commit
‘next’ はresetできないので、この場合は現在の ‘next’ の上
にそのトピックの新しい先端をマージします…
こんな感じです
merge
そして ‘pu’ を新しい ‘next’ の上に再構築します
reset and
merge
トピックDの新しいブランチヘッドは、必要があればまず ‘pu’
にマージすることもできるという点に注意してください。(例え
ば ‘next’ にマージするにはインパクトが大きい変更だったり
とか)
まず ‘pu’ にマージ
(+ push and test)
よさそうなら次に ‘next’
にマージし
‘pu’ を再構成。
これで前ページのコミットグ
ラフと同一です
こんどはまた別の状況です。新しいトピック(F)をマージした直
後です。
‘pu’ にあるトピックEが完全に壊れていることがわかりまし
た。Eの開発者はすぐには対応できません。こんなときは、単
に壊れているブランチを無視して ‘pu’ を再構成します。
Broken
‘pu’ をresetし....
reset
そして問題ないブランチだけを再度マージします。
merge
しばらくして壊れたブランチがrebase(修正)されたら…
rebased
rebased
topic
‘pu’ にそれをマージして終わりです。
rebased merge
‘next’にあるブランチ(C)が壊れているのを見つけ、それをし
ばらく修正ことができない場合…
Broken
ブランチ全体をrevertすべきです
(revert -m 1 <merge commit>)
revert
revert commit
reverted
merge
もちろん ‘pu’ を再構築して ‘next’ 共々pushします
reset and
merge
しばらくしてトピックCが修正され、rebaseされたら…
rebased
‘next’ にマージし...
merge
‘pu’ を再構築して ‘next’ と ‘pu’ をpushします
reset and
merge
繰り返しますが、 ‘next’ は ‘pu’ほど簡単にはresetするべきでな
いことに注意してください。‘next’ 上で何かをやり直したいのであ
れば、かわりにrevertするか再マージします。
ただし、‘next’ が汚れすぎてresetしたほうが良さそうだなという
場合は、開発者にアナウンス後にresetすることも可能です。
また、 機能リリース後に ‘next’ をresetする機会があるので、後
で見てみます。今は2回目のリリースに向けて開発を続けましょ
う
‘next’ にマージされたトピックが安定している / 良い設計だとわ
かったら、そのトピックを ‘master’ にマージします。
Good enough to be
merged into ‘master’
‘next’ にマージされたトピックが安定している / 良い設計だとわ
かったら、そのトピックを ‘master’ にマージします。
Good enough to be
merged into ‘master’
次のリリースに十分な機能が ‘master’ にマージされるまで ‘pu’ -
> ‘next’ -> ‘master’ のサイクルを反復します
new topic
次のリリースに十分な機能が ‘master’ にマージされるまで ‘pu’ -
> ‘next’ -> ‘master’ のサイクルを反復します
merge
次のリリースに十分な機能が ‘master’ にマージされるまで ‘pu’ -
> ‘next’ -> ‘master’ のサイクルを反復します
good enough
for master
次のリリースに十分な機能が ‘master’ にマージされるまで ‘pu’ -
> ‘next’ -> ‘master’ のサイクルを反復します
merge
次のリリースに十分な機能が ‘master’ にマージされるまで ‘pu’ -
> ‘next’ -> ‘master’ のサイクルを反復します
good enough
for next
次のリリースに十分な機能が ‘master’ にマージされるまで ‘pu’ -
> ‘next’ -> ‘master’ のサイクルを反復します
merge
reset and
merge
次のリリースに十分な機能が ‘master’ にマージされるまで ‘pu’ -
> ‘next’ -> ‘master’ のサイクルを反復します
new topic
次のリリースに十分な機能が ‘master’ にマージされるまで ‘pu’ -
> ‘next’ -> ‘master’ のサイクルを反復します
merge
次のリリースに十分な機能が ‘master’ にマージされるまで ‘pu’ -
> ‘next’ -> ‘master’ のサイクルを反復します
good enough
for next
次のリリースに十分な機能が ‘master’ にマージされるまで ‘pu’ -
> ‘next’ -> ‘master’ のサイクルを反復します
merge
reset and
merge
この ‘pu’ -> ‘next’ -> ‘master’ 順のマージ、つまり機能の下流へ
の伝搬は ‘graduate’ と呼ばれています。(訳すと「送り出し」で
しょうか)
残念ながら ‘master’ にマージされたトピックでさえ、バグが見つ
かることがあります。
これはそのトピック上で直すのでしょうか? いいえ、
a bug found
一旦 ‘master’ にトピックがマージされたら、それはもう ‘master’
の一部だと考えます。したがってそのバグの修正ブランチを
‘master’ の上に作ります。
fix-branch for the bug
修正ブランチはまず(必要に応じて ‘pu’ と) ‘next’ にマージし…
merge
reset and merge
その後、修正に問題がなさそうなら ‘master’ にマージします
merge
修正ブランチのコミットが些細なものの場合、その修正ブランチ
は ‘master’ にいきなりマージしても構いません。
fix-branch for the bug
修正ブランチのコミットが些細なものの場合、その修正ブランチ
は ‘master’ にいきなりマージしても構いません。
merge
でもその後 ‘master’ を ‘next’ にマージして、修正が ‘next’ にも
含まれるようにするのを忘れないでください。(‘master’ にマージ
されたトピックは ‘next’ にもマージされているので、きっとそのバ
グもあるはずだからです)
merge
reset and merge
バグ修正のシチュエーションとしてもうひとつあります。
もしリリース v1.0.0 にバグがあったら、どう対処すべきでしょう
か?
a bug found
‘master’で修正してv1.0.0のユーザはアップグレードさせる?
でもv1.0.0ユーザの中には‘master’にマージされている新しい機
能を使いたくない人もいます。
つまりバグ修正のためだけの統合ブランチが必要です。
‘maint’はそのようなブランチです。これは最新の機能リリース、
つまりv1.0.0から分岐させます
maint
create branch
修正ブランチは‘maint’から分岐させなければなりません。
‘master’やその他の上流のブランチから分岐させないでくださ
い。
fix-branch for the bug
もし‘master’ から‘maint’用修正ブランチを分岐させると...
*悪い例*
fix-branch for the bug
*WRONG*
修正ブランチを‘maint’にマージしたら、余計なトピックまでも
‘maint’にマージされてしまいます。こういった下流へのマージは
‘maint’を壊してしまいます。
*悪い例*
merge
*WRONG*
unintentionally
merged commits
この場合cherry-pickすることで対応は可能ですが、本来はブラ
ンチする場所に気をつけるべきです。
cherry-pick
対処策
そういうわけで修正ブランチは‘maint’から分岐させます。一般的
なルールとして、トピックブランチは、最終的にそのトピックをマー
ジする先の統合ブランチのうち、最も古い統合ブランチから分岐
させると良いでしょう。
fix-branch for the bug
‘maint’用の修正ブランチも、基本的にはいつものとおり、まず
‘next’ (または ‘pu’)にマージします。‘maint’は決してresetできな
いからです。
merge
reset and merge
その後‘next’上で問題なさそうなら‘maint’にマージします
merge
しかしながら...
もちろん修正が些細な場合は‘maint’に直接マージして構いませ
ん。
merge
修正を伝搬させるため、時々‘maint’は‘master’に、‘master’は
‘next’にマージします。周期的な上流へのマージは良い習慣で
す。
修正を伝搬させるため、時々‘maint’は‘master’に、‘master’は
‘next’にマージします。周期的な上流へのマージは良い習慣で
す。
merge
修正を伝搬させるため、時々‘maint’は‘master’に、‘master’は
‘next’にマージします。周期的な上流へのマージは良い習慣で
す。
修正を伝搬させるため、時々‘maint’は‘master’に、‘master’は
‘next’にマージします。周期的な上流へのマージは良い習慣で
す。
merge
修正を伝搬させるため、時々‘maint’は‘master’に、‘master’は
‘next’にマージします。周期的な上流へのマージは良い習慣で
す。
merge
修正を伝搬させるため、時々‘maint’は‘master’に、‘master’は
‘next’にマージします。周期的な上流へのマージは良い習慣で
す。
merge
修正を伝搬させるため、時々‘maint’は‘master’に、‘master’は
‘next’にマージします。周期的な上流へのマージは良い習慣で
す。
reset and merge
修正を伝搬させるため、時々‘maint’は‘master’に、‘master’は
‘next’にマージします。周期的な上流へのマージは良い習慣で
す。
いくつかの修正が‘maint’に蓄積されたら、修正リリースを公開し
ます。
修正リリースを作るには‘maint’にv1.0.1タグを打ち、pushしま
す。
v1.
0.1
tag
さて、その後しばらくして、新しい機能リリースを作ります。また、
このリリースではコードフリーズ期間を設けたいとします。
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
フリーズ中は修正ブランチ
のみマージする
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
fix
feature
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
feature
fix
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
feature
maintをマージするのは
OK
fix
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
feature
修正ブランチをマージする
のもOK
fix
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
feature
機能ブランチをマージして
はダメ
fix
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
feature
機能ブランチをマージして
はダメ
fix
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
feature
fix
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
feature
fix
普段ならmasterにマージ
しても問題ないほど安定し
ているとしても…
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
feature
機能ブランチは一切マージ
してはダメ
fix
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
feature
機能ブランチは一切マージ
してはダメ
fix
コードをフリーズするには、単に‘master’への機能トピックのマー
ジをやめ、‘maint’を含む修正トピックのみマージするようにすれ
ば良いです。
fix
feature
fix
‘master’をフリーズしている間も‘next’には機能トピックをマージ
可能です。つまりコードフリーズ中にも開発を止める必要はあり
ません。
機能ブランチを
マージしてOK
fix
feature
fix
‘master’をフリーズしている間も‘next’には機能トピックをマージ
可能です。つまりコードフリーズ中にも開発を止める必要はあり
ません。
修正ブランチの
マージもOK
fix
feature
fix
‘master’をフリーズしている間も‘next’には機能トピックをマージ
可能です。つまりコードフリーズ中にも開発を止める必要はあり
ません。
‘master’をフリーズしている間も‘next’には機能トピックをマージ
可能です。つまりコードフリーズ中にも開発を止める必要はあり
ません。
rebase
アクティブなトピックを
rebaseしてもよし
‘master’をフリーズしている間も‘next’には機能トピックをマージ
可能です。つまりコードフリーズ中にも開発を止める必要はあり
ません。
rebase
アクティブなトピックを
rebaseしてもよし
‘master’をフリーズしている間も‘next’には機能トピックをマージ
可能です。つまりコードフリーズ中にも開発を止める必要はあり
ません。
アクティブなトピックを
revertや削除するのも
OK
revert
‘master’をフリーズしている間も‘next’には機能トピックをマージ
可能です。つまりコードフリーズ中にも開発を止める必要はあり
ません。
アクティブなトピックを
revertや削除するのも
OK
コードフリーズ期間が終わりました。それでは機能リリースを作り
ましょう。
タグを打つ前に、‘maint’が完全に‘master’にマージされているこ
とを確認します。これには‘master’でgit merge maintすれ
ばOKです。 もしマージしなければ、新しいリリースからいくつか
の修正が漏れることになります。
この場合はすでにmaster
にマージされています。
それではリリースします。タグv1.1.0を‘master’に打ち、pushしま
す。
tag
v1.
1.0
新しいリリース作業が終わりました。しかし、機能リリースの後は
‘next’と‘maint’に対するいくつかのタスクが残っています。
‘next’から行きます。
まず‘next’を‘master’にresetします。
masterに
reset
失敗したときのた
めに、タグを残しま
す
その後、先ほどのリリースに含まれていなかったトピックで生き
残っているものを’next’にマージしていきます
(そして必要なら‘pu’を再構築します)
アクティブブラ
ンチをマージし
て…
その後、先ほどのリリースに含まれていなかったトピックで生き
残っているものを’next’にマージしていきます
(そして必要なら‘pu’を再構築します)
アクティブブラ
ンチをマージし
て…
その後、先ほどのリリースに含まれていなかったトピックで生き
残っているものを’next’にマージしていきます
(そして必要なら‘pu’を再構築します) reset前と同じであ
ることをdiffで確認し
ます
diff
その後、先ほどのリリースに含まれていなかったトピックで生き
残っているものを’next’にマージしていきます
(そして必要なら‘pu’を再構築します)
puを再構築
この巻き戻しと再構成は‘next’の歴史を綺麗にするためのもので
す。アナウンスすればいつでもできるのですが、機能リリース直
後は調度良いタイミングです。
この巻き戻しと再構成は‘next’の歴史を綺麗にするためのもので
す。アナウンスすればいつでもできるのですが、機能リリース直
後は調度良いタイミングです。
次に、‘maint’について見て行きましょう。
‘maint’のタスクはシンプルです。単に‘maint’を‘master’にFast-
forwardします。
Fast-Foward
to master
これには‘maint’上でgit merge --ff-only masterを実
行します。 もしこれが失敗するようなら、‘maint’には‘master’に
ないコミットがあるということですから、前回のリリースは修正が
いくつか入っていないことになります。
Fast-Foward
to master
もし既に示した通り、リリース前に‘maint’を‘master’にマージして
いれば、このFast-forwardは成功するはずです。
もし以前の機能リリース向けにメンテナンスブランチを保持した
いのであれば、maint-1.0のようなブランチを残しておくこともでき
ます。
maint-1.0
機能リリースの後は、これまでに示したのと同じワークフローを
繰り返します。以上が gitworkflows(7) です。開発を続けましょ
う。
New topic and...
まとめ (1/2)
● puのような使い捨て統合ブランチを使う
● まず使い捨て統合ブランチ(TA)にマージ
● masterにマージする前にTAでテストする
● nextのような、TAとそうでないブランチのハイブ
リッドな統合ブランチの使用も可能
● nextはアナウンスしてresetして良い
● masterとmaintはresetできない
まとめ (2/2)
● puまたはnext上で作業してはならない
● topicは最終的にマージされる統合ブランチのう
ち、もっとも古いものから分岐させる
● 統合ブランチを上流側へマージする
● 機能リリースはmasterにタグをつけて実施
● 修正リリースはmaintにタグをつけて実施
参考文献
● gitworkflows(7)
● Gitソースツリーの
Documentation/SubmittingPatches
● git.gitの‘todo’ブランチにあるMaintNote
● 濱野氏のブログ the Git Blame blog
Q and A
Q: nextとpuの違いは何?
A: 場合によります。
gitworkflows(7)にはpuつまり使い捨てブランチはトピックの相互
作用のテストのためだと書いてありますが、最近のgit.gitの
MaintNotesによるとメンテナ―用のリマインダーのようなものだ、
とあります。nextはどちらのドキュメントでもmasterに入れるため
のテスト/仕上げのためとのこと。
私はpuはワーキングスペース、nextはステージングエリアだと
思っています。Git自身のワーキングツリーとインデックスのような
感じです。
Q: {‘pu’, ‘next’, ‘maint’}を使わないといけない?
A: その必要はありません
必要な場合に作ればOKです。しかし、最低でも使い捨てブランチ
は使うことをオススメします。使い捨てブランチはローカルリポジト
リに閉じても良いです (つまりテストに通るのを確認してから
masterをpushする)
‘master’と’pu’だけ使うプロジェクトや、’master’, ‘master-pu’,
‘maint’, ‘maint-pu’ の4つを使っているプロジェクトを見たことがあ
ります。
Q: こんなにたくさんのトピックを保持しないといけない?
A: そうです。
それらが’master’または’maint’にマージされるまでは保持してくだ
さい。
しかし、誰か信頼できるひとに特定のサブシステムを任せることも
できます。あなたは単に彼らのmasterを自分のmasterにマージ
すれば良いのです(実際には使い捨て統合があったほうがよいで
しょう)
gitworkflowsがスケーラブルなのはこれができるからです。
Q: 同じブランチを何度もマージしないといけない?
A: そうです。
同じコンフリクトの解消に飽き飽きしたら、git-rerere(1)を有効にし
ましょう。’rerere’は Reuse Recorded Resolution の略で、一度
解消したことのあるコンフリクトを解消するのを支援してくれます。
Q: gitworkflowsでGitHubのプルリクを使える?
A: もちろん使えます。
git.gitではGitHubプルリクエストは単に無視されますが、これは、
そうすることがプロジェクトのポリシーであるというだけのことで
す。
GitHubユーザにはオンラインマニュアルgitworkflows(7)に書いて
ある“Merge 奥辞谤办蹿濒辞飞”が适切でしょう。
Thank you

More Related Content

図解驳颈迟飞辞谤办蹿濒辞飞蝉(7)