46 votes

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)

S'engager 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?

  • Fusion B, C & D dans mon repo comme un seul commit
  • Générer la "Fusion pull request #99 en ..." s'engager ainsi
  • Ont github fermer automatiquement le pull request

10voto

joeln Points 657

Il y a deux 'squash' fonctions intégrées dans git. Il est git merge --squash et il y a l' squash action git 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.

L' 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 et ghi, vous pourriez être en mesure de construire un script le long de ces lignes:

git pull upstream master
hub checkout https://github.com/$user/$repo/pull/$issue
git squash master
rev=$(git rev-parse --short HEAD)
git checkout master
git merge $rev
git commit --amend "Merged pull request #$issue"
git push upstream master
ghi close $issue $user/$repo
ghi comment $issue "Merged as $rev" $user/$repo 

9voto

D-Rock Points 1247

Vous pouvez utiliser l'option --squash option de fusion

git merge <remote url> <remote branch> --squash

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 d'habitude.

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.

1voto

stackunderflow Points 487

Cela a fonctionné pour moi.

  • Mon travail sur devtools_import_export reste intact.
  • Mon pull request pour issue35squashed d'amont/maître n'a qu'un commit.
  • Hélas, la fusion n'est pas enregistré, mais le message de commit a tous les détails.

Voici ce que j'ai fait (voir https://github.com/anaran/devtools-snippets/network)

git checkout master
git status # all clean
git checkout -B issue35squashed master
git merge --squash devtools_import_export
git status # looks good
git commit # review and commit via emacs
git log --graph --abbrev-commit --stat --pretty --decorate=full --branches
git push --all -v

(Ma précédente tentative, à l'aide de git merge --no-ff ... est issue35take2 et un pull request pour il contient tous les commits devtools_import_export. Rien de bon.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X