vedere - ramo git




Annulla una fusione Git che non è stata ancora spinta (18)

  1. Innanzitutto, assicurati di aver impegnato tutto.

  2. Quindi resettare il repository allo stato di lavoro precedente:

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    o usando --hard ( questo rimuoverà tutte le modifiche locali, non impegnate! ):

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

    Usa l'hash che c'era prima del commit sbagliato.

  3. Verifica quali commit vorresti reimpegnare nella parte superiore della versione precedente precedente:

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. Applica i tuoi diritti giusti sulla parte superiore della versione corretta del tuo repository:

    • Usando cherry-pick (le modifiche introdotte da alcuni commit esistenti)

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • Oppure selezionando la gamma di commit di:

      • Prima controlla le modifiche corrette prima di unirle:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • Prima controlla le modifiche corrette prima di unirle:

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

        dove questo è il range dei commit corretti che hai commesso (esclusa l'unione erroneamente impegnata).

All'interno del mio ramo master, ho fatto un git merge some-other-branch localmente, ma non ho mai spinto le modifiche al master di origine. Non intendevo unirmi, quindi mi piacerebbe annullarlo. Quando git status uno git status dopo la fusione, ricevevo questo messaggio:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

Sulla base di alcune istruzioni che ho trovato , ho provato a correre

git revert HEAD -m 1

ma ora sto ricevendo questo messaggio con lo git status :

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

Non voglio che la mia filiale sia in vantaggio con un numero qualsiasi di commit. Come ritorno a quel punto?


È necessario ripristinare il commit precedente. Questo dovrebbe funzionare:

git reset --hard HEAD^

O anche HEAD^^ per ripristinare quel commit di ripristino. Puoi sempre dare un riferimento SHA completo se non sei sicuro di quanti passi dovresti fare.

Nel caso in cui si riscontrino problemi e il ramo master non abbia apportato modifiche locali, è possibile ripristinare l' origin/master .


Arrivati ​​a questa domanda anche cercando di ripristinare l'origine (cioè NO si impegna prima dell'origine). Continuando a cercare, ho trovato un comando di reset esattamente per questo:

git reset --hard @{u}

Nota: @{u} è una scorciatoia per origin/master . (E, naturalmente, hai bisogno di un repository remoto per farlo funzionare.)


Con git reflog verifica quale commit è uno prima dell'unione (git reflog sarà l'opzione migliore di git log). Quindi puoi resettarlo usando:

git reset --hard commit_sha

C'è anche un altro modo

git reset --hard HEAD~1

ti riporterà 1 commit.

Tieni presente che tutti i file modificati e non salvati / non archiviati verranno ripristinati allo stato non modificato . Per tenerli entrambi, riporre le modifiche o visualizzare --merge opzione --merge seguito.

Come @Velmont ha suggerito sotto nella sua risposta, in questo caso diretto usando:

git reset --hard ORIG_HEAD

potrebbe dare risultati migliori, in quanto dovrebbe preservare le tue modifiche. ORIG_HEAD indicherà un commit direttamente prima ORIG_HEAD , quindi non dovrai ORIG_HEAD da solo.

Un altro consiglio è di usare l' --merge invece di --hard poiché non resetta i file inutilmente:

--merge

Ripristina l'indice e aggiorna i file nell'albero di lavoro che sono diversi tra <commit> e HEAD, ma mantiene quelli che sono diversi tra l'indice e l'albero di lavoro (ovvero che hanno modifiche che non sono state aggiunte).


Con le versioni Git più recenti, se non hai ancora eseguito l'unione e hai un conflitto di unione , puoi semplicemente:

git merge --abort

man git merge :

[Questo] può essere eseguito solo dopo che l'unione ha provocato conflitti. git merge --abort interromperà il processo di unione e tenterà di ricostruire lo stato di pre-unione.


In questo caso, vorrai resettare il tuo ramo con git reset --hard <branch_name> . Se vuoi salvare le tue modifiche prima di resetterle assicurati di creare un nuovo branch e git checkout <branch_name> .

È possibile ripristinare lo stato su un commit specifico con git reset --hard <commit_id> .

Se le modifiche sono state inserite, puoi usare git revert <branch_name> . Assicurati di controllare come usare git revert e git checkout anche in altri scenari.


La risposta più semplice è quella di odinho - Velmont

Prima di tutto git reset --merge ORIG_HEAD

Per coloro che desiderano reimpostare dopo aver apportato le modifiche, eseguire questa operazione (poiché questo è il primo post visualizzato per qualsiasi domanda di unione di re git)

