Question

J'écris un script qui fait quelques changements insignifiants et les engage alors à git. Parce que ce sont des changements insignifiants, je veux faire git commit --amend chaque fois que je peux sortir avec elle - en particulier, lorsqu'une modification ne sera pas « gâcher » l'histoire toutes les autres branches. Si un serait gâcher amender une autre branche, je veux faire un git commit standard au lieu.

Par exemple, si mes branches ressemblait à ceci (à la "Visualize toute l'histoire de la branche" dans l'interface graphique Git):

* [experimental branch] Added feature.
* [master branch] Trivial change from script
* ...

et je suis en cours d'exécution de ce script sur la branche principale, alors je ne veux pas faire une modifier, parce que je remplacerai partie de l'histoire de la branche expérimentale. Techniquement, cela ne cassera pas quoi que ce soit - l'original commit encore faire partie de l'histoire expérimentale, et encore référencé donc il ne sera pas les déchets ramassés - mais ayant commits presque-mais-pas-tout à fait identiques dans deux branches différentes rend la vie difficile quand je veux plus tard rebasage ou une fusion, il est donc une situation que je veux éviter.

Comment puis-je détecter automatiquement si un commettras mon script a quelque chose ramifié de celui-ci?

Si des hypothèses simplificatrices aide, je lance toujours ce script sur la tête du maître, et je l'utilise seulement git comme dépôt local -. Je ne pousser ou tirer des changements partout

Ce script est en Ruby, donc je peux soit débourser à la ligne de commande git, ou je peux utiliser les liaisons Ruby pour git -. Selon rendrait cette tâche plus facile

Était-ce utile?

La solution

Il suffit de lancer git branch --contains HEAD pour obtenir une liste des branches qui « contiennent » ce commit. Si la liste est vide, qui commettent doivent être sans danger pour ammending. Vous pouvez également inclure le drapeau -a à la liste des branches locales et distantes.

Sinon, vous pouvez comparer la sortie de git rev-parse HEAD avec git merge-base HEAD other-branch. Si ceux-ci commettent ID sont identiques, le commit courant est dans son autre branche commettent l'histoire.

Autres conseils

Le commettras graphique est à sens unique: étant donné une livraison, vous savez tous ses ancêtres, mais aucun de ses enfants. Vous devez commencer les points d'extrémité et BackTrack jusqu'à ce que vous arriviez à la commettras (s) que vous voulez.

Utilisation git rev-list [some commit] --children (HEAD par défaut):

$ git rev-list HEAD --children
6edbee61c87fb063700751815f0ad53907d0b7a4
aee452860ecd772b8bdcd27227e6a72e6f4435fd 6edbee61c87fb063700751815f0ad53907d0b7a4
ef8a1487b03256a489d135e76d1f0b01872f2349 aee452860ecd772b8bdcd27227e6a72e6f4435fd
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349
bbef0da56efe048f70293bd20bad0cb37b5e84f0 6910dc5833f6cd26133e32bef40ed54cf9337017
[...]

La colonne de gauche est une liste de commettre SHA-1 dans l'ordre chronologique inverse. Tout ce que commettent ce sont les enfants (droit --children) de qui allouent. Le haut engagement est à la tête et a donc pas d'enfant.

Ainsi, si vous grep pour votre SHA-1 dans cette liste et il a quelque chose à son droit, il a au moins un enfant:

$ git rev-list --children | grep '^6910'
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349

Dans l'exemple ci-dessus, engager 6910... a un enfant, ef8a....

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top