2017-05-01 7 views
0

TL; DR、私は私たちのUATブランチにdeveloper1(CODE1、CODE2と私-js.js)によって行われた変更を触れることなく(CODE3とcode4に行われた、すなわち変更)ちょうど私が行った変更をプッシュすることができます特定のコミットを選んで別のブランチにプッシュするには?


私の状況は一例で説明することをお勧めします。

開発者は通常、7つのファイルを含むdevブランチで動作します。

code1.php 
code2.php 
code3.php 
code4.php 
code5.php 
my-js.js 
my-css.css 

プロジェクトには3人の開発者がいます。

developer1 = able to push new branches but not able to merge into any branch 
developer2 = same access as developer1 
developer3 = me. I have admin access to the repository. If developer1 and 2 needs to merge changes to the dev branch, they send it my way for approval 

新しい問題が発生し、これが開発者1に割り当てられました。 Developer1 gitは、最新のコードを取得するためにリモートのdevブランチを引っ張った。そして彼は "jira-ticket1"と呼ばれる新しい地方支店を作り、ファイルcode1とcode2に変更を加えました。彼もmy-js.jsに変更を加えました

もう1つの問題が発生しました(jira-ticket2)これがdeveloper2に割り当てられました。彼はまた、リモートdevのブランチを引っ張って、 "jira-ticket2"という新しいローカルブランチを作成し、code5に変更を加えました。

今日の終わりに、developer1だけが終了しました。彼は自分の新しいブランチを私たちのリモートリポジトリにプッシュし、承認されるプルリクエストを作成しました。受け取って5分後にプルリクエストを承認しました。

午前中に何か緊急(jira-ticket3)が現れ、これが私に割り当てられました。このチケットでは、コード3とコード4を変更する必要があります。私も仕事を始める前にgit pullをやったので(develop1が行った変更を拾い上げる)。私はまた、新しい支店を作って、それが完了したら私の変更をプッシュして承認しました。

問題の緊急性のため、テスターは私の変更をテストすることができましたし、彼は私たちのUAT支店

に行くためにそれを承認したので今、私の質問

は、私たちにプッシュすることができますUATブランチは、私が行った変更(つまり、コード3とコード4の変更)を、開発者1の変更に触れずに行うだけですか?

私のローカルリポジトリに通常表示されるブランチは、devと私自身のブランチだけです。

ps。私はいくつかの "似たような"質問を読んだが、これが自分の状況に当てはまるかどうかは不明だ。

+0

あなたはこれのdr;バージョンを作ることができますか?具体的なコミットを選択したい場合は、その答えがあります –

+0

私たちがこれを処理する一般的な方法は、後でマージされるチケットブランチです。これは良い解決策ではありませんか?コミット前に分岐する。 – kabanus

+0

@ Mr.Alienがやった。ありがとう! – mrjayviper

答えて

1

これを処理する方法は切符です。あなたが変更を含むCと

A-B-C 

を持っているでしょう

プル要求した後
A-B 

(それはgitのにコミットではなく、ファイルを議論する方が簡単です。)今、緊急の何かがアップします:オリジナルの木だったと仮定、Cコードを使用することはできません。チェックアウトB、アウト分岐(〜1ハッシュまたはHEADを使用して)、そして、あなたの修正をコミット:

A-B-C <-Master 
    -D <-Ticket branch 

今、あなたは罰金だし、歴史はあなたたちはしばらくの間、分割しなければならなかったことが表示されます。物事が落ち着くたら、ちょうどバックマージ:

もちろん
A-B-C---E 
    -D-/ 

は、あなたがこの写真では、マスター

git reset --hard <hash of B commit> 

に、マスターに座って、プルリクエストを変更することができますがあります。

A-B-C <- Some temp branch 
    -D <-Master now 

ファイルをコミットし、マスターブランチを押した後、Cをマスターにマージ/リベースします。

===========================

第二の方法を使用してコードに明確。あなたが持っているプル後:

A-B-C <-UAT 

さて、

git checkout -b tempbranch #to save C 
git checkout master 
git reset --hard HEAD~1 #Or explicitly B hash 

は今、ツリーは次のとおりです。

A-B(<-UAT)-C <- tempbranch 

は変更と

git commit -a -m"My changes" 

ツリーを作る:

A-B-C <-tempbranch 
    \ 
    D<-UAT 

これでプッシュできます。 Cをインクルードしたいときは、それをリベースするかマージしてください。リベースの場合:

git checkout tempbranch 
git rebase UAT 
git checkout master 
git merge tempbranch 
git branch -D tempbranch #Not needed! 

今あなたが持っている:

A-B-D-C 

プッシュ。

+0

こんにちは。 UATテストのためにUATというブランチを使用します。私のコミット(あなたの例ではD)をこのUATブランチにどのようにマージしますか?私たちの自動コンパイラの設定は、常にUATブランチを取得します。 – mrjayviper

+0

私はリベースソリューションを示しました。すでに 'C 'を押しているとマージすることもできます。それはもっと安全です。 – kabanus

+0

これは私が "B"を引っ張った場合にのみ動作するようですか? developer1が別のタスクを取得し、git pullを知らずに最新のものを取得すればどうなるでしょうか? – mrjayviper

関連する問題