Pulisci un fork e riavvialo da monte


396

Ho creato un repository, quindi ho apportato alcune modifiche e sembra che abbia rovinato tutto.

Vorrei ricominciare da zero, usando l'attuale upstream / master come base per il mio lavoro.
Devo rifare il repository o eliminarlo?


4
Risposte molto complesse a una semplice domanda. Elimina tutto e clona nuovamente il repository.
Yaza,

1
@Yaza, no, questo potrebbe causare ancora più problemi in alcuni scenari.
Shimmy Weitzhandler,

@shimmy, non se si desidera ricominciare da zero come richiesto da OP.
Yaza,

Risposte:


796

La soluzione più semplice sarebbe (usando ' upstream' come nome remoto che fa riferimento al repository originale biforcato):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(Simile a questa pagina GitHub, sezione "Cosa devo fare se mi trovo in una brutta situazione?" )

Tenere presente che è possibile perdere le modifiche apportate sul masterramo (sia localmente, a causa del reset --hard, sia sul lato remoto, a causa del push --force).

Un'alternativa sarebbe, se vuoi preservare i tuoi commit master, rigiocare quei commit in cima alla corrente upstream/master.
Sostituire la parte ripristinata con a git rebase upstream/master. Sarà quindi necessario forzare la spinta.
Vedi anche " Cosa devo fare se mi trovo in una brutta situazione? "


Una soluzione più completa, il backup del lavoro corrente (per ogni evenienza) è dettagliata in " Pulizia del ramo master git e spostamento di alcuni commit nel nuovo ramo ".

Vedi anche " Estrai nuovi aggiornamenti dal repository GitHub originale nel repository GitHub biforcuto " per illustrare cos'è " upstream".

a monte


Nota: i recenti repository GitHub proteggono il masterramo da push --force.
Quindi dovrai masterprima annullare la protezione (vedi foto sotto), quindi proteggerlo nuovamente dopo aver forzato la forza ).

inserisci qui la descrizione dell'immagine


Nota: su GitHub in particolare, esiste ora (febbraio 2019) un collegamento per eliminare i repository biforcati per le richieste pull che sono state unite a monte.


4
ciao, ha funzionato benissimo! tra la sintassi di reset corretta ègit reset --hard upstream/master
tampe125

1
@ tampe125 Eccellente. Ho corretto la sintassi di git resetnella risposta.
VonC

fatale: 'upstream' non sembra essere un repository git
Benubird

@Benubird che è il nome del telecomando che fa riferimento al repository originale (quello che hai biforcato): vedi il grafico e i git remotecomandi " " in stackoverflow.com/a/3903835/6309 .
VonC,

Giusto, ma dalla tua domanda non è chiaro come configurarlo, poiché per impostazione predefinita "upstream" non è definito nella riga di comando poiché ho biforcato tramite github.
Benubird,

31

Adoro la risposta di VonC. Ecco una versione semplice per i principianti.

C'è un telecomando Git chiamato di origincui sono sicuro che tutti voi siete a conoscenza. Fondamentalmente, puoi aggiungere tutti i telecomandi a un repository git che desideri. Quindi, ciò che possiamo fare è introdurre un nuovo telecomando che è il repository originale non il fork. Mi piace chiamarlooriginal

Aggiungiamo i repository originali al nostro fork come telecomando.

git remote add original https://git-repo/original/original.git

Ora prendiamo il repository originale per assicurarci di avere l'ultimo codificato

git fetch original

Come suggerito da VonC, assicurati di essere al comando.

git checkout master

Ora per velocizzare il nostro fork con l'ultimo codice sul repository originale, tutto ciò che dobbiamo fare è resettare il nostro ramo master in conformità con il telecomando originale.

git reset --hard original/master

E il gioco è fatto :)


2
Salgo fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.sul passo finale. Qualche consiglio?
TomNorway,

Sembra che questo ti lasci solo stock sul ramo remoto originale. Suppongo che manchi un passaggio per ripristinare il TUO fork sul telecomando corretto?
Ray Suelzer,

1
originalè migliore di upstream(utilizzato dai documenti di Github), in quanto origin/masterè "upstream" di local master. Riduce l'ambiguità. Mi chiedo se questo è il motivo per cui lo usi?
vaughan,

1
Questo è esattamente il motivo per cui lo uso!
Ahmad Awais,

