git - stash - Reimposta il ramo del repository locale come se fosse un repository remoto HEAD




git undo commit (12)

È possibile impostare il ramo in modo che corrisponda esattamente al ramo remoto in due passaggi:

git fetch origin
git reset --hard origin/master

Se vuoi salvare lo stato del tuo attuale ramo prima di fare questo (per ogni evenienza), puoi fare:

git commit -a -m "Saving my work, just in case"
git branch my-saved-work

Ora il tuo lavoro viene salvato sul ramo "my-saved-work" nel caso in cui tu decida di volerlo indietro (o vuoi vederlo in seguito o diffarlo contro il tuo ramo aggiornato).

Si noti che il primo esempio presuppone che il nome del repository remoto sia "origine" e che il ramo denominato "master" nel repository remoto corrisponda al ramo attualmente ritirato nel repository locale.

A proposito, questa situazione in cui ti trovi sembra molto simile a un caso comune in cui è stata effettuata una push nel ramo attualmente estratto di un repository non nudo. Hai recentemente inserito nel tuo repository locale? In caso contrario, non preoccuparti: qualcos'altro deve aver causato la modifica imprevista di questi file. Altrimenti, si dovrebbe essere consapevoli del fatto che non è consigliabile inserire un repository non nudo (e non nel ramo attualmente estratto, in particolare).

Come faccio a resettare il mio ramo locale come il ramo sul repository remoto?

L'ho fatto:

git reset --hard HEAD

Ma quando git status uno git status ,

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
      modified:   java/com/mycompany/TestContacts.java
      modified:   java/com/mycompany/TestParser.java

Puoi dirmi perché ho questi "modificati"? Non ho toccato questi file? Se l'ho fatto, voglio rimuoverli.


A condizione che il repository remoto sia di origin e che siate interessati a branch_name :

git fetch origin
git reset --hard origin/<branch_name>

Inoltre, si va per resettare il ramo d' origin corrente a HEAD .

git fetch origin
git reset --hard origin/HEAD

Come funziona:

git fetch origin scarica le ultime dal remoto senza tentare di unire o rebase nulla.

Quindi il git reset reimposta il ramo <branch_name> in quello che hai appena recuperato. L'opzione --hard cambia tutti i file nella struttura di lavoro in modo che corrispondano ai file in origin/branch_name .


Ecco uno script che automatizza ciò che la risposta più popolare suggerisce ... Vedi https://.com/a/13308579/1497139 per una versione migliorata che supporta le filiali

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see https://.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  git branch "auto-save-at-$timestamp" 
fi
git fetch origin
git reset --hard origin/master

Innanzitutto, ripristinare l' HEAD precedentemente recuperato del ramo upstream corrispondente:

git reset --hard @{u}

Il vantaggio di specificare @{u} o la sua forma dettagliata @{upstream} è che il nome del repository remoto e del ramo non devono essere esplicitamente specificati.

Successivamente, se necessario, rimuovi i file non tracciati, opzionalmente anche con -x :

git clean -df

Infine, se necessario, ottieni le ultime modifiche:

git pull

L'unica soluzione che funziona in tutti i casi che ho visto è quella di eliminare e reclinare. Forse c'è un altro modo, ma ovviamente in questo modo non lascia alcuna possibilità che il vecchio stato venga lasciato lì, quindi lo preferisco. Bash one-liner che puoi impostare come macro se spesso incasini tutto in git:

REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH

* presume che i tuoi file .git non siano corrotti


Le risposte precedenti presuppongono che il ramo da ripristinare sia il ramo corrente (estratto). Nei commenti, OP hap497 ha chiarito che il ramo è effettivamente controllato, ma questo non è esplicitamente richiesto dalla domanda originale. Poiché esiste almeno una domanda "duplicata", Reimposta completamente il ramo nello stato del repository , che non presuppone che il ramo sia estratto, ecco un'alternativa:

Se il ramo "mybranch" non è attualmente estratto, per resettarlo al ramo remoto "myremote / mybranch", puoi usare questo comando di low-level :

git update-ref refs/heads/mybranch myremote/mybranch

Questo metodo lascia il ramo estratto così com'è e l'albero di lavoro non toccato. Sposta semplicemente la testa di mybranch in un altro commit, qualunque cosa venga data come secondo argomento. Ciò è particolarmente utile se è necessario aggiornare più rami su nuove testate remote.

