2012-01-12 4 views
11

Attualmente sto esaminando molte delle funzionalità di tracciamento dei contenuti di git. È molto bello sapere che git mi permette di capire il codice che è stato spostato da un file a un altro, ma mi chiedo come sia utilizzabile questa funzionalità quando si esegue la risoluzione dei conflitti in unioni.Come ottenere git per unire correttamente il contenuto spostato (non solo i file)

Ecco lo scenario:

Ho due file hello.cc e bye.cc creato. Inizio un ramo topic e trasferisco un codice da hello.cc a bye.cc. Se ora faccio un git blame -C bye.cc, posso vedere che questo codice proviene originariamente da hello.cc che è bello sapere. Tuttavia ora passo alla diramazione originale senza il contenuto spostato e cambio del codice all'interno della sezione in hello.cc che è stata spostata nell'altra commit. Se faccio ora un git merge topic ottengo un conflitto per hello.cc. Tuttavia, a meno che non utilizzi uno stile diff3 (cosa che faccio di solito però), posso solo vedere che questo metodo è stato rimosso da hello.cc nell'altro ramo, ma non che è stato modificato in seguito. Sarebbe bello anche ottenere un conflitto su bye.cc perché sarebbe necessario verificare se tali modifiche dall'altro ramo dovranno essere riapplicate al codice. È in qualche modo possibile?

So che posso capire manualmente, che il codice è stato spostato facendo un git blame --reverse -C topic.... Comunque per uno mi ci è voluto un po 'per capire questa possibilità e molti altri probabilmente non lo sapranno. Per il secondo sono pigro e probabilmente dimenticherò che il codice potrebbe essere stato spostato. Inoltre non sono sicuro che funzioni quando il codice è stato spostato su più di un file.

Quale sarebbe il modo per mantenere questa situazione il più sicura possibile?

Edit:

ho appena scoperto che git blame --reverse -C hello.cc $(git merge-base HEAD topic)..topic funziona anche per scoprire dove il contenuto spostato. E se capisco git correttamente, questo è probabilmente più veloce, perché non farà una ricerca completa del contenuto nel repository completo.

Edit:

ho caricato il repository che sto usando per giocare intorno a github in modo da poter provare la fusione per te stesso. Il commit in cui ho spostato la funzione è nel ramo dell'argomento. Il commit in cui la stessa funzione viene cambiata in master presso HEAD del ramo merge_here. C'è un ulteriore commit in master in cui stavo giocando con alcune altre tecniche di fusione, che dovresti ignorare per questa domanda.

risposta

-4

Puoi usare git per inserire qualsiasi cosa nel tuo commit funzionerà bene.

+0

Si certo . Lo so. Ma qual è il modo migliore per ottenere git per darmi suggerimenti e avvertimenti su cosa mettere nel commit, sia attraverso l'uso di strumenti o attraverso conflitti di fusione. – LiKao

0

Sfortunatamente, è arrivato alla stessa trappola con il mio codice, dopo lo spostamento del file in git, non riconosce la modifica durante l'unione delle filiali. Sembra, la regola d'oro uno deve guidare lavorare con mossa è: il movimento di codice

mantenere separati dai cambiamenti

GIT non può tenere traccia di tali casi, come per ora. E sembra che non ci sia una soluzione rapida/automatizzata per capire i potenziali problemi dopo lo spostamento del file e quindi l'unione.

Anche se saprete sia impegna dove il problema è accaduto, e cercherà di applicare patch o annullare le modifiche perse dopo la mossa + unire, ci si può comunque rifiutare da Git simili:

'git apply' failed with code 1:'error: patch failed: filename.js:81'