Domanda

Ho due rami che sono abbastanza diverso che rebasing sembra non funzionare - o non so come fare

.

Ho un ramo "pubblico" con un gruppo di file rimossi (utilizzando il filtro-ramo). Anche se la maggior parte dei commit corrisponde in termini di delta, il commit ID sono tutti diversi. Ho provato un bel paio di metodi per tirare le modifiche dal mio ramo dev al mio ramo pubblico ... Trovo difficile credere che possa fare quello che voglio fare - ma ho il sospetto che non so come fallo. In ogni caso, questo funziona bene, ma sembra sbagliato.

git checkout dev
git format-patch --stdout last_sync_tag > catchup.mbox
git checkout public
git am catchup.mbox
git --skip # talks about a missing file
git --skip # talks about a missing file
git --skip # talks about a missing file

Eventuali consigli o suggerimenti, che probabilmente includerà Non filtrare-ramificazione file che non si desidera sul ramo pubblico (anche se, come si fa poi sbarazzarsi di loro?), Sono i benvenuti.

Il mio albero (s) guarda più o meno in questo modo:

dev: a-b-c-d-e-f-g-h-i-j-k
pub: t-u-v-w-x

t ≅ una, u ≅ c, v ≅ d, w ≅ e, x ≅ g. i, j, k sono nuove patch che mi piacerebbe passare sopra.

checkout pub
rebase --onto pub i  # I really expected this to work
È stato utile?

Soluzione

cherry-pick comando di Git può essere utile. Non ho usato nella vostra situazione, ma penso che dovrebbe funzionare. L'unico dolore è che non è progettato per funzionare in un intervallo di commit, quindi se si vuole script / automatizzare dovreste usare qualcosa come git rev-list.

Ancora una volta, non ho provato questo, ma uno script bash come questo può dare un buon punto di partenza

git checkout public
for rev in $(git rev-list --reverse last_sync_tag..dev) ; do
   git cherry-pick $rev && git tag -f last_sync_tag $rev || exit 1
done

Altri suggerimenti

si fa a mantenere regolarmente i file sul ramo dev che non sono in pubblico? O sono solo in giro?

Se non si tende a fare i cambiamenti a loro, e tu sei OK con riscrivere la storia un po ', quello che si potrebbe fare è organizzare per avere li ha creati come un unico impegno in base al ramo pubblica; e unire che di nuovo in pubblico, ma con "-s nostra" per fermarli in realtà sempre in. ( precedente risposta su git merge -s nostra )

Qualcosa di simile:

git checkout -b dev public
git am create-dev-only-files.patch
git checkout public
git merge -s ours dev
git checkout dev
# write more dev patches...
git checkout public
git merge dev
# and this should merge in the patches without bringing in the
#  dev-only files
Quindi, se poi apportate modifiche successive sul ramo dev e fusi in pubblico, se non stai cambiando quei file che non sono in pubblico, si applicherà semplicemente

tutto il resto. Ma se l'insieme di file che si desidera sopprimere sui cambiamenti pubblici, questo potrebbe essere difficile. Si potrebbe provare per evitare che con l'aggiunta di un pre-commit hook per unstage file particolari prima di iniziare qualsiasi commit sul ramo pubblico, per esempio.

Perché hai utilizzato "filtro-ramo" si sta andando ad avere per aiutare a trovare il giusto git commit per eseguire il rebase su.

ho intenzione di indovinare qui, ma presumibilmente si dispone di un 'quasi' comune commettere che ha due versioni, la testa del vostro ramo pubblico e il luogo sul ramo dev che questo commit corrisponde a (non-filtrato). Chiama il capo pubblico impegnarsi <PH> e il dev commettere che questo corrisponde a (prima del filtraggio) <DevPH>.

con il ramo dev estratto, si vuole fare qualcosa di simile:

git rebase --onto <PH> <DevPH>

Questo dice rebase di prendere le patch introdotte da ciascun commit dal <DevPH> sul ramo di corrente e di applicare queste commit a <PH>. Credo che questo è ciò che vi serve.

Modifica:

Il tuo aggiornamento alla domanda dimostra che h è equivalente alla testa del torrente pubblico sul ramo dev e che si vuole trapiantare tutto, da qui in poi sul ramo dev sul ramo pubblico. Se quindi il comando è

git rebase --onto pub h

Beh, se io non voglio un fileit terre .gitignore. Probabilmente è il config codice non reale in modo che non ha bisogno di monitoraggio a tutti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top