Git pull dopo l’aggiornamento forzato

Ho semplicemente schiacciato alcuni commit con git rebase e ho fatto un git push --force (che è malvagio, lo so).

Ora gli altri ingegneri del software hanno una storia diversa e quando si git pull , Git si fonderà. C’è un modo per risolvere questo problema, tranne fare un rm my-repo; git clone git@example.org:my-repo.git rm my-repo; git clone git@example.org:my-repo.git ?

Ho bisogno di qualcosa come il contrario di git push --force , ma git pull --force non ha dato i risultati attesi.

Per ricevere i nuovi commit

 git fetch 

Reset

Puoi resettare il commit per un ramo locale usando git reset .

Per cambiare il commit di una succursale locale:

 git reset origin/master --hard 

Attenzione però, come dice la documentazione:

Reimposta l’indice e l’albero di lavoro. Qualsiasi modifica ai file tracciati nell’albero di lavoro poiché viene scartata.

Se vuoi effettivamente mantenere le modifiche che hai localmente, fai invece un reset di --soft . Che aggiornerà la cronologia dei commit per il ramo, ma non cambierà alcun file nella directory di lavoro (e potrai quindi eseguirne il commit).

rebase

Puoi riprodurre i tuoi commit locali su qualsiasi altro commit / ramo usando git rebase :

 git rebase -i origin/master 

Ciò invocherà rebase in modalità intertriggers in cui è ansible scegliere come applicare ogni singolo commit che non è nella cronologia su cui si sta riposizionando.

Se i commit che hai rimosso (con git push -f ) sono già stati inseriti nella cronologia locale, saranno elencati come commit che verranno riapplicati – dovranno essere eliminati come parte del rebase o verranno semplicemente reindirizzati incluso nella cronologia per il ramo e riappare nella cronologia remota alla prossima pressione.

Usa il git command --help per maggiori dettagli ed esempi su uno dei comandi sopra (o altri).

Questo non risolverà i rami che hanno già il codice che non vuoi in loro (vedi sotto per come farlo), ma se hanno estratto qualche ramo e ora vogliono che sia pulito (e non “avanti” di origine / qualche ramo) quindi semplicemente:

 git checkout some-branch # where some-branch can be replaced by any other branch git branch base-branch -D # where base-branch is the one with the squashed commits git checkout -b base-branch origin/base-branch # recreating branch with correct commits 

Nota: puoi combinarli tutti inserendo && tra di essi

Nota 2: Florian ha menzionato questo in un commento, ma chi legge i commenti quando cerca le risposte?

Nota3: se si hanno rami contaminati, è ansible crearne di nuovi basandosi sul nuovo “ramo stupido” e limitandosi a selezionare selettivamente.

Ex:

 git checkout feature-old # some branch with the extra commits git log # gives commits (write down the id of the ones you want) git checkout base-branch # after you have already cleaned your local copy of it as above git checkout -b feature-new # make a new branch for your feature git cherry-pick asdfasd # where asdfasd is one of the commit ids you want # repeat previous step for each commit id git branch feature-old -D # delete the old branch 

Ora feature-new è il tuo ramo senza i commit extra (possibilmente brutti)!