2
Ho seguito queste istruzioni e ora lo stato git dice: Sul branch master Il tuo branch e 'origin / master' sono divergenti e hanno rispettivamente 52 e 5 commit diversi ciascuno. (usa "git pull" per unire il ramo remoto al tuo) - ma voglio scartare i miei 5 commit. Qual è il prossimo passo?
user3562927

6

A seguire @VonC ottima risposta. La tua politica aziendale di GitHub potrebbe non consentire la "spinta forzata" sul master.

remote: error: GH003: Sorry, force-pushing to master is not allowed.

Se ricevi un messaggio di errore come questo, prova i seguenti passaggi.

Per ripristinare efficacemente il fork è necessario seguire questi passaggi:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

Apri il fork su GitHub, in "Impostazioni -> Branches -> Branch predefinito" scegli "new_master" come nuovo ramo predefinito. Ora puoi forzare la spinta sul ramo 'master':

git checkout master
git push --force origin

Quindi è necessario ripristinare "master" come ramo predefinito nelle impostazioni di GitHub. Per eliminare "tmp_master":

git push origin --delete tmp_master
git branch -D tmp_master

Altre risposte che avvertono sulla perdita della modifica sono ancora valide, sii prudente.


4

Come farlo al 100% attraverso la GUI di Sourcetree

(Non a tutti piace fare le cose attraverso l'interfaccia della riga di comando di git)

Una volta impostato, è sufficiente eseguire i passaggi 7-13 da quel momento in poi.

Recupera> verifica ramo principale> ripristina al proprio principale> Invia modifiche al server

passi

  1. Nella barra degli strumenti del menu nella parte superiore dello schermo: "Repository"> "Repository settings"

"Repository" evidenziato nella barra dei menu in alto

  1. "Inserisci"

Pulsante "Aggiungi" nella parte inferiore della finestra di dialogo

  1. Torna a GitHub e copia l'URL del clone.

Pulsante "Clona o scarica" ​​sul sito Web di Github seguito dall'URL git

  1. Incolla l'URL nel campo "URL / Percorso", quindi dagli un nome che abbia senso. L'ho chiamato "maestro". Non selezionare la casella di controllo "Telecomando predefinito" . Non sarai in grado di inviare direttamente a questo repository.

Campi "Nome remoto" e "URL / Percorso" evidenziati nella finestra di dialogo "Dettagli remoti"

  1. Premi "OK" e ora dovresti vederlo apparire nel tuo elenco di repository.

repository "master" aggiunto all'elenco dei repository nella finestra di dialogo "Impostazioni repository"

  1. Premi di nuovo "OK" e dovresti vederlo apparire nel tuo elenco di "Telecomandi".

repository "master" evidenziato nell'elenco dei telecomandi nella barra laterale

  1. Fai clic sul pulsante "Recupera" (in alto a sinistra nell'area dell'intestazione dell'albero della fonte)

Pulsante "Recupera" nell'area dell'intestazione

  1. Assicurati che la casella "Recupera da tutti i telecomandi" sia selezionata e premi "ok"

Casella di controllo "Recupera da tutti i telecomandi" evidenziata nella finestra di dialogo "Recupera"

  1. Fare doppio clic sul ramo "principale" per verificarlo se non è già stato estratto.

  2. Trova il commit che desideri ripristinare, se hai chiamato il repository "master", molto probabilmente vorrai trovare il commit con il tag "master / master" su di esso.

Esempio di commit con un tag "master / master" su di esso

  1. Fare clic destro sul commit> "Ripristina il ramo corrente su questo commit".

  2. Nella finestra di dialogo, impostare il campo "Utilizzo della modalità:" su "Hard - scarta tutte le modifiche della copia di lavoro", quindi premere "OK" (assicurarsi di inserire prima tutte le modifiche che non si desidera perdere su un ramo separato).

Campo "Uso della modalità" evidenziato nella finestra di dialogo "Ripristina per eseguire il commit".  È impostato su "ignora tutte le modifiche alla copia di lavoro"

  1. Fare clic sul pulsante "Push" (in alto a sinistra nell'area dell'intestazione dell'albero dei sorgenti) per caricare le modifiche nella copia del repository.

Pulsante "Push" nell'area dell'intestazione

Fatto!

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.