Fai attenzione quando lo fai, e usa gitk o uno strumento simile per ricontrollare l'origine e la destinazione. Se accidentalmente fai questo sul ramo corrente (e git non ti tratterrà da questo), potresti diventare confuso, perché il nuovo contenuto del ramo non corrisponde all'albero di lavoro, che non è cambiato (per correggere, aggiorna nuovamente il ramo, a dove era prima).


Questo è qualcosa che affronto regolarmente, e ho generalizzato la sceneggiatura di Wolfgang di cui sopra per lavorare con qualsiasi filiale

Ho anche aggiunto un prompt "sei sicuro", e un po 'di feedback

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] || 
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
  git branch "auto-save-$branchname-at-$timestamp" 
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname

Se hai avuto un problema come me, hai già effettuato alcune modifiche, ma ora, per qualsiasi ragione tu voglia eliminare, il modo più veloce è usare git reset come questo:

git reset --hard HEAD~2

Ho avuto 2 non necessari commit, quindi il numero 2. È possibile modificare il proprio numero di commit da ripristinare.

Quindi, rispondendo alla tua domanda - se hai 5 commit prima di HEAD nel repository remoto, dovresti eseguire questo comando:

git reset --hard HEAD~5

Nota che perderai le modifiche che hai apportato, quindi fai attenzione!


Se si desidera che le modifiche correnti vengano utilizzate in seguito, se si memorizzano le altre modifiche è possibile utilizzare questi due comandi,

git fetch origin
git reset --hard origin/master

Se si desidera ripristinare il ramo locale per l'ultimo commit nel ramo upstream, ciò che funziona per me finora è:

Controlla i tuoi telecomandi, assicurati che il tuo upstream e l'origine siano quelli che ti aspetti, se non come previsto poi usa git remote add upstream <insert URL> , ad esempio del repository GitHub originale da cui sei biforcato, e / o git remote add origin <insert URL of the forked GitHub repo> .

git remote --verbose

git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;

O:

git fetch upstream master;
git reset --hard upstream/master;
git clean -d --force;

Su GitHub, puoi anche controllare il ramo con lo stesso nome di quello locale, per salvare il lavoro lì, anche se questo non è necessario se lo sviluppo dell'origine ha le stesse modifiche del ramo di lavoro salvato locale. Sto usando il ramo di sviluppo come esempio, ma può essere qualsiasi nome di ramo esistente.

git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop

Quindi se hai bisogno di unire queste modifiche con un altro ramo mentre ci sono dei conflitti, preservando le modifiche nello sviluppo, usa:

git merge -s recursive -X theirs develop

Durante l'uso

git merge -s recursive -X ours develop

per conservare le modifiche in conflitto di branch_name. Altrimenti usa un mergetool con git mergetool .

Con tutte le modifiche insieme:

git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;

Nota che invece di upstream / develop potresti usare un hash di commit, un altro nome di ramo, ecc. Usa uno strumento CLI come Oh My Zsh per verificare che il tuo ramo sia verde indicando che non c'è nulla da commettere e la directory di lavoro è pulita ( che è confermato o anche verificabile dallo git status ). Si noti che questo potrebbe effettivamente aggiungere commit rispetto allo sviluppo a monte se c'è qualcosa aggiunto automaticamente da un commit, ad esempio diagrammi UML, intestazioni di licenza, ecc., In tal caso, è possibile quindi origin develop le modifiche origin develop a upstream develop , se necessario.


Tutto quanto sopra suggerito è giusto, ma spesso per resettare veramente il tuo progetto, devi anche rimuovere anche i file che si trovano nel tuo .gitignore .

Per ottenere l'equivalente morale di cancellare la directory del progetto e ripetere la clonazione dal remoto è:

git fetch
git reset --hard
git clean -x -d -f

Attenzione : git clean -x -d -f è irreversibile e potresti perdere file e dati (ad es. Cose che hai ignorato usando .gitignore ).


git reset --hard HEAD si resetta solo all'ultimo stato impegnato. In questo caso HEAD si riferisce al TESTO del tuo ramo.

Se hai diversi commit, questo non funzionerà ..

Quello che probabilmente vuoi fare è resettare l'origine o qualunque cosa venga richiamata. Probabilmente farei solo qualcosa del genere

git reset --hard origin/HEAD

Stai attento però. Le reimpostazioni rigide non possono essere facilmente annullate. È meglio fare come suggerisce Dan e rimuovere una copia delle tue modifiche prima di resettare.







undo