git push origin HEAD --force

Questo verrà ripristinato in un modo che non si otterranno le modifiche unite di nuovo dopo pull.


Ok, le risposte che altre persone mi hanno dato erano vicine, ma non ha funzionato. Ecco cosa ho fatto.

Facendo questo...

git reset --hard HEAD^
git status

... mi ha dato il seguente stato.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

Ho quindi dovuto digitare lo stesso comando git reset parecchie volte. Ogni volta che l'ho fatto, il messaggio è cambiato di uno come puoi vedere qui sotto.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

A questo punto, ho visto il messaggio di stato cambiato, quindi ho provato a fare un git pull , e quello sembrava funzionare:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

Per farla breve, i miei comandi sono arrivati ​​a questo:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

Puoi usare git reflog per trovare il checkout precedente. A volte questo è un buono stato in cui vuoi tornare.

concretamente,

$ git reflog
$ git reset --hard [email protected]{0}

Puoi usare il comando git-reset.

git-reset - Reimposta la corrente HEAD su

stato specificato git reset [--mixed |

--soft | --hard | --merge] [-q] [] git reset [-q] []

[-] ... git reset --patch

[] [-] [...]

GIT-Reset


Se hai effettuato l'unione:

git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard

Se la fusione e i commit corrispondenti non sono stati ancora inseriti, puoi sempre passare a un altro ramo, eliminare quello originale e ricrearlo.

Per esempio, ho accidentalmente unito un ramo di sviluppo in master e ho voluto annullarlo. Utilizzando i seguenti passaggi:

git checkout develop
git branch -D master
git branch -t master origin/master

Ecco! Il master è nella stessa fase dell'origine e il tuo stato di mis-merging viene cancellato.


Se noti che devi ripristinare immediatamente dopo l'unione e non hai fatto altro dopo il tentativo di fusione, puoi semplicemente eseguire questo comando: git reset --hard [email protected]{1} .

In sostanza, il tuo merge sha punta a [email protected]{0} se non è stato eseguito alcun commit dopo l'unione e quindi [email protected]{1} sarà il punto precedente prima dell'unione.


Se vuoi una soluzione da riga di comando, ti suggerisco di andare con la risposta di MBO.

Se sei un principiante, ti potrebbe piacere l'approccio grafico:

  1. gitk lancio di gitk (dalla riga di comando o fai clic con il pulsante destro del mouse nel file browser se disponi di quello)
  2. Puoi facilmente individuare l'unione di commit lì - il primo nodo dall'alto con due genitori
  3. Segui il link al genitore primo / sinistro (quello sul tuo ramo corrente prima dell'unione, di solito rosso per me)
  4. Sul commit selezionato, fai clic con il pulsante destro del mouse su "Reimposta ramo qui", seleziona qui il reset completo

Sono stato in grado di risolvere questo problema con un singolo comando che non implica la ricerca di un ID di commit.

git reset --hard remotes/origin/HEAD

La risposta accettata non ha funzionato per me, ma questo comando ha raggiunto i risultati che stavo cercando.


Supponendo che il tuo master locale non fosse in anticipo su origine / master, dovresti essere in grado di farlo

git reset --hard origin/master

Quindi il tuo master branch locale dovrebbe apparire identico origin/master .



Strategia: crea una nuova filiale da dove tutto è andato bene.

Motivazione: il ripristino di un'unione è difficile. Ci sono troppe soluzioni, a seconda di molti fattori, ad esempio se hai commesso o spinto l'unione o se ci sono stati nuovi commit dall'unione. Inoltre devi ancora avere una conoscenza relativamente approfondita di git per adattare queste soluzioni al tuo caso. Se segui ciecamente alcune istruzioni, puoi finire con una "unione vuota" in cui nulla verrà unito, e un'ulteriore unione di tentativi farà sì che Git ti dica "Già aggiornato".

Soluzione:

Diciamo che vuoi unire dev in feature-1 .

  1. Trova la revisione che desideri ricevere l'unione:

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. Dai un'occhiata (torna indietro nel tempo):

    git checkout e5f6g7h8
    
  3. Crea una nuova filiale da lì e dai un'occhiata:

    git checkout -b feature-1
    

Ora puoi riavviare l'unione:

  1. Unisci: git merge dev

  2. Risolvi i conflitti di unione.

  3. Commit: git commit

  4. Quando sei soddisfatto dei risultati, elimina il vecchio ramo: git branch --delete feature-1





git-merge