2013-11-04 21 views
7

Ho inviato un commit (denominato "A commit") per revisionare (Gerrit) utilizzando il comando git review.Come rivedere uno specifico commit su Git

Ora eseguo un nuovo commit (denominato "B commit") e desidero inviarlo anche per la revisione, ma non voglio inviare nuovamente "A commit". Non ci sono dipendenze l'un l'altro.

Come inviare una recensione a gerrit per uno specifico commit ?.

UPDATE:

$ git add --all 


$ git status 

# On branch delete_role 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: path/to/file.ext 


$ git status 

# On branch delete_role 
nothing to commit (working directory clean) 


$ git branch 

*delete_role 
master 


$ git log --graph --decorate --oneline -n13 

* 531bd84 (HEAD, delete_role) commit 3 
* df68f1a (master) commit 2 
* 4ce2d8d commit 1 
* 6751c7d (origin/master, origin/HEAD, gerrit/master) 

commit "df68f1a" e "4ce2d8d" dipendono e sono stati inviati in un precedente comando git review, ma commit "531bd84" appartiene ad un nuovo ramo (delete_role) perché è un nuovo problema.

$ git review 

You have more than one commit that you are about to submit. 
The outstanding commits are: 

531bd84 (HEAD, delete_role) commit 3 
df68f1a (master) commit 2 
4ce2d8d commit 1 

voglio invio di Gerrit solo le "531bd84" commit, non gli altri.

risposta

7

Creare il commit B in un nuovo ramo.

Mentre ci si trova su questo ramo, utilizzare git review e si sposterà il contenuto di questo ramo solo su Gerrit.

In questo modo, Gerrit non prenderà in considerazione che il vostro commit B ha bisogno del vostro impegno A e, se si desidera, è possibile unire la vostra impegnarsi B al ramo di lavoro prima commettere un

Se la vostra storia è come questo:

...-old(merged)-A(waiting for review) 

ciò che si vuole fare è:

...-old(merged)-A(waiting for review) <-master branch 
     \B(new commit)     <-new branch 

Quindi, se siete sul ramo B, e utilizzare git review, non spingerà altro che commettere B

Se siete in questa situazione:

...-old(merged)-A(waiting for review)-B 

, ciò che si vuole fare per ottenere la configurazione che vogliamo è:

