J'ai récemment bifurqué d'un projet et appliqué plusieurs corrections. J'ai ensuite créé une demande de pull qui a été acceptée.
Quelques jours plus tard, une autre modification a été apportée par un autre contributeur. Ma fourche ne contient donc pas cette modification.
Comment puis-je introduire cette modification dans mon fork ? Dois-je supprimer et recréer mon fork lorsque j'ai d'autres modifications à apporter ? Ou existe-t-il un bouton de mise à jour ?
Dans votre clone local de votre dépôt bifurqué, vous pouvez ajouter le dépôt GitHub d'origine comme "remote". ("Remotes" sont comme des surnoms pour les URL des dépôts - origin
en est un, par exemple). Ensuite, vous pouvez récupérer toutes les branches de ce dépôt amont, et rebaser votre travail pour continuer à travailler sur la version amont. En termes de commandes, cela pourrait ressembler à ceci :
# Add the remote, call it "upstream":
git remote add upstream https://github.com/whoever/whatever.git
# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:
git fetch upstream
# Make sure that you're on your master branch:
git checkout master
# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:
git rebase upstream/master
Si vous ne voulez pas réécrire l'histoire de votre branche master, (par exemple parce que d'autres personnes peuvent l'avoir clonée) alors vous devriez remplacer la dernière commande par git merge upstream/master
. Cependant, pour faire de nouvelles demandes de pull aussi propres que possible, il est probablement préférable de rebaser.
Si vous avez rebasé votre branche sur upstream/master
, vous pouvez avoir besoin de forcer le push afin de le pousser dans votre propre dépôt sur GitHub. Vous ferez cela avec :
git push -f origin master
Vous n'avez besoin d'utiliser le -f
que la première fois après que vous ayez rebasé.
Depuis mai 2014, il est possible de mettre à jour un fork directement depuis GitHub. Cela fonctionne toujours à partir de septembre 2017, Mais cela conduira à un historique de commit sale.
Mise à jour de l'original
).Maintenant vous avez trois options, mais chacune d'entre elles mènera à un historique de commit moins propre.
Cette branche est X commits en avant, Y commits derrière <fourche originale>
.Donc oui, vous pouvez maintenir votre repo à jour avec son amont en utilisant l'interface web de GitHub, mais en faisant cela, vous souillez votre historique de commit. Utilisez plutôt [la ligne de commande] (https://stackoverflow.com/questions/7244321/how-do-i-update-a-github-forked-repository/7244456#7244456) - c'est facile.
Voici le document officiel de GitHub sur la [synchronisation d'un fork][1] :
Synchronisation d'une fourche
La configuration
Avant de pouvoir effectuer une synchronisation, vous devez ajouter un répertoire distant qui pointe vers le dépôt amont. Vous l'avez peut-être fait lors de votre bifurcation initiale.
Conseil : la synchronisation de votre bifurcation ne met à jour que votre copie locale du dépôt ; elle ne met pas à jour votre dépôt sur GitHub.
$ git remote -v
Lister les télécommandes actuelles
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)
$ git remote add upstream https://github.com/otheruser/repo.git
Créer une nouvelle télécommande
$ git remote -v
Vérifier la nouvelle télécommande
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)
upstream https://github.com/otheruser/repo.git (fetch)
upstream https://github.com/otheruser/repo.git (push)
Synchronisation
Il y a deux étapes nécessaires pour synchroniser votre dépôt avec le dépôt amont : vous devez d'abord récupérer le dépôt distant, puis vous devez fusionner la branche désirée dans votre branche locale.
Fetching
L'extraction du dépôt distant apportera ses branches et leurs commits respectifs. Ceux-ci sont stockés dans votre dépôt local sous des branches spéciales.
$ git fetch upstream
Récupérer les branches du dépôt distant en amont
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
* [new branch] master -> upstream/master
Nous avons maintenant la branche master de upstream stockée dans une branche locale, upstream/master.
$ git branch -va
Lister toutes les branches locales et de suivi à distance
* master a422352 My local commit
remotes/origin/HEAD -> origin/master
remotes/origin/master a422352 My local commit
remotes/upstream/master 5fdff0f Some upstream commit
Fusion
Maintenant que nous avons récupéré le dépôt amont, nous voulons fusionner ses changements dans notre branche locale. Cela permettra de synchroniser cette branche avec le dépôt amont, sans perdre nos modifications locales.
$ git checkout master
Vérifier notre branche locale master
Switched to branch 'master'
$ git merge upstream/master
Fusionner le master d'upstream dans le nôtre.
Updating a422352..5fdff0f
Fast-forward
README | 9 -------
README.md | 7 ++++++
2 files changed, 7 insertions(+), 9 deletions(-)
delete mode 100644 README
create mode 100644 README.md
Si votre branche locale n'a pas eu de commits uniques, git effectuera à la place un "fast-forward" :
$ git merge upstream/master Mise à jour 34e91da..16c56ad Avance rapide README.md | 5 +++-- 1 fichier modifié, 3 insertions(+), 2 suppressions(-)
Tip : Si vous voulez mettre à jour votre dépôt sur GitHub, suivez les instructions [ici][2].
[1] : https://help.github.com/articles/syncing-a-fork [2] : https://help.github.com/articles/pushing-to-a-remote#pushing-a-branch