Diramazione da un commit precedente usando Git


Risposte:


2547

È possibile creare il ramo tramite un hash:

git branch branchname <sha1-of-commit>

O usando un riferimento simbolico:

git branch branchname HEAD~3

Per verificare il ramo durante la sua creazione, utilizzare

git checkout -b branchname <sha1-of-commit or HEAD~3>

42
Git 1.8.2 mi permetta di usare il breve sha1 per il primo modulo.
Dan Benamy,

53
@MattFenwick Git ti consentirà di utilizzare hash accorciati ovunque sia consentito un hash, purché l'hash abbreviato sia '' unico '' nel repository. Quindi, se non ha funzionato, prova ad aggiungere un altro personaggio dall'hash.
colpì

29
Per inviare correttamente il nuovo ramo al server .. era necessario questo ultimo passaggio:git push origin BRANCH_NAME
Gene Bo,

3
per avviare un ramo dalla <sha1-of-commit>corsa git checkout -b <name-of-branch> <sha1-of-commit>ma se il ramo esiste giàgit checkout -B <name-of-branch> <sha1-of-commit>
mostafazh,

258

Per fare questo su github.com:

  1. Vai al tuo progetto.
  2. Fai clic su "Impegni".
  3. Fare clic su <> ("Sfoglia il repository a questo punto della cronologia") sul commit da cui si desidera ramificare.
  4. Fai clic su "albero: xxxxxx" in alto a sinistra. Appena sotto la barra delle statistiche della lingua, avrai la possibilità di "Trova o Crea Branch" (digita lì un nuovo nome di filiale)Diramazione dal commit precedente

4
La domanda non riguarda github, ma git. La maggior parte dei server git non sono github.
Anders Tornblad,

46
Nonostante Github non sia git, è stato comunque di grande aiuto!
Liz,

Sfortunatamente mostra ancora cambiamenti rispetto ad altri commit, che volevo evitare, motivo per cui ho cercato questa domanda
Maxim

83

La magia può essere fatta con git reset .

  1. Crea una nuova filiale e passa ad essa (quindi tutti i tuoi ultimi commit sono memorizzati qui)

    git checkout -b your_new_branch

  2. Torna al tuo precedente ramo di lavoro (supponi che sia il master)

    git checkout master

  3. Rimuovi gli ultimi x commit, mantieni pulito il master

    git reset --hard HEAD~x # in your case, x = 3

Da questo momento in poi, tutti gli ultimi x commit sono solo nel nuovo ramo, non più nel tuo precedente ramo di lavoro (master).


7
Questo è quello che stavo cercando poiché rimuove i commit dal Master e lo fa come se ti fossi ricordato di fare il ramo prima che quei commit fossero stati fatti. Grazie.
superbeck

7
Non dimenticare che a git reset --hardnon è una buona idea se hai già spinto il commit all'origine ...
LuisF

1
puoi git push --force se avessi già spinto il ramo prima
milano

Ma fai molta attenzione quando usi --force blog.developer.atlassian.com/force-with-lease
peater

74

Se non sei sicuro di quale commit desideri ramificare in anticipo, puoi verificare i commit ed esaminare il loro codice (vedi sorgente, compilazione, test) di

git checkout <sha1-of-commit>

una volta trovato il commit da cui si desidera ramificare è possibile farlo dall'interno del commit (ovvero senza tornare prima al master) semplicemente creando un ramo nel solito modo:

git checkout -b <branch_name>


9

Un modo rapido per farlo sul tuo repository Github sarebbe il seguente:

  • Trova il commit specifico dalla tua filiale
  • Accanto all'ID SHA, fai clic su "Sfoglia il repository a questo punto della cronologia"
  • Qui puoi creare un nuovo ramo da questo commit inserisci qui la descrizione dell'immagine

1
Questo è in realtà obsoleto
regetskcob

2
La domanda non riguarda github.
Anders Tornblad,

8

Esegui semplicemente:

git checkout -b branch-name <commit>

Per esempio :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

Il checkoutcomando con il parametro -bcreerà un nuovo ramo E ti farà passare ad esso


1
Mi piace molto questo. Grazie
The Fool

è possibile creare un ramo basato sul commit SHA di un ramo funzione che è stato eliminato tramite una richiesta pull? O devo derivare dal commit della richiesta pull sul master?
user2966445

esegui git fetche git branchcomanda sulla cartella del tuo progetto usando il terminale, quindi controlla se esiste il ramo della caratteristica, se questo è il caso allora sì, ovviamente non sarai in grado di creare un ramo dai rami eliminati, puoi anche ripristinare una cancellazione del ramo nel caso in cui il la filiale è andata
d1jhoni1b

