Cela donne une bonne explication de l'écrasement de plusieurs validations:
http://git-scm.com/book/en/Git-Branching-Rebasing
mais cela ne fonctionne pas pour les commits qui ont déjà été poussés. Comment écraser les dernières validations dans mes référentiels local et distant?
EDIT: Quand je le fais git rebase -i origin/master~4 master
, conservez le premier comme pick
, définissez les trois autres comme squash
, puis quittez (via cx cc dans emacs), j'obtiens:
$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)
Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started
où 2f40 est le pick
commit. Et maintenant, aucun des 4 commits n'apparaît git log
. Je m'attendais à ce que mon éditeur soit redémarré pour que je puisse saisir un message de validation. Qu'est-ce que je fais mal?
git push --force origin master
git rebase -i origin/master
et veut réellement savoir comment rebaser les commits plus loin que cela, par exemplegit rebase -i origin/master~20 master
.+
force uniquement la refspec qui est préfixée par elle.--force
forcera toutes les refspecs à être poussées. Veuillez consulter la réponse mise à jour.Sur une branche j'ai pu le faire comme ça (pour les 4 derniers commits)
la source
Différence mineure par rapport à la réponse acceptée, mais j'avais beaucoup de difficulté à écraser et j'ai finalement compris.
esc --> :wq
Poussez vers la télécommande en utilisant:
la source
De nombreux problèmes peuvent être évités en créant uniquement un
branch
sur lequel travailler et ne pas travailler surmaster
:git checkout -b mybranch
Les travaux suivants s'appliquent aux
remote
validations déjà poussées et un mélange deremote
validations poussées /local
validations uniquement:J'ai également quelques notes de demande de tirage qui peuvent être utiles.
la source
git rebase -i master
vous obtiendrez l'éditeur vm ouvert et msgs quelque chose comme ça
Ici, j'ai changé le choix de tous les autres commits en "f" (Stands for fixup).
git push -f origin feature/feature-branch-name-xyz
cela corrigera toutes les validations en une seule validation et supprimera toutes les autres validations. Je l'ai fait et cela m'a aidé.
la source
Lorsque vous travaillez avec un Gitlab ou un Github, vous pouvez rencontrer des problèmes de cette manière. Vous écrasez vos commits avec l'une des méthodes ci-dessus. Mon préféré est:
sélectionnez squash ou fixup pour le vôtre. À ce stade, vous devriez vérifier l'état de git. Et le message pourrait être:
Et vous pouvez être tenté de le tirer. NE FAITES PAS CELA ou vous serez dans la même situation qu'auparavant.
Poussez plutôt vers votre origine avec:
Les + permettent de forcer la poussée sur une seule branche.
la source
Pour écraser deux commits, dont l'un a déjà été poussé, sur une même branche, les opérations suivantes ont fonctionné:
Par défaut, cela inclura le message de validation du dernier commit en tant que commentaire sur l'ancien commit.
la source
1)
git rebase -i HEAD~4
Pour élaborer: Il fonctionne sur la branche actuelle; le HEAD ~ 4 signifie écraser les quatre derniers commits; mode interactif (-i)
2) À ce stade, l'éditeur a ouvert, avec la liste des validations, pour modifier la deuxième validation et les suivantes, en remplaçant pick par squash puis en l'enregistrant.
sortie: refs / têtes / nom de branche correctement rebasés et mis à jour.
3)
git push origin refs/heads/branch-name --force
production:
la source