Cela donne une bonne explication sur la suppression de plusieurs commits:
http://git-scm.com/book/fr/Git-Branching-Rebasing
mais cela ne fonctionne pas pour les commits qui ont déjà été poussés. Comment puis-je supprimer les derniers commits les plus récents dans mon dépôt local et distant?
EDIT: Quand je fais git rebase -i Origin/master~4 master
, conserve le premier en tant que pick
, configure les trois autres en tant que squash
, puis quitte (via c-x c-c dans emacs), je reçois:
$ 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 dans git log
. Je m'attendais à ce que mon éditeur soit redémarré pour pouvoir entrer un message de validation. Qu'est-ce que je fais mal?
La courge s’engage localement avec
git rebase -i Origin/master~4 master
puis forcez Push avec
git Push Origin +master
--force
et +
De la documentation de git Push
:
Notez que
--force
s'applique à toutes les références qui sont poussées, utilisant donc avecPush.default
défini surmatching
ou avec plusieurs Push les destinations configurées avecremote.*.Push
peuvent remplacer les références autres que que la branche actuelle (y compris les références locales strictement situées derrière leur homologue distante). Pour forcer un Push à une seule branche, utilisez un+
devant le refspec to Push (par exemplegit Push Origin +master
pour forcer a Push vers la branchemaster
).
Sur une branche, j'ai pu le faire comme ceci (pour les 4 derniers commits)
git checkout my_branch
git reset --soft HEAD~4
git commit
git Push --force Origin my_branch
Beaucoup de problèmes peuvent être évités en créant seulement une branch
sur laquelle travailler & not ne travaillant pas sur master
:
git checkout -b mybranch
Les travaux suivants pour remote
commits déjà poussés et un mélange de remote
commits poussés/local
ne commettent que:
# example merging 4 commits
git checkout mybranch
git rebase -i mybranch~4 mybranch
# at the interactive screen
# choose fixup for commit: 2 / 3 / 4
git Push -u Origin +mybranch
J'ai aussi quelques notes de demande de tirage qui peuvent être utiles.
Différence mineure par rapport à la réponse acceptée, mais j'avais beaucoup de difficulté à écraser et finalement l'obtenir.
$ git rebase -i HEAD~4
esc --> :wq
Appuyez sur la télécommande en utilisant:
$ git Push Origin branch-name --force
git rebase -i master
vous obtiendrez l'éditeur vm ouvert et msgs quelque chose comme ça
Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message
#
#some more
Ici, j'ai changé le choix pour tous les autres commits en "f" (signifie correction).
git Push -f Origin feature/feature-branch-name-xyz
cela corrigera tous les commits sur un commet et supprimera tous les autres commits .J'ai fait cela et cela m'a aidé.
Lorsque vous travaillez avec un Gitlab ou un Github, vous pouvez avoir des problèmes de cette façon. Vous écrasez vos commits avec l'une des méthodes ci-dessus. Mon préféré est:
git rebase -i HEAD~4
or
git rebase -i Origin/master
sélectionnez squash ou fixup pour votre commit. À ce stade, vous devriez vérifier avec le statut git. Et le message pourrait être:
On branch ABC-1916-remote
Your branch and 'Origin/ABC-1916' have diverged,
and have 1 and 7 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Et vous pouvez être tenté de le tirer. NE FAITES PAS CELA ou vous serez dans la même situation qu'avant.
Poussez plutôt vers votre origine avec:
git Push Origin +ABC-1916-remote:ABC-1916
Les + permettent de forcer Push uniquement à une branche.
Pour écraser deux commits, dont l'un avait déjà été poussé, sur une seule branche, ce qui suit a fonctionné:
git rebase -i HEAD~2
[ pick older-commit ]
[ squash newest-commit ]
git Push --force
Par défaut, cela inclura le message de validation de la dernière validation en tant que commentaire sur la plus ancienne.
1) git rebase -i HEAD ~ 4
To elaborate: It works on the current branch; the HEAD~4 means squashing the latest four commits; interactive mode (-i)
2) À ce stade, l'éditeur a ouvert la liste des commits pour modifier le deuxième et les suivants, en remplaçant pick par squash puis enregistrez-le.
sortie: refs/heads/branch-name refondés et mis à jour avec succès.
3) git Push Origin références/têtes/nom de branche --force
output: ... remote: remote: Pour créer une demande de fusion pour un nom de branche, visitez le site: remote: http: // xxx/sc/server/merge_requests/new ? merge_request% 5Bsource_branch% 5D = sss remote: To ip: sc/server.git + 84b4b60 ... 5045693 nom-branche -> nom-branche (mise à jour forcée)