Creazione di un nuovo ramo vuoto per un nuovo progetto


351

Stiamo usando un repository git per archiviare il nostro progetto. Abbiamo le nostre filiali in partenza dalla filiale originale. Ma ora vogliamo creare un piccolo nuovo progetto per tenere traccia della documentazione. Per questo vorremmo creare un nuovo ramo vuoto per iniziare a memorizzare i nostri file e vorrei che altri utenti della rete clonassero quel ramo.

Come possiamo farlo?

Ho provato alcune cose, ma non hanno funzionato.

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

Sembra spingere il ramo ok, ma quando eseguo il recupero o il pull, scarica informazioni da altri rami e quindi ottengo anche alcuni file extra da altri progetti. Qual è la soluzione migliore?


11
Perché è necessario archiviarlo in una filiale? I rami sono generalmente per alcune deviazioni dalla stessa base di codice. Forse solo l'avvio di un nuovo repository sarebbe una soluzione migliore.
Benjamin Bannier,

2
Bene, l'abbiamo fatto prima, IIRC, e vorrei farlo di nuovo, quindi sono curioso;)
fazineroso

3
"per un nuovo progetto" - Come @honk, suggerirei di inserirlo in un nuovo repository. Due opzioni da lì per integrarle. Fallo diventare un submoduleprogetto originale, ad esempio docs/indicando l'altro repository. Oppure, se desideri unire il codice in un secondo momento, aggiungilo come telecomando.
gertvdijk,

1
Un altro aspetto negativo dell'approccio orfano è che è necessario mantenere i propri .gitignorefile e passare costantemente tra le due radici (rami). Quindi sono anche per il nuovo approccio repository, in una nuova cartella, con gli stessi telecomandi e spingendo verso un altro ramo.
simo

Risposte:


666

Puoi creare un ramo come orfano:

git checkout --orphan <branchname>

Questo creerà una nuova filiale senza genitori. Quindi, puoi cancellare la directory di lavoro con:

git rm --cached -r .

e aggiungere i file di documentazione, eseguirne il commit e inviarli a github.

Un pull o fetch aggiornerà sempre le informazioni locali su tutti i rami remoti. Se si desidera solo estrarre / recuperare le informazioni per un singolo ramo remoto, è necessario specificarle.


18
Bella risposta, ma è un po 'fastidioso che il nuovo ramo inizi con tutti i file (dal ramo precedente) messi in scena.
Matt Fenwick,

12
Durante l'emissione git checkout --orphan <branch>; Non vedo alcun elenco di <branch> in git branch.
Santosh Kumar,

51
Dopo git checkout --orphansi può usare git reset --hardper eliminare i file rimasti.
Ilya Kozhevnikov

16
Il motivo per cui non vedi la succursale dopo git checkout --orphan <branch>è perché non ha ancora alcun commit. Dopo il primo commit git branchstampa il nuovo ramo.
Krøllebølle

13
git clean -fd rimuove i file non tracciati.
Stefgosselin,

71

La risposta corretta è creare un ramo orfano. Spiego come farlo in dettaglio sul mio blog. (Link archiviato)

...

Prima di iniziare, esegui l'upgrade all'ultima versione di GIT. Per assicurarti di avere l'ultima versione, esegui

which git

Se esce una versione precedente, potrebbe essere necessario aumentare il PERCORSO con la cartella contenente la versione appena installata.

Ok, siamo pronti. Dopo aver fatto un cd nella cartella contenente il tuo checkout git, crea un ramo orfano. Per questo esempio, chiamerò il ramo "mybranch".

git checkout --orphan mybranch

Elimina tutto nel ramo orfano

git rm -rf .

Apporta alcune modifiche

vi README.txt

Aggiungi e impegna le modifiche

git add README.txt
git commit -m "Adding readme file"

Questo è tutto. Se corri

git log

noterai che la cronologia del commit inizia da zero. Per tornare al ramo principale, basta eseguire

git checkout master

È possibile tornare al ramo orfano eseguendo

git checkout mybranch

16
Le risposte solo link non sono incoraggiate. Se il collegamento viene spostato o rimosso, la risposta diventa inutile. Valuta di aggiungere direttamente le parti essenziali in questa risposta. Prestare particolare attenzione a quei problemi non coperti dalle risposte precedenti.
bytebuster

