web-dev-qa-db-fra.com

Liste les validations entre 2 hachages de validation dans git

Je sais qu'il y a eu des questions très similaires ici, mais elles n'ont pas résolu mon problème. Il y a peut-être quelque chose que je ne comprends pas bien.

Ceci est une partie de l'historique des validations de fitnesse ( https://github.com/unclebob/fitnesse/ ):

* | | | | | | | | | | | | | | | fa86be8 Avoid possible issue when using CachingPage under heavy memory load.
|/ / / / / / / / / / / / / / /  
* | | | | | | | | | | | | | |   7b4a07a Merge pull request #256 from barredijkstra/fitnesse_issue_250
|\ \ \ \ \ \ \ \ \ \ \ \ \ \ \  
| * | | | | | | | | | | | | | | ecf5891 Fixed test checking for OS specific exception message.
| * | | | | | | | | | | | | | | 082236e Added rendering of cause exceptions. Fix for unclebob/fitnesse#250
* | | | | | | | | | | | | | | |   a92b37f Merge pull request #243 from amolenaar/fix/243-hash-table-rendering

Je veux la liste des validations entre 2 hachages de validation. Dans ce cas particulier, je veux que les commits entre ecf5891 et 7b4a07a, et je m'attends à ce que le résultat soit:

ecf5891
7b4a07a

Si j'utilise git rev-list commit_hash_from_here^..commit_hash_up_to_here et cela a bien fonctionné avec l'histoire linéaire. Cependant, dans ce cas, je reçois beaucoup plus de commits.

J'ai essayé cela et cela fonctionne comme prévu:

git log --since='<date ecf5891>' --until='<date 7b4a07a>'

(J'ai recherché manuellement ces 2 dates).

Une solution possible est d'obtenir les 2 dates et de le faire, mais je pense qu'il devrait y avoir une meilleure façon.

Modifier: 7b4a07a les parents sont ecf5891 et a92b37f. Jusqu'à présent, les solutions fonctionnent bien si je veux passer de ecf5891 à 7b4a07a, mais si je veux passer de a92b37f à 7b4a07a Je veux obtenir:

7b4a07a
ecf5891
082236e
a92b37f

mais je ne reçois pas a92b37f

48
Nico

"Entre" est une notion quelque peu glissante, quand il s'agit de git commits.

Le texte que vous montrez ci-dessus, avec un extrait de sortie graphique, montre pourquoi from^..to produit plus que ces deux validations: la partie to est une validation de fusion.

La notation A..B est vraiment un raccourci pour B ^A. Autrement dit, "tout en commençant par B et en arrière, moins tout en commençant par A et travailler en arrière ". Mais B est un commit de fusion, donc "tout ce qui commence là et fonctionne à l'envers" utilise les deux parents .

Voici le premier parent de 7b4a07a est a92b37f (pas dans votre extrait [original] ci-dessus, mais j'ai cloné le dépôt lié et je l'ai trouvé). Nous pouvons cependant nous y référer symboliquement, et je le ferai ci-dessous. Le deuxième parent de 7b4a07a est ecf5891, la partie "de" qui vous intéresse.

Lorsque vous demandez:

ecf5891^..7b4a07a

cela signifie:

7b4a07a ^ecf5891^

ce qui équivaut à:

7b4a07a ^082236e

ce qui vous permet d'être tous les deux parents de la fusion, puis de tout supprimer de 082236e retour. Vous devez tout couper de 7b4a07a^— le premier parent — et de retour également:

git rev-list 7b4a07a ^ecf5891^ ^7b4a07a^
git log --oneline 7b4a07a ^ecf5891^ ^7b4a07a^

En général, cependant, vous devez déterminer la ou les lignes descendantes à couper.

Edit: vous pouvez vous en tenir au A..B notation, mais vous devez ajouter le supplément "exclude". Donc réponse de jthill fonctionne aussi, une fois que vous avez déplacé le chapeau vers l'avant.


Re votre édition ("si je veux passer de a92b37f à 7b4a07a "): nous revenons à cette question de" entre "étant une notion glissante. Quels commits sont" entre "? Il y a une ligne directe de a92b37f à 7b4a07a, car a92b37f est l'un des deux parents du commit de fusion 7b4a07a. Donc, selon la logique antérieure ("s'engage directement sur une ligne ancestrale", peut-être "inclusive"), ce ne serait qu'un, ou peut-être les deux, de ces deux engagements. Mais vous dites que vous voulez deux commits qui ne sont en aucun cas liés à a92b37f du tout. Pourquoi voulez-vous ces deux commits particuliers? Ce qui rend 082236e "intéressant" et 082236e^, son parent, "inintéressant"?

28
torek

Je pense que vous cherchez - ancestry-path , dans votre cas:

git rev-list --ancestry-path 7b4a07a..ecf5891
26
aquavitae

Identifiez d'abord les 2 hachages de validation dont vous avez besoin pour obtenir la liste des hachages de validation entre eux en utilisant

git log --oneline

Ensuite, vous pouvez choisir les deux hachages de validation pertinents et trouver les hachages de validation entre eux en utilisant

git log <commit hash 1> <commit hash 2> --oneline | cut -d " " -f 1
4

Ajoutez ^ 7b4a07a ~ pour exclure également tout ce qui est accessible du premier parent de la fusion. Vous excluez uniquement ce qui est accessible à partir de son deuxième parent.

3
jthill