4

Una grande domanda correlata è: come diavolo riesci a capirlo usando l' --helpopzione di git? Proviamo questo:

git branch --help

Vediamo questo output:

NAME
       git-branch - List, create, or delete branches    

SYNOPSIS
       git branch [--color[=<when>] | --no-color] [-r | -a]
               [--list] [-v [--abbrev=<length> | --no-abbrev]]
               [--column[=<options>] | --no-column]
               [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
               [--points-at <object>] [<pattern>...]
       git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
       git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
       git branch --unset-upstream [<branchname>]
       git branch (-m | -M) [<oldbranch>] <newbranch>
       git branch (-d | -D) [-r] <branchname>...
       git branch --edit-description [<branchname>]

Gobbledegook.

Cerca nel testo successivo la parola "commit". Lo troviamo:

   <start-point>
       The new branch head will point to this commit. It may be given as a branch name, a
       commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.

Stiamo arrivando da qualche parte!

Ora, concentrati su questa linea del gobbledegook:

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

Condensalo a questo:

git branch <branchname> [<start-point>]

E fatto.


1
Odio Git. Grazie.
Byron Whitlock,

4

Per fare questo in Eclipse:

  • Vai alla prospettiva "Esplorazione del repository Git".
  • Espandi "Tag" e scegli il commit dal quale vuoi creare il ramo.
  • Fare clic con il tasto destro del mouse sul commit e selezionare "Crea ramo".
  • Fornire un nome di filiale.

Creerà una filiale locale per te. Quindi ogni volta che invii le modifiche, la tua filiale verrà trasferita al server remoto.


3

Puoi farlo in Stash.

  1. Fai clic sul commit
  2. Nella parte superiore destra dello schermo fai clic su "Contrassegna questo commit"
  3. Quindi è possibile creare il nuovo ramo dal tag appena creato.

Che interfaccia grafica è questa? GitHub?
ostrichofevil

Atlassian Stash
David Ruan

3

Sono stato in grado di farlo in questo modo:

git branch new_branch_name `git log -n 1 --skip 3 --format=%H`

Dove è necessario inserire il valore di salto. 0 è l'ultimo, 1 è il precedente, 2 è il commit prima di quello, ecc.


4
Perché non usare solo HEAD~1(dove 1 specifica 1 commit back)?
jduncanator,

1
La tua strada è coperta dalla risposta selezionata e funziona bene. Il mio è un modo diverso rispetto alla risposta selezionata.
Mike Graf,

3

Questo crea il ramo con un solo comando:

git push origin <sha1-of-commit>:refs/heads/<branch-name>

Preferisco così meglio di quelli pubblicati sopra, perché crea immediatamente il ramo (non richiede un comando push aggiuntivo in seguito).


3

Utilizzo di Sourcetree | La via più facile.

  • Per prima cosa, controlla il ramo che vuoi prendere il commit specifico per creare un nuovo ramo.
  • Quindi osserva la barra degli strumenti, seleziona Repository> Branch ... il collegamento è Comando + Maiusc + B.
  • E seleziona il commit specifico che vuoi prendere. E dai un nuovo nome al ramo quindi crea un ramo!

inserisci qui la descrizione dell'immagine


ho finalmente trovato questa risposta utile. Grazie
Firda Sahidi il

1

Questo è quello che ho fatto:

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'

C:\Users\jaimemontoya\Dropbox\CuponClub\androidapp\build>git branch
  master
* responsivenavigation

In questo caso, 8a75b001096536b3216022484af3026aa9c7bb5bera e vecchio commit appartenente al masterramo.


1

Vai a un commit particolare di un repository git

A volte, quando si lavora su un repository git, si desidera tornare a un commit specifico (revisione) per avere un'istantanea del progetto in un momento specifico. Per fare tutto ciò di cui hai bisogno, l'hash SHA-1 del commit che puoi facilmente trovare controllando il registro con il comando:

git log --abbrev-commit --pretty=oneline

che ti darà un elenco compatto di tutti i commit e la versione breve dell'hash SHA-1.

Ora che conosci l'hash del commit a cui vuoi andare puoi usare uno dei seguenti 2 comandi:

git checkout HASH

o

git reset --hard HASH

check-out

git checkout <commit> <paths>

Indica a git di sostituire lo stato corrente dei percorsi con il loro stato nel commit specificato. I percorsi possono essere file o directory.

Se non viene fornito alcun ramo, git assume il commit HEAD.

git checkout <path> // restores path from your last commit. It is a 'filesystem-undo'.

Se non viene fornito alcun percorso, git si sposta HEADsul commit dato (modificando in tal modo il commit su cui si è seduti e su cui si sta lavorando).

git checkout branch //means switching branches.

Ripristina

git reset <commit> //re-sets the current pointer to the given commit.

Se ci si trova in un ramo (in genere si dovrebbe essere) HEADe questo ramo viene spostato per eseguire il commit.

Se sei in uno HEADstato distaccato , git reset si sposta solo HEAD. Per ripristinare un ramo, prima verificalo.

Se volessi saperne di più sulla differenza tra git reset e git checkout ti consiglio di leggere il blog ufficiale di git .


2
grazie per la risposta, FYI: Questo: git log --abbrev-commit --pretty=oneline può essere abbreviato ingit log --oneline
Suhaib

0

Seleziona Commit

Per gli utenti di Git GUI è possibile visualizzare tutta la cronologia (se necessario) e quindi fare clic con il tasto destro del mouse sul commit da cui si desidera ramificare e immettere il nome del ramo.

Inserisci il nome della filiale

Visualizza tutta la storia



Giusto. La mia risposta inizia specificamente con le parole "Per gli utenti Git GUI ...". Non ho dato una risposta che funzionerà per tutti - che è già stato fatto. Ho fornito un metodo alternativo che potrebbe essere più semplice per molte persone. Penso che il motivo per cui la mia risposta non sia apprezzata è perché non è una soluzione per tutti, ma esiste già con un paio di migliaia di voti. Tuttavia, ciò non rende la mia risposta errata "Per gli utenti Git GUI!". CREATE NEW BRANCH è presente nella GUI. Dubito di essere l'unica persona al mondo ad usarlo!
Ivan

0

Per fare la risposta accettata in Visual Studio 2015 e 2017:

Fai clic sulle modifiche

Fai clic sulle modifiche (freccia rossa sopra)

Fai clic su Azioni per visualizzare la cronologia

Fai clic su Azioni (freccia rossa sopra) e fai clic su Visualizza cronologia nel menu a discesa

E si aprirà una nuova scheda:

Scheda Cronologia

E si dovrebbe fare clic con il pulsante destro del mouse sul commit precedente in cui si desidera ripristinare il codice: fare clic con il tasto destro del mouse sul commit precedente

Scegli di effettuare il checkout di una nuova filiale e voilá!

Di seguito, sebbene non faccia parte della domanda OP, ma faccio entrambe le cose e questo è un passo di trucco, almeno per me: se vuoi tornare a un commit precedente, senza checkout un nuovo ramo, NON scegliere ripristina (! ?); dovresti scegliere ridefinisci - mix o --hard:

fare clic con il tasto destro del mouse sul commit precedente e ridefinire


Ti preghiamo di condividere le tue risposte in inglese poiché la maggior parte di noi qui non parla o conosce altre lingue straniere oltre l'inglese.
Shamiul Hasan Rumman,

@ShamiulHasanRumman, nel testo che spiega le immagini - di solito in basso - ho tradotto il termine a punta della freccia rossa in inglese, come quello Click in Actions (freccia rossa sopra) Non era abbastanza?
Marcelo Scofano,

@MarceloScofano, è stato difficile cambiare l'editor in inglese prima di fare screenshot?
Andrew Surdu,

1
@AndreiSurdu: poiché non ho mai avuto la necessità di farlo, mi aspettavo che per passare all'inglese avrei dovuto installare un pacchetto aggiuntivo. Ma hai ragione, ha solo bisogno di un riavvio VS, nessuna installazione. Proverò a cambiare le immagini sopra appena avrò tempo libero.
Marcelo Scofano,

0

se usi l'albero dei sorgenti che è piuttosto semplice.

  • Fare clic con il tasto destro del mouse sul punto in cui è necessario creare un nuovo ramo
  • Clicca su 'ramo'
  • Digita il nome del nuovo ramo nella finestra di dialogo visualizzata e fai clic su "Crea ramo"

0

Se stai cercando una soluzione basata sulla riga di comando, puoi ignorare la mia risposta. Ti suggerirò di usare GitKraken . È un client UI git straordinario. Mostra l'albero Git sulla homepage. Puoi semplicemente guardarli e sapere cosa sta succedendo con il progetto. Basta selezionare un commit specifico, fare clic destro su di esso e selezionare l'opzione 'Crea un ramo qui'. Ti darà una casella di testo per inserire il nome del ramo. Inserisci il nome del ramo, seleziona 'OK' e sei pronto. È davvero molto facile da usare.

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.