git log (Note the SHA1 of your B commit) 
git reset HEAD^^^ (you go back in detched state three commits before, before the two you don't want to send) 
git checkout -b Breview (you create a new branch there) 
git cherry-pick +the SHA1 you noted (you copy your B commit on your new branch) 
git checkout master (you return on your branch with the two commit) 
git reset HEAD^--hard (you delete the B commit from this branch where you don't need it) 

Ora, avete raggiunto la configurazione voluta e di spingere il vostro B commettere, non vi resta che fare:

git checkout Breview 
git review 

e presenterà solo il vostro B commettere

+1

Sì, crea il commit B su un ramo basato sul ramo remoto (quindi senza commit A). È preferibile creare sempre un ramo per ogni commit che si desidera sottoporre a revisione (eccetto che alcuni commit dipendono l'uno dall'altro). – StephenKing

+0

Ok, ho creato un nuovo ramo e mi sono trasferito. Ho fatto un nuovo commit su questo nuovo ramo ma, quando eseguo "git review", GIT dice che "hai più di un commit che stai per inviare". Voglio dire, GIT mostra commit dal ramo "master" e "il nuovo" ramo, non solo dal "nuovo" ramo. Mi aspettavo che ci fosse solo 1 commit, dal "nuovo" ramo. – Lobo

+0

@Lobo Il nuovo ramo dipende dal ramo principale? –

1

Il modo in cui lo vedo ha un ramo su cui lavori, quindi hai commit A e il successivo commit B è anche nello stesso ramo. Quindi logicamente non dipendono l'uno dall'altro, ma per la cronologia tali cambiamenti dipendono. Quindi, prima il commit A dovrà essere rivisto e unito al ramo di lavoro prima che il secondo B possa essere unito.

Ora quando si spingono i riferimenti per la revisione, Gerrit sa già con il cambiamento di identità ciò che è stato premuto per la revisione.Se si esegue il push del ramo per la revisione, verranno inviati solo nuovi commit o commit aggiornati o rebased.

Per farla breve. Gerrit sa cosa è nuovo e cosa è già in revisione.

1

Dopo aver premuto commit 'A' è possibile ripristinare il ramo locale e iniziare a lavorare su commit 'B'. Dal momento che ogni commit/cambiamento può essere verificato da Gerrit in seguito, una volta che è stato spinto a esaminare il ramo. puoi ottenere il comando dalla bacheca di Gerrit in ogni pannello di download di patchset. un esempio:

git fetch https://android.googlesource.com/kernel/tegra refs/changes/43/69243/2 && git checkout FETCH_HEAD 

Dopo aver verificato un cambiamento, può essere modificato e inviato nuovamente come nuovo set di patch. Quindi non è necessario utilizzare i rami locali per ogni commit.

4

rami sono la risposta:

Se non hai fatto commettere un quindi prima di fare commettere un make ramo A, quindi commettere il codice per quel ramo e presentarlo per la revisione Poi, torna al master e creare il ramo B, impegnarsi nel ramo B e inviare per la revisione. In questo modo si assicura che non ci siano dipendenze.

Ok, ora Diciamo che avete commesso tutto nel master come questo:

M----A----B 

Questo è il registro:

commit b58fff12319d7ad1b1bc6ebcf4395d986a8ffac3 
Author: 
Date: Fri Nov 8 09:48:23 2013 +0800 

    Change B 

commit 99f249cdf2352ace3ca9ee8bf7a8a732f27b31eb 
Author: 
Date: Fri Nov 8 09:47:56 2013 +0800 

    Change A 

commit f091b7a4cc5c0532973c5bd401d2171f6fb735ec 
Author: 
Date: Fri Nov 8 09:47:30 2013 +0800 

    Initial commit 

Quello che vogliamo è questo:

A 
/
/
M 
\ 
    \ 
    B 

Per ottenere questo creare, eseguire i seguenti comandi:

# Create two new branches from the point where the current Gerrit repo master is now 
git branch A f091b7a4cc5c0532973c5bd401d2171f6fb735ec 
git branch B f091b7a4cc5c0532973c5bd401d2171f6fb735ec 
git checkout A # Create a branch to hold change A 
git merge 99f249cdf2352ace3ca9ee8bf7a8a732f27b31eb 
git log 
commit 99f249cdf2352ace3ca9ee8bf7a8a732f27b31eb 
Author: 
Date: Fri Nov 8 09:47:56 2013 +0800 

    Change A 

commit f091b7a4cc5c0532973c5bd401d2171f6fb735ec 
Author: 
Date: Fri Nov 8 09:47:30 2013 +0800 

    Initial commit 
git checkout B 
git cherry-pick b58fff12319d7ad1b1bc6ebcf4395d986a8ffac3 
git log 
# Note the new sha1 hash as this is change could not be fast forwarded 
commit d3aa1acc2b208115c7de78d5c9c4f6a906ece84a 
Author: 
Date: Fri Nov 8 09:48:23 2013 +0800 

    Change B 

commit f091b7a4cc5c0532973c5bd401d2171f6fb735ec 
Author: 
Date: Fri Nov 8 09:47:30 2013 +0800 

    Initial commit 

Ora che ci sono due rami che contengono una modifica ciascuno, premendo una di queste modifiche su Gerrit si otterrà una sola modifica.

allora si potrebbe desiderare di ripulire voi master rimuovere i commit da lì:

git checkout master 
git reset --hard HEAD~2 

appositamente per la domanda di aggiornamento:

git branch B 6751c7d 
git checkout B 
git cherry-pick 531bd84 

È necessario creare il ramo dalla gerrit master 675c7d, quindi seleziona il commit 3 nel nuovo ramo, quindi puoi eliminare il tuo vecchio ramo delete_role

+0

Ho 2 commit nel ramo "master". Ho creato una nuova filiale e sono passato a questo nuovo ramo. Ho apportato alcune modifiche e ho effettuato un nuovo commit. Ora, quando lancio "git review", GIT afferma che "hai più di un commit che stai per inviare". – Lobo

+0

Mi aspettavo che ci fosse solo 1 commit da inviare per la revisione. – Lobo

+1

Hai creato il ramo dal master come è ora su Gerrit? Dovresti avviare il ramo dal punto in cui si trova ora il master Gerrit. – uncletall

Problemi correlati