2017-05-01 1 views
0

TL; DRWie bestimmte Commits ausgewählt und in einen anderen Zweig geschoben?

Kann ich in unsere UAT Zweig drücken Sie einfach die Änderungen, die ich (dh Änderungen an code3 und code4) gemacht, ohne die Änderungen durch Developer1 (code1, code2 und my-js.js) gemacht zu berühren ?


Ich denke meine Situation ist am besten mit einem Beispiel zu erklären.

Die Entwickler arbeiten normalerweise auf dem Dev-Zweig, der 7 Dateien enthält.

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

Es gibt 3 Entwickler in dem Projekt.

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 

Es ist ein neues Problem aufgetreten, das Entwickler1 zugewiesen wurde. Developer1 git zog den entfernten Dev-Zweig an, um den neuesten Code zu erhalten. Dann erstellte er einen neuen lokalen Zweig namens "jira-ticket1" und nahm Änderungen an den Dateien code1 und code2 vor. Er machte auch Änderungen an my-js.js

Ein weiteres Problem kam auf (jira-Ticket2) und dies wurde zu developer2 zugewiesen. Er hat auch den entfernten Dev-Zweig übernommen und dann einen neuen lokalen Zweig namens "jira-ticket2" erstellt und Änderungen an code5 vorgenommen.

Am Ende des Tages ist nur Entwickler1 fertig. Er schob seinen neuen Zweig in unser Remote-Repository und erstellte dann eine Pull-Anfrage, die ich genehmigen sollte. Ich habe die Pull-Anfrage 5 Minuten nach Erhalt genehmigt.

Am nächsten Morgen kam etwas Dringendes (jira-ticket3) auf und das wurde mir zugeteilt. Dieses Ticket verlangt von mir Änderungen an Code3 und Code4. Ich habe auch vor Beginn meiner Arbeit ein bisschen gezuckt (dadurch habe ich die Änderungen von develop1 übernommen). Ich habe auch einen neuen Zweig erstellt und dann meine Änderungen gepusht und genehmigt, sobald ich fertig bin.

Wegen der Dringlichkeit des Problems waren die Tester nur in der Lage meine Änderungen zu testen und er hat es

Jetzt

meine Frage

in unserem UAT Zweig gehen genehmigt Kann ich unser einschieben UAT-Zweig nur die Änderungen, die ich vorgenommen habe (dh Änderungen an code3 und code4) ohne die Änderungen von Entwickler1 zu berühren?

Die einzigen Zweige, die normalerweise in meinem lokalen Repository angezeigt werden, sind der Dev und meine eigenen Zweige.

ps. Ich habe mehrere "ähnliche" Fragen gelesen, aber ich bin mir nicht sicher, ob dies auf meine Situation zutrifft.

+0

Können Sie eine tl; dr-Version davon machen? Wenn Sie bestimmte Commits auswählen möchten, habe ich eine Antwort dafür –

+0

Die übliche Art, die wir damit umgehen, ist ein Ticket-Zweig, der später zusammengeführt wird - ist das keine gute Lösung? Verzweigen Sie sich vor dem Commit 1. – kabanus

+0

@ Mr.Alien gerade getan. Vielen Dank! – mrjayviper

Antwort

1

Die Art, wie wir damit umgehen, ist eine Ticket-Filiale. Angenommen, der ursprüngliche Baum war:

A-B 

Nach dem Pull-Request würden Sie

A-B-C 

mit C haben die Änderungen, die (es ist einfacher zu Commits zu diskutieren, anstatt Dateien mit git.) Nun dringend etwas kommt, , und Sie können den C-Code dafür nicht verwenden.Kasse B (unter Verwendung der Hash oder HEAD ~ 1), verzweigen sich und verpflichten Ihre fix:

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

Jetzt bist du in Ordnung, und die Geschichte wird zeigen, dass Sie Jungs hatten für eine Weile zu spalten. Sobald die Dinge regeln, fusionieren nur zurück:

A-B-C---E 
    -D-/ 

Natürlich könnten Sie die Pull-Anforderung ändern auf Master sitzen, dann auf Master

git reset --hard <hash of B commit> 

In diesem Bild haben Sie:

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

Übergeben Sie Ihre Datei, drücken Sie den Master-Zweig, und fusionieren Sie dann C in Master.

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

Eine Klärung der Codes der zweiten Methode. Nach dem Pull Sie haben:

A-B-C <-UAT 

Jetzt

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

Jetzt ist der Baum:

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

Nehmen Sie die Änderungen und

git commit -a -m"My changes" 

Baum:

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

Jetzt können Sie es drücken. Wenn Sie C einschließen möchten, können Sie es entweder neu erstellen oder zusammenführen. Für ein Fütterungsmaterial:

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

Jetzt haben Sie:

A-B-D-C 

Push.

+0

hallo wieder. Wir verwenden einen Zweig namens UAT für UAT-Tests. Wie füge ich nur meine Commits (D in Ihrem Beispiel) mit diesem UAT-Zweig zusammen? So wie unser automatischer Compiler eingerichtet ist, nimmt er immer den UAT-Zweig auf. – mrjayviper

+0

Ich zeigte eine Rebase-Lösung. Sie können auch zusammenführen, wenn Sie bereits 'C' gedrückt haben, wäre das sicherer. – kabanus

+0

scheint das nur funktionieren, wenn ich git gezogen "B"? Was ist, wenn Entwickler1 eine andere Aufgabe bekommt und er nicht weiß, wie er zieht, sondern nur das Neueste bekommt? – mrjayviper

Verwandte Themen