Se ho n commit, come posso diramare dal commit n-3?
Vedo l'hash di ogni commit.
Se ho n commit, come posso diramare dal commit n-3?
Vedo l'hash di ogni commit.
Risposte:
È 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>
git push origin BRANCH_NAME
<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>
Per fare questo su github.com:
La magia può essere fatta con git reset .
Crea una nuova filiale e passa ad essa (quindi tutti i tuoi ultimi commit sono memorizzati qui)
git checkout -b your_new_branch
Torna al tuo precedente ramo di lavoro (supponi che sia il master)
git checkout master
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).
git reset --hard
non è una buona idea se hai già spinto il commit all'origine ...
git push --force
se avessi già spinto il ramo prima
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>
git checkout -b <branch-name> <sha1-of-commit>
git branch branchname <sha1-of-commit>
" (dalla risposta accettata)?
git checkout -b
per creare un nuovo ramo.
Un modo rapido per farlo sul tuo repository Github sarebbe il seguente:
Esegui semplicemente:
git checkout -b branch-name <commit>
Per esempio :
git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8
Il checkout
comando con il parametro -b
creerà un nuovo ramo E ti farà passare ad esso
git fetch
e git branch
comanda 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
Una grande domanda correlata è: come diavolo riesci a capirlo usando l' --help
opzione 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.
Per fare questo in Eclipse:
Creerà una filiale locale per te. Quindi ogni volta che invii le modifiche, la tua filiale verrà trasferita al server remoto.
Puoi farlo in Stash.
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.
HEAD~1
(dove 1 specifica 1 commit back)?
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).
Utilizzo di Sourcetree | La via più facile.
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, 8a75b001096536b3216022484af3026aa9c7bb5b
era e vecchio commit appartenente al master
ramo.
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 HEAD
sul 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) HEAD
e questo ramo viene spostato per eseguire il commit.
Se sei in uno HEAD
stato 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 .
git log --abbrev-commit --pretty=oneline
può essere abbreviato ingit log --oneline
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.
Per fare la risposta accettata in Visual Studio 2015 e 2017:
Fai clic sulle modifiche (freccia rossa sopra)
Fai clic su Azioni (freccia rossa sopra) e fai clic su Visualizza cronologia nel menu a discesa
E si aprirà una nuova scheda:
E si dovrebbe fare clic con il pulsante destro del mouse sul commit precedente in cui si desidera ripristinare il codice:
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:
se usi l'albero dei sorgenti che è piuttosto semplice.
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.