2012-08-03 15 views
6

Ho due rami A e B. Quello che voglio fare è creare un nuovo commit (unione) su A con lo stato corrente di A come padre che si riferisce all'albero di file descritto da B scartando qualsiasi cosa da A. Fondamentalmente la cronologia di B dovrebbe essere schiacciata in un singolo commit.Creazione di Merge Commit che sostituiscono i nostri da Theirs

Lo stato del repository concreto è costituito da due rami indipendenti, che non hanno un antenato comune (proveniente da due repository precedentemente indipendenti), ma che descrivono lo stesso contenuto. Ora voglio trovare un "git" -way per riunirli. Una soluzione di base (senza git) sarebbe a checkout A e basta copiare il contenuto di B nell'albero di lavoro e fare un git commit. Questo è fondamentalmente quello che ho fatto prima per propagare il contenuto del secondo repository nel primo.

di farlo con git ho provato

git checkout A 
git merge --squash B 

Ma unforunately ha generato unire i conflitti per tutti i file che differiscono tra A e B, ciò che non è sicuramente quello che mi aspettavo.

Fondamentalmente qualcosa come

git merge --squash -s theirs 

dovrebbe fare il lavoro, ma la strategia di fusione theirs non esiste. Leggendo il docu mostra la possibilità di utilizzare qualcosa come

git merge -X theirs 

che è un'opzione per la strategia di fusione recursive. Ma questo fa ancora una fusione di blocchi non conflittuali. Solo i blocchi in conflitto sono presi direttamente da theirs.

+0

Sarebbe uno di quelli 'fondono strategie --their' essere utile qui? http://stackoverflow.com/questions/4911794/git-command-for-making-one-branch-like-another/4912267#4912267 – VonC

+0

La simulazione numero 2 dovrebbe fare il lavoro. L'ho appena usato per unire --squash'. Successivamente nella storia di B c'è un'unione da A, ma questo è OK. Se non desiderato, B può essere resettato nuovamente. –

+0

Ok, ho aggiunto il n. 2 come risposta. – VonC

risposta

2

Come si commenta, da tutte le strategie di unione --theirs I List in "git command for making one branch like another", la seconda opzione è vicino a quello che vi serve:

Spettacoli come una fusione, con il nostro come il primo genitore .
(proposto da jcwenger)

git checkout -b tmp upstream 
git merge -s ours thebranch   # ignoring all changes from downstream 
git checkout downstream 
git merge --squash tmp    # apply changes from tmp but not as merge. 
git rev-parse upstream > .git/MERGE_HEAD #record upstream 2nd merge head 
git commit -m "rebaselined the branch from upstream" # make the commit. 
git branch -D tmp     # deleting tmp 
Problemi correlati