web-dev-qa-db-fra.com

Comment écraser les commits après avoir été poussés?

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?

440
Loren

La courge s’engage localement avec 

git rebase -i Origin/master~4 master

puis forcez Push avec 

git Push Origin +master

Différence entre --force et +

De la documentation de git Push

Notez que --force s'applique à toutes les références qui sont poussées, utilisant donc avec Push.default défini sur matching ou avec plusieurs Push les destinations configurées avec remote.*.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 exemple git Push Origin +master pour forcer a Push vers la branche master).

611
Alan Haggai Alavi

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
78
jakob-r

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.

19
Stuart Cardall

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
  • Sur l'écran interactif qui s'ouvre, remplacez pick par squash En haut pour tous les commits que vous souhaitez écraser.
  • Enregistrez et fermez l'éditeur via esc --> :wq

Appuyez sur la télécommande en utilisant:

$ git Push Origin branch-name --force
14
BLRBoy

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é.

9
Nupur

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.

0
Alex

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.

0
lobsterhands

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)

0
terwxqian