3
Il link non è più valido, sfortunatamente.
Alexey,

1
Gli archivi sono una cosa meravigliosa.
lucid_dreamer,

3
È PERICOLOSO semplicemente rimuovere tutto nella directory di lavoro, perché qualsiasi progetto non banale avrà file non tracciati (configurazione, ambiente, cache, ecc.).
Slava Fomin II,

12

Crea un nuovo ramo vuoto come questo:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

Se i tuoi file proj-doc sono già sottoposti a commit in un singolo sottodir, puoi creare il nuovo ramo in questo modo:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

quale potrebbe essere più conveniente che git branch --orphanse ciò ti lascerebbe molto git rme ingente git mvda fare.

Provare

git branch --set-upstream proj-doc origin/proj-doc

e vedi se questo ti aiuta a risolvere il problema. Inoltre, se vuoi davvero solo recuperare un singolo ramo, è più sicuro specificarlo sulla riga di comando.


1
Questa risposta è interessante perché ti consente di avviare un altro ramo / root con un primo commit totalmente vuoto.
Stéphane Gourichon,

Un altro modo per creare un ramo vuoto se non ti dispiace passare a quello ègit checkout --orphan new-branch; git reset --hard
jthill

A che serve il xargs?
Flusso

@Flux è solo un altro modo per ottenere l'ID dell'albero come argomento di commit-tree.
jill

Mi piace molto questo approccio, in quanto consente di creare un nuovo ramo vuoto, senza lasciare il ramo corrente, oltre al fatto che esiste un commit vuoto come punto di partenza.
Brice,

8

Se la tua versione di git non ha l'opzione --orphan, questo metodo dovrebbe essere usato:

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

Dopo aver fatto un po 'di lavoro:

git add -A
git commit -m <message>
git push origin <newbranch>

2
git cleanFai attenzione, puoi eliminare i file che non vuoi eliminare! Esegui git clean -ndxprima per vedere quali file eliminerà prima di eseguirlo davvero con l' -fopzione.
Lassi,

7

Supponiamo che tu abbia un masterramo con file / directory:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

Passo dopo passo come creare un ramo vuoto:

  1. git checkout —orphan new_branch_name
  2. Assicurarsi di essere nella directory corretta prima di eseguire il comando seguente:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

Nel passaggio 2, rimuoviamo semplicemente tutti i file localmente per evitare confusione con i file sul tuo nuovo ramo e quelli che conservi nel masterramo. Quindi, scolleghiamo tutti quei file nel passaggio 3. Infine, i passaggi 4 e successivi funzionano con il nostro nuovo ramo vuoto.

Una volta terminato, puoi passare facilmente tra i tuoi rami:

git checkout master 
git checkout new_branch

1

Sulla base questa risposta di Hiery Nomus .

Puoi creare un ramo come orfano:

git checkout --orphan <branchname>

Questo creerà una nuova filiale senza genitori. Quindi, puoi cancellare la directory di lavoro con:

git rm --cached -r .

E quindi esegui il commit del ramo con commit vuoto e poi premi

git commit -m <commit message> --allow-empty
git push origin <newbranch>

1

Dai un'occhiata a questa documentazione , contiene dettagli chiari su

--orphan <new_branch>
Crea un nuovo ramo orfano, chiamato <new_branch>, avviato da <start_point>e passa ad esso. Il primo commit fatto su questa nuova filiale non avrà genitori e sarà la radice di una nuova storia totalmente disconnessa da tutte le altre filiali e commit.

L'indice e l'albero di lavoro vengono regolati come se in precedenza fosse stato eseguito git checkout. Ciò consente di avviare una nuova cronologia che registra una serie di percorsi simili eseguendo facilmente git commit -a per eseguire il commit della radice.


1
Un link a una soluzione è il benvenuto, ma assicurati che la tua risposta sia utile senza di essa: aggiungi un contesto attorno al link in modo che i tuoi colleghi utenti abbiano qualche idea di cosa sia e perché sia ​​lì, quindi cita la parte più pertinente della pagina che ' re collegamento a nel caso in cui la pagina di destinazione non sia disponibile. Le risposte che sono poco più di un collegamento possono essere eliminate.
Yunnosch il

1

ho trovato questo aiuto:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.