Git pull après mise à jour forcée

j'ai juste écrasé quelques commits avec git rebase et fait un git push --force (ce qui est mal, je sais).

Maintenant, les ingénieurs logiciels ont une histoire différente et quand ils font un git pull , Git va fusionner. Y a-t-il un moyen d'arranger ça, à part faire un rm my-repo; git clone [email protected]:my-repo.git ?

j'ai besoin de quelque chose comme le contraire de git push --force , mais git pull --force n'a pas donné les résultats escomptés.

222
demandé sur Peter Mortensen 2012-03-22 02:30:45
la source

2 ответов

Pour recevoir les nouveaux commits

git fetch

Reset

vous pouvez réinitialiser la propagation pour une branche locale en utilisant git reset .

pour changer le commit d'une branche locale:

git reset origin/master --hard

mais attention, comme le dit la documentation:

réinitialise l'index et l'arbre de travail. Toute modification des dossiers dans l'arbre de travail puisque sont éliminés.

si vous voulez réellement garder les changements que vous avez localement - faire un --soft réinitialiser à la place. Qui mettra à jour l'historique de propagation de la branche, mais ne modifiera aucun fichier du répertoire de travail (et vous pourrez ensuite les propager).

Rebase

vous pouvez rejouer vos propagations locales sur n'importe quelle autre commit / branche en utilisant git rebase :

git rebase -i origin/master

cela va invoquer rebase en mode interactif où vous pouvez choisir comment appliquer chaque commit individuel qui n'est pas dans l'histoire que vous rebasez sur le dessus de.

si les commits que vous avez supprimés (avec git push -f ) ont déjà été tirés dans l'histoire locale, ils seront listés comme commits qui seront appliqués de nouveau - ils devraient être supprimés dans le cadre de la rebase ou ils seront simplement ré-inclus dans l'histoire de la branche - et réapparaître dans l'histoire à distance sur la prochaine poussée.

utilisez l'aide git command --help pour plus de détails et des exemples sur l'une des commandes ci-dessus (ou autre).

367
répondu AD7six 2018-01-16 20:17:53
la source

cela ne corrigera pas les branches qui ont déjà le code que vous ne voulez pas en elles( voir ci-dessous pour savoir comment faire cela), mais si elles ont tiré une branche et veulent maintenant qu'elle soit propre (et pas "en avant" d'origine / une branche) alors vous simplement:

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

Note: Vous pouvez combiner ces tous en mettant & & & entre eux

Note2: Florian l'a mentionné dans un commentaire, mais qui lit les commentaires quand il cherche des réponses?

Note 3: Si vous avez des branches contaminées, vous pouvez en créer de nouvelles à partir de la nouvelle "branche muette" et il suffit de choisir les commits.

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

maintenant la fonctionnalité-nouvelle est votre branche sans le supplément (peut-être mauvais) commet!

12
répondu Tom Prats 2018-01-17 02:33:05
la source

Autres questions sur git git-pull