web-dev-qa-db-fra.com

Envoyer une demande de tir sur GitHub pour seulement le dernier commit

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.

268
Kevin Hakanson

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.

289
Kevin Hakanson

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).

56
Lars Noschinski

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:

  • projet_orignal
  • forked_project (créé à partir du projet original à SHA: 9685770)
  • my_fork (créé à partir d'un projet forké à SHA: 207e29b)
  • un commit dans ma fourche (SHA: b67627b) que je voulais renvoyer au projet d'origine

Pour ce faire, je:

  1. créé une nouvelle branche à partir du SHA où le projet d'origine a été créé
  2. tiré tout du projet original
  3. cherry a choisi le commit que je voulais soumettre comme demande d'attraction
  4. poussé le tout jusqu'à github

Les commandes git étaient quelque chose comme:

  1. branche git ma-fonctionnalité-demande 9685770
  2. git checkout ma-fonctionnalité-demande
  3. git pull https://github.com/original_project/original_project.git
  4. cerise-pic git b67627b
  5. git Push Origin ma-fonctionnalité-demande

Ensuite, j'ai choisi my-feature-request comme branche pour ma demande d'extraction vers le projet d'origine.

26
John Naegle

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.

6
hi_tech_lowlife

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.

5
irbanana

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.

1
Johannes Jendersie

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!)

0
Nathan