J'ai lancé un projet sur github et je réussis à modifier mon maître local et à pousser sur Origin sur github. Je veux envoyer une demande d'extraction, mais je veux seulement inclure le dernier commit. L'interface utilisateur de demande d'extraction sur github.com affiche les 9 derniers commits et je ne sais pas comment filtrer cela par le bas.
J'essayais de comprendre si je devais créer une nouvelle branche locale, vérifier cela et en quelque sorte réinitialiser ou rebaser en amont? Puis appliquez mon dernier commit de mon maître par identifiant à la nouvelle branche locale et utilisez-le pour la demande d'extraction?
J'essaie de bien comprendre les concepts et de trouver les bonnes lignes de commande pour faire ce dont j'ai besoin.
Vous devez en principe créer une nouvelle branche & sélection de cerise les commits que vous souhaitez y ajouter.
Remarque: vous en aurez peut-être besoin avant les commandes checkout/cherry-pick
_
git remote add upstream <git repository>
__
git remote update
_
_git checkout -b <new-branch-name> upstream/master
git cherry-pick <SHA hash of commit>
git Push Origin <new-branch-name>
_
Ensuite, vous verrez <new-branch-name>
branche sur github, basculez sur celui-ci et pouvez soumettre la demande d'extraction avec les modifications souhaitées.
Créez une nouvelle branche à partir de la dernière validation, qui se trouve également dans le référentiel Origin:
git branch new-branch Origin/master
git checkout new-branch
Ensuite, utilisez git cherry-pick
pour obtenir le seul commit pour lequel vous voulez que la demande d'extraction soit extraite. Si la branche avec cette validation est appelée feature
et que la validation que vous souhaitez est la dernière validation de cette branche, ce sera
git cherry-pick feature
En supposant que ce correctif s'applique sans conflit, vous avez maintenant une branche pour laquelle vous pouvez faire votre demande de tirage.
Dans un deuxième temps, vous devez maintenant décider quoi faire avec votre branche feature
. Si vous n'avez pas encore publié vos modifications sur cette branche, la meilleure procédure consiste probablement à rebasculer cette branche lors de la création d'une nouvelle branche (et à supprimer le dernier commit, si cela n'est pas effectué automatiquement par git rebase
).
Je me suis retrouvé dans une situation où j'avais fourché une fourchette et que je voulais soumettre une demande de tirage au projet d'origine.
J'avais:
Pour ce faire, je:
Les commandes git étaient quelque chose comme:
Ensuite, j'ai choisi my-feature-request comme branche pour ma demande d'extraction vers le projet d'origine.
Cela a presque fonctionné pour moi:
git checkout -b upstream upstream/master
git cherry-pick <SHA hash of commit>
git Push Origin upstream
La seule différence était la suivante:
git Push Origin upstream:upstream
Je devais changer cette dernière ligne pour que git Push fasse la branche en amont de mon dépôt GitHub afin que je puisse en faire une PR.
J'avais déjà effectué le commit que je voulais pouvoir isoler en tant que demande d'extraction sur la branche actuelle.
Alors j'ai vérifié une nouvelle branche
git checkout -b isolated-pull
Et voici où ma solution diffère de celle de @Kevin Hakanson, car je dois réinitialiser cette branche à la place de l'historique que je souhaite différencier de
git reset --hard [sha-to-diff-by]
Et sélectionnez le commit à partir duquel je souhaite créer une demande d'extraction isolée
git cherry-pick [my-isolated-commit-sha]
Enfin, poussez-le vers la télécommande
git Push Origin isolated-pull
Et tirez la demande dat shi.
La solution permettant de créer une nouvelle branche (temporaire), de sélectionner et de créer la demande d'extraction pour cette branche ne m'a pas satisfait. Je ne souhaitais pas modifier mon référentiel afin de mettre à disposition un ensemble de commits. J'ai donc proposé l'alternative suivante:
Commencez par créer des fichiers de correctifs pour tous les commits d’intérêt:
git format-patch -1 <sha>
Si le commit d'intérêt s'avère être le dernier, vous pouvez utiliser HEAD
à la place de <sha>
.
Maintenant, vous pouvez envoyer les correctifs au responsable du référentiel source, qui peut les appliquer:
git branch new-branch <master or some older commit where the fork diverged>
git checkout new-branch
git am < <the patch>
...
git checkout master
git merge new-branch
Enfin, cela devrait ressembler à une fusion d'une branche temporaire par une demande d'extraction, mais sans cette branche supplémentaire dans le référentiel fork.
Basé sur la réponse de @ kevin-hakanson, j'ai écrit ce petit script bash pour faciliter ce processus. Il ajoutera le dépôt amont s'il n'existe pas déjà (en vous invitant à indiquer l'URL), puis vous invite à indiquer le nom de la nouvelle branche à créer et la balise/SHA du commit à sélectionner. cette branche. Il vérifie la branche ou la validation sur laquelle vous vous trouvez, puis cache toutes les modifications afin que vous puissiez extraire la nouvelle branche. La stratégie de fusion conserve les modifications du commit sélectionné. Après avoir poussé la nouvelle branche vers Origin
(supposée être le nom de votre référentiel distant), la branche ou le commit sur lequel vous étiez auparavant est extraite à nouveau et vos modifications précédentes sont extraites de la réserve.
if ! git remote | grep -q upstream; then
read -p "Upstream git repo URL: " upstream
git remote add upstream $upstream
git remote update
fi
read -p "Feature branch name: " feature_branch
# note: giving "master" is the same as giving the SHA it points to
read -p "SHA of commit to put on branch: " sha
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" == "HEAD" ]; then
# detached HEAD; just get the commit SHA
current_branch=$(git rev-parse --short HEAD)
fi
git stash
git checkout -b $feature_branch upstream/master
git cherry-pick --strategy=recursive -X theirs $sha
git Push Origin $feature_branch
git checkout $current_branch
git stash pop
(Cela a fonctionné pour moi dans quelques tests simples, mais je ne suis ni un programmeur ni un expert en git, alors laissez-moi savoir s'il y a des cas que j'ai manqués qui pourraient être automatisés mieux!)