Impossibile comprendere il ramo Git, unire e rebase
Domanda
Conosco il filo che dice che il rebase è per piccole modifiche dei compagni di squadra, mentre l'unione per grandi modifiche.
Conservo tre Git di tre compagni di squadra nella seguente struttura di directory dove abbiamo tutti lo stesso codice iniziale:
project
| - I
| - myTeamMate1
| - myTeamMate2
I rami non sono nello stesso Git.Ciò significa che non posso utilizzare rebase e unire.Ho usato vimdiff per sincronizzare le modifiche tra i teamMates.Tuttavia, questo richiede molto tempo.
Ho provato senza successo a creare la seguente struttura di directory in cui tutti i rami si trovano sotto un unico Git:
project
| - I - myTeamMate1 - myTeamMate2
Tuttavia, eseguo il comando clone per me e per il mio compagno di squadra:
git clone <url>
e ricevo il messaggio di errore dopo aver eseguito il secondo clone per il mio compagno di squadra
fatal: destination path 'dotFiles' already exists and is not an empty directory.
Quale struttura di directory dovrei utilizzare con un team di 3 persone, tale che posso usarlo rebase
E merge
comandi?
Soluzione
Solo qualche altro pensiero per completare la risposta di Samuel.
A differenza di SVN, rami e directory non sono completamente correlati in Git:avere 3 rami (uno per ogni membro del team) non significa 3 directory.Non è quello che intendevi nella tua domanda (dato che le tue directory sono in realtà 3 radici per 3 repository Git), ma preferisco menzionarlo esplicitamente per ogni evenienza;)
Essendo Git DVCS, i 3 repository possono essere ovunque (non in 3 directory sullo stesso computer).Se sono raggiungibili tramite un percorso UNC (
\\desktop\path\to\repo
), possono essere designati come remoti.Idiota clone lo consente di ottenere riferimenti a filiali remote, ma non crea tracciamenti di filiali locali permettendoti di ottenere il lavoro dei tuoi colleghi.Il modulo rubino"filiali remote" può aiutare.
Essere diffidare del rebase mentre riscrive lo SHA-1 del tuo ramo (poiché riproduci i tuoi commit su un altro ramo):se i tuoi compagni di squadra hanno basato le loro fusioni sui tuoi rami, dovranno fondersi Tutto i tuoi commit ogni volta, anche quelli già accorpati!
In questo caso è meglio avere 2 rami:- UN ramo lavorativo stai utilizzando per il tuo sviluppo e rebase (per integrare i lavori dei tuoi colleghi, sebbene anche questa operazione possa essere eseguita nel proprio ramo)
- UN ramo pubblico editoriale, su cui unisci solo il tuo lavoro stabile e che può quindi essere utilizzato da altri repository remoti come fonte per le unioni.
Altri suggerimenti
Il fatto che non lo siano all'interno dello stesso git come dici tu non ti limita in alcun modo.Git è distribuito, il che significa che puoi recuperare tra questi repository, unire, rebase e così via.
Guarda a git remote --help
per vedere come puoi nominare i repository dei tuoi compagni di squadra nei tuoi in modo che tu possa facilmente importare i loro cambiamenti, ribasare su di loro o eseguire si fonde.Non è necessario modificare la struttura delle directory, la tua è perfettamente utilizzabile.
Esempi di codice
Per tracciare un ramo remoto
git remote add -t master Hnr git://github.com/userName/files.git
Questo non ti scarica il ramo.Modifica semplicemente il file .git/config e aggiunge alcune righe che dicono a Git come, dove e come ottenere i dati in remoto.
Per ottenere il ramo del tuo compagno di squadra, corri
git fetch Hnr
Per vedere che hai davvero il ramo dei tuoi compagni di squadra, corri
git branch -a
o per vedere solo le filiali dei tuoi amici
git branch -r
I due comandi precedenti inizialmente hanno causato la mia confusione, poiché non li conoscevo.Questo mi ha fatto provare altri comandi non necessari per avere i rami per me.
2° modo per avere la filiale del tuo amico
Tuttavia, tieni presente che puoi utilizzare git-clone per avere il codice del tuo amico in una directory separata come segue
git clone UrlAtGithub
Quindi, apparentemente puoi utilizzare Git-remote come sopra per avere un ramo nel tuo repository Git:
git remote add master Hnr PATH/ToYourFriendRepo.git
Conclusione: Puoi utilizzare due modi per avere il ramo del tuo teamMate per te, tramite git-clone o senza di esso.Entrambi i modi richiedono l'uso di git remote add
.Il vantaggio di quest'ultimo sembra essere che è necessario eseguire un comando in meno.Il primo poi ti dà di nuovo l'intero repository dei tuoi compagni di squadra sul tuo disco rigido.
Per favore, consulta i manuali di Git per come aggiornare i tuoi rami remoti. (NB il ramo remoto può essere sul tuo computer.Non è necessario che si trovi su un computer remoto.Anche la tua filiale può essere la filiale remota, ma ciò limita il tuo flusso di lavoro.)
Successivamente potresti voler unire il file specifico del tuo amico al tuo ramo.In tal caso, è sufficiente conoscere le prime 5 lettere dell'impegno del tuo amico per unire il file.
[Non sono sicuro di come sia possibile eseguire le seguenti operazioni:] Devi scappare, per esempio
git merge 76a32
Potresti ottenere il seguente output
CONFLICT (add/add): Merge conflict in shells/externalPrograms
Auto-merging shells/smallApps/extract
CONFLICT (add/add): Merge conflict in shells/smallApps/extract
Auto-merging shells/smallApps/extract~
CONFLICT (add/add): Merge conflict in shells/smallApps/extract~
Automatic merge failed; fix conflicts and then commit the result.
In tal caso, i tuoi file differiscono in modo significativo da quelli del tuo amico e Git non può decidere quale file prendere.Apparentemente è necessario eseguire quanto segue
git rebase
e ottieni
shells/smallApps/extract: needs merge
shells/smallApps/extract~: needs merge
cannot rebase: you have unstaged changes
Esercizio 1 : Tuttavia, ora sono bloccato, poiché il mio tig non mostra il commit del mio amico nel mio albero Git.Come puoi ottenere il commit 76a32 del tuo amico sul tuo albero Git quale ramo è nel tuo Git?
Ora potresti aver risolto il problema.Il problema era che li ignoravo per risolvere i conflitti sui quali Git mi dava notifiche.Google salva ancora una volta la situazione sito ufficiale Git:
Se ci sono conflitti-per esempio, se lo stesso file viene modificato in due modi diversi nella filiale remota e nella filiale locale-poi sei avvertito-
Il problema successivo è ripulire le parti problematiche e unirle nuovamente.Vedi qualcosa di simile al seguente nei tuoi file problematici: divertiti!(Finalmente arrivo ai problemi veri ;)
testo alternativo http://dl.getdropbox.com/u/175564/exampleGitProblemSolving.png
Problema nella differenza e nell'unione di dotFiles nel FileMerge del Mac
Avevo bisogno di aggiornare il mio Git, poiché solo il Git più recente ha difftool -command.Puoi trovare una soluzione su filo.
Difftool ti consente di avviare dotFiles in FileMerge dal terminale.Non è possibile accedervi dalla GUI.Funziona come
git difftool master:README dev:README
Problema con il tuo account in Github dopo aver aggiunto un nuovo account remoto
Il tuo account Github potrebbe essere scomparso in .git/config.In tal caso, è necessario eseguire il seguente codice
git remote add -f YourUserName UrlIn@form.git
Potresti quindi notare che non puoi eseguire normalmente git-push
git push origin master
Potresti ricevere il seguente messaggio di errore
fatal: 'origin' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
Puoi anche provare i seguenti comandi per risolvere il problema
git push Masi master
e tutte e 3 le permutazioni sotto 2 di Masi, maestro e origine.Tuttavia, nessuno dei comandi ha funzionato.
Esercizio 2: Come puoi impegnarti nel tuo account Github poiché hai un teamMate nella tua lista remota?
Origin è un nome abbreviato per il tuo vero repository git esterno, ad esempio su Github.Il contenuto della tua variabile origin potrebbe essere stato sostituito da un altro repository remoto.In questo caso, ti consiglio di creare una nuova variabile tramite
git remote add github git@github.com:myLogin/myProject.git
Nota che potresti avere origin2 al posto di github.L'origine è solo una convenzione nel nominare il repository.
Puoi quindi semplicemente correre
git push github master
Potresti avere una passphrase nella tua chiave ssh.Se lo hai, potresti ricevere un'autorizzazione negata -avviso.Se lo hai fatto, consulta il filo.
A dire il vero, ho iniziato a lavorare scrivendo una risposta bella, lunga e dettagliata...ma questo è già spiegato molto meglio di quanto potrei fare http://excess.org/article/2008/07/ogre-git-tutorial/.Copre l'uso di diversi rami, remoti e fusioni.È possibile farlo anche tramite screencast, quindi prenditi un'ora, prendi un caffè e goditi la lezione.
Specifico per la tua domanda:non dovresti usare una configurazione di directory.Git non gestisce i rami con le directory nello stesso modo in cui SVN gestisce le cartelle dei rami.I rami in Git sono una cosa completamente diversa.Anche se potresti non impostare un repository centrale (lo consiglio), dovresti impostarne uno singolo maestro ramo a cui tutti affidano il loro lavoro finale e pulito.
Un mio repository di esempio ha uno screenshot su Wikimedia Commons.Nel mio esempio, "barista" invia il suo codice solo in blocchi tar, quindi devo importarlo io stesso per gestirlo."master" (mostrato qui solo come remotes/elf/master) è un repository svn pubblico da cui importo e baso le modifiche."autocrazia" è la mia base di riferimento per il codice e "privato" è dove tengo un file di configurazione con le password che voglio gestire ma che non pubblico mai.Controlla il timestamp in privato e noterai che non si allineano con i rami sottostanti.Questo perché lo ribaso si diramano verso l'"autocrazia" invece di fondersi.
Noterai due riferimenti remoti: elfo e bardo.Queste sono due mie macchine remote che ospitano il software.Posso spingere e tirare i miei rami lì come desidero.Nel tuo caso, avresti repository remoti degli altri tuoi sviluppatori e loro modificherebbero i propri rami.Guardando il tutorial avrai un'idea migliore di come funziona.Buona fortuna :)