git
è un ottimo strumento; ma, non può sostituire tra gli sviluppatori.
È necessario chiedere se le modifiche in master
devono essere essere incluse in feature
. Idealmente, un ramo di funzionalità deve avere la minima quantità di codice possibile.
Se la modifica (s) deve assolutamente essere inclusa in feature
, quindi ci sono fondamentalmente due opzioni: git rebase
; e, git cherry-pick
.Suppongo che potresti eseguire una fusione all'indietro da master
a feature
; ma, ciò può portare a situazioni non buone ...
cherry-pick
consente di applicare uno specifico commit o più commit all'attuale HEAD
, mantenendo commenti e informazioni sull'autore. Dopo aver corretto con successo cherry-pick
, git è abbastanza intelligente da sapere che i due commit sono gli stessi quando si fondono feature
di nuovo in master
. Se si tratta solo di alcuni commit di cui stiamo parlando, allora cherry-pick
dovrebbe essere sufficiente.
rebase
consente di applicare il ramo corrente (linea di commit) a partire da un punto diverso nella storia. Come hai sottolineato, questo può essere problematico per developer1 e developer2 che hanno già copie di feature
. Avrebbero inoltre bisogno dello rebase
del loro sviluppo locale sulla nuova filiale feature
.
In ogni caso, il commit direttamente su master
da sviluppatore3 avrebbe dovuto essere nel proprio ramo di funzione e quel ramo di funzione avrebbe dovuto essere unito. Quel ramo di funzione potrebbe quindi essere stato fuso in feature
secondo necessità. Supponendo che solo uno (il più recente) impegnarsi in master
, si potrebbe porre rimedio alla situazione come segue:
# Ensure clean working directory
$ git stash
# Create new branch at master
$ git branch some-descriptive-name master
# Move master back one commit
$ git checkout master
$ git reset --hard HEAD^
# Merge the new branch into master
$ git merge --no-ff some-descriptive-name
# Forcibly update master
# YOU SHOULD COMMUNICATE WITH OTHER DEVS BEFORE DOING THIS
$ git push -f origin master
# Merge the new branch into feature
$ git checkout feature
$ git merge --no-ff some-descriptive-name
Non posso sottolineare abbastanza quanto sia importante una buona comunicazione è perché questi tipi di "Oops" le cose possono e accadere tutto il tempo.
Buona fortuna!
EDIT:
La parte su cherry-pick
ING è stata scritta con il presupposto che c'era solo un paio di commit (o solo uno) per master
e che tutto sarebbe andato cherry-pick
ed.
x -- y (master)
\
a -- b -- c (feature)
back-merges non sono buone. Non importa perché l'altro dev si è impegnato a padroneggiare. –