7
votes

Comment faire de la découverte d'un ancien commit et en faire un nouveau commit

Je voulais "suivi" avec une autre question à ce sujet: Checkout de commettre et faites-en un nouveau commit < / p>

Mais ils disent "ne fais pas ça!" Il semble donc que je dois poser une nouvelle question. (Même si c'est la même question où je pense que la réponse est la meilleure pour moi ne fonctionnait pas comme prévu ...

Si j'ai commises A-B-C-D-E-F (Imaginez ce sont toutes SHA'S). Je veux faire tout le référentiel exactement comme C , puis commettre cela pour créer 'g' ce qui est exactement comme C . De sorte que lorsque je suis terminé, le journal est A-B-C-D-E-F-G même si C & G est identique.

Une réponse indiquée Cherry-Chick, qui semblait parfaite, sauf que cela m'a fait résoudre chaque conflit entre C et f . J'ai regardé la documentation et j'ai essayé - forcer de toute façon, puis la recommandation de - patch . - patch était le plus proche mais ce n'était pas absolu. Il y a donc un moyen de faire choisir Cherry-Choisir simplement la version C du conflit?

L'autre réponse la plus proche serait de vérifier C , mais je n'ai pas pu trouver le mot magique qui le garderait sur la même branche. La formation récente que j'ai complétée a été complétée, utilisez le "Dash Magic Dash" à la fin pour indiquer Git Vous le souhaitez sur la branche actuelle, mais peu importe ce que je fais, crée une succursale "(sans succursale)" .

Comme je suis sûr que vous pouvez dire, je suis assez nouveau à git (et ligne de commande en général) mais j'ai essayé de le comprendre seul. Si vous pouviez utiliser les versions verboses de ce que vous recommandez, il vous colle mieux dans ma tête et serait grandement apprécié. ( -A = - Tous ou -A = --Annotate ou -A = --Albuquerque? )

Cela semble si simple et exactement ce que vous voudrez peut-être faire avec Git - remonter un commit précédent sans perdre l'intermédiaire commettre au cas où vous changez d'avis.

git

2 commentaires

Qu'entendez-vous par «où d, e et f sont là»?


"Droite" signifie que le journal complet quand je suis fait est A-B-C-D-E-F-G même si C & G est identique


8 Réponses :


5
votes

Ça vous dérange de générer: abcdef-f'-e'-d ' code> où l'état du code à d' code> est exactement tel qu'il était à C code> (donc g code> == d ' code>)? Dans ce cas, il suffit de revenir f code>, e code> et d code>. Si vous ne voulez pas que les étapes intermédiaires, revenir code> mais ne s'appliquent pas, puis commettez. C'est-à-dire:

$ git revert -n HEAD
$ git revert -n HEAD~
$ git revert -n HEAD~2
$ git commit -m 'Revert D,E,and F'


1 commentaires

Encore une fois, la réponse est peut-être "Non, il n'y a pas une simple commande en une étape pour revenir tout le référentiel à un précédent état de validation comme un nouveau commit". Je sais que je peut le faire avec des revêtements de branchement ou successives, mais ceux-ci sont surchargés pour mon cas d'utilisation. Merci!



1
votes

1 commentaires

Oui. Je voudrais amour d'utiliser Cherry-Chick. L'objectif est de trouver la séquence de paramètres que je peux ajouter à git cherry-pick c de sorte qu'il ne me demande pas de résoudre tous les conflits en cours de route. Merci!



0
votes

Si vous voulez vous retrouver avec: -g-d-e-f (Pas sûr, je suis confus par "où d, e et f sont là.") Ensuite, la meilleure façon d'y arriver est Rebase -I et Squash A-B-C ensemble.


2 commentaires

Désolé, cette phrase n'était pas précise. Ce que je veux à la fin, c'est l'historique de validation complet de A-B-C-D-E-F-G, même si C & G vient d'être identique. Je suis excité de trouver un bon étui pour la Rebase et j'entends combien c'est génial, mais d'après ce que vous écrivez, je ne pense pas que ce soit un bon ajustement ici. Merci!


Je suis un peu confus sur la raison pour laquelle vous voudriez faire ça? Ce n'est pas quelque chose que vous voudriez pousser, car il s'agit d'un revenir déguisé de D-E-F. Vous pourriez réellement y aller avec git revert d e f. Mais pourquoi? Si vous souhaitez conserver D E F pour référence, appuyez sur une branche distincte, puis la réinitialisation dure à C semble être une meilleure solution.



0
votes

Jugement de votre commentaire à mon autre réponse (que je ne supprime pas, car cette solution est plus correcte que cela, mais cela semble être ce que vous voulez), vous pouvez simplement utiliser la commande de plomberie commit-arbre code> comme suit:

git reset $( git commit-tree $tree -p F -m 'Revert D,E, and F' )


0 commentaires

0
votes

Pourriez-vous décrire ce que vous voulez comme suit: "Faites de votre arbre de travail identique à c, puis de commettre ça"? Si oui, voici un moyen de faire cela:

git checkout C -- .    # working tree same as C, without moving branch (NB ".")
git commit -a


0 commentaires

1
votes
git cherry-pick --strategy=recursive -X ours C
git-merge(1):
  The recursive strategy can take the following options:
  
  ours
  
  
    This option forces conflicting hunks to be auto-resolved cleanly by favoring our version. [...]
  
The "ours" and "theirs" refer to the two commits being merged. However, I'm not sure which way around git cherry-pick treats the commits, so you might need -X theirs instead. You could make a new branch, to try it and see.

0 commentaires

0
votes

On dirait que vous voulez que C soit l'état final de votre référentiel Git.

prenez "A-B-C-D-E-F-G" comme exemple,

Vous pouvez simplement revenir à g, f, e, d dans commande en utilisant

git revenir [comted]

Utilisez ensuite GIT COMMIT

Après que g, f, e, d sont tous retournés, votre référentiel restera dans l'état identique à c.

Une solution alternative pour la branche locale uniquement est:

git resert -hard tête ~ 4

Cela réinitialisera votre branche locale pour commettre C et déposer D, E, F, G.


0 commentaires

0
votes

J'ai réellement soumis My propre Question à ce sujet avant de trouver le vôtre, mais de toute façon - vous pouvez le faire à l'aide de hachage d'arbres.

L'idée est que chaque commit a un "objet d'arbre" associé à celui-ci qui décrit l'ensemble de l'arbre de travail, de sorte que tout ce que vous avez à faire est de créer un nouveau commit qui a le même objet d'arbre que l'ancien commit, et l'ajout. à la tête.

Voici un script qui le fait: xxx


0 commentaires