Squash à un seul “bon” s'engagent pour une pull request sur github.
J'ai un repo github qui quelqu'un d'autre (Bob, pour la clarté de l'exposé) a émis une demande d'extraction pour. Son code n'est pas parfait, donc nous passons par quelques tours de marquage. Comme je le comprends, il s'engage et pousse à son pull-demande pour chaque ensemble de modifications.
Donc mon référentiel ressemble maintenant à ceci:
master: ---o A (Chowlett
|
|
pull-req: o---o---o---o
B C D (all Bob)
Commettre SHAs et msgs sont comme suit:
Un:
123456 Good commit <chowlett>
B:
777ccc Fix the widget bug <bob>
C:
888ddd Review markups <bob>
D:
999eee Further markups <bob>
Je suis maintenant heureux d'accepter cette demande d'extraction; mais j'avais plutôt le pré-balisage versions n'étaient pas dans mon repo. Puis-je réaliser toutes les opérations suivantes; et comment?
- De fusion B, C & D sur mon repo comme un seul commit
- Générer de la "Fusion pull request #99 en ..." s'engager ainsi
- Ont github fermer automatiquement la demande de pull
- Demander à l'intervenant de rebase les modifications dans un seul commit et de fusion que l'on.
- n'est-ce pas aller à l'encontre de "ne pas rebase un commit qui a été poussé à distance" dicton?
- C'est une bonne règle de pouce, mais il n'est pas dangereux quand la distance n'a pas été fusionnées et personne d'autre ne l'utilise.
- Hmm, ok. Donc, Bob pourrait juste
rebase -i 123456
, squash, C et D, puispush -f
? Et github permettrait de mettre à jour ce qui était dans le pull request? - Oui, c'est exactement ce qui allait se passer. Parfois, les commentaires dans la demande d'extraction peut se foiré, particulièrement si vous avez fait des commentaires sur des lignes spécifiques dans le commit, mais sinon, ce sera très bien.
- Ou Bob pourraient pousser l'écrasé s'engage à une autre branche, ouvrez une nouvelle demande d'extraction et de fermer le premier.
- Ok, merci. Si vous ou Jérémie veux faire qu'une réponse, je vais joyeusement upvote, et d'accepter l'un d'eux.
- idem.
- Comment voulez-vous faire "Ou Bob pourraient pousser l'écrasé s'engage à une autre branche de la" exactement? J'ai ce problème aussi: je veux livrer un nettoyage d'une validation pull request, mais je ne veux pas perdre mon la direction du développement de l'histoire par l'écraser. Il me semble qu'à chaque amont référentiel propriétaire sur github demande contributeurs à la courge leur livraison, mais cela semble en arrière pour moi.
- Voir, par exemple, github.com/anaran/devtools-snippets/network où j'ai essayé de créer un seul s'engager dans
issue35take2
à l'aide degit checkout -B issue35take2 master && git merge --no-ff devtools_import_export
. Néanmoins, la demande d'extraction en amont/master contient chaque commit de devtools_import_export. - veuillez ouvrir une nouvelle question.
- J'ai essayé de répondre à la place.
Vous devez vous connecter pour publier un commentaire.
Noter que Bob n'a pas de squash sa s'engage quand il fait un GitHub PR.
Depuis le mois de Mars 2016, vous pouvez laisser le fonctionnement de la maintenance (vous) de l'acceptation de votre PR.
Voir "Squash vos commits" et son nouvelle documentation
Il y a deux 'squash' fonctions intégrées dans
git
. Il estgit merge --squash
et il y a lasquash
action dansgit rebase --interactive
. L'ancien ne conserve pas n'importe quel auteur ou la date de l'information, recueillir toutes les modifications d'une série de commits dans la copie de travail locale. Ce dernier est ennuyeux parce qu'il nécessite une interaction.La
git squash
extension fait ce que vous voulez. Il rebases l'actuel CHEF sur une base spécifiée tout en écrasant les engage entre les deux. Il fournit également une option de ligne de commande pour définir le message sur la finale écrasé s'engager dans les cas où cela n'est pas de créer des conflits.Lancer cette collaboration avec
hub
etghi
, vous pourriez être en mesure de construire un script le long de ces lignes:Vous pouvez utiliser l'option --squash option pour fusionner
Ce ne sera cependant pas de produire une fusion de commettre. Il va au lieu de produire un set normal de travail modifications apportées à l'arbre comme si vous appliqué manuellement tous ses changements sur votre copie. Il vous faudra alors s'engager comme normal.
L'inconvénient sera que votre histoire sur le master ne sera pas montrer ce commit de fusion à partir de sa succursale. Il suffit de regarder comme vous avez fait le travail vous-même et de ne pas donner à Bob de crédit.
À l'aide de git rebase
Une idée serait à la caisse de la succursale et de squash tous les commits dans un en utilisant le iteractive rebase, puis de la force de pousser à la mise à jour de la demande d'extraction et de fusion (si une partie de ce travail pourrait être confiée à Bob).
Automatiquement fusionner tous les commits de la branche dans l'autre, et de les appliquer à la demande d'extraction, vous pouvez utiliser les commandes suivantes:
GIT_SEQUENCE_EDITOR est un Git variable d'environnement pour définir un rédacteur temporaire pour le rebase commettre liste. Nous l'avons créé un script en ligne qui remplace le mot
pick
pars
(senssquash
) au début de toutes les lignes sauf la première (qui est la2,\$
dans lesed
modèle). La validation de la liste qui est transmis au script est un fichier texte simple. Git se poursuit ensuite avec le rebase et vous permet de modifier le dernier message de commit.Aussi, avec un git crochet vous pouvez ensuite plus ou moins facile de modifier ce dernier message pour répondre à vos besoins (dire ajouter un séparateur entre l'écrasé s'engage messages).
À l'aide de git merge --squash
L'écrasement est également possible par le biais de
git merge --squash
. Voir ici pour la différence entre les deux méthodes. Le script soufflet serait squash les commits de la branche en un seul valider à l'aide de la commande merge. Il a également crée une copie de sauvegarde de la direction générale (au cas où).Cela a fonctionné pour moi.
devtools_import_export
reste intact.issue35squashed
en amont/maître n'a qu'un commit.Voici ce que j'ai fait (voir https://github.com/anaran/devtools-snippets/network)
(Ma précédente tentative, à l'aide de
git merge --no-ff ...
est dansissue35take2
et un pull request pour il contient tous les commits dedevtools_import_export
. Rien de bon.)