9 votes

Git : Pousser vers une autre branche distante

Problème :

Il faut pousser les changements de la branche git locale vers une autre branche du dépôt git distant et ces changements poussés vers la branche seront comparés avec le master existant dans l'URL distant et les changements seront fusionnés.

Les étapes

J'ai suivi jusqu'à présent la procédure de création d'un dépôt git local,

Initialisation d'un repo git local simple à l'aide des commandes suivantes,

 git init

Ajouter les fichiers existants au repo et les ajouter à la zone de staging en utilisant la commande ci-dessous,

MacBook-Pro: $ git add *.h
MacBook-Pro: $ git add *.m

J'ai vérifié l'état à l'aide de la commande suivante,

MacBook-Pro: $ git status

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   test.h
#   new file:   test.m
#

Les a engagés,

git commit -m"Added test base files"

Nous avons créé une nouvelle branche nommée issue_fix,

   MacBook-Pro:$ git branch issue_fix

Commencer à travailler sur la branche en vérifiant la branche.

MacBook-Pro: $ git checkout issue_fix

Quelques modifications ont été apportées à la branche. Tout allait bien jusqu'à présent.

Je me trouve maintenant dans une situation où je dois transférer les modifications que j'ai apportées à ma branche "issue_fix" vers un référentiel distant, comme suit

    https://github.com/myaccountname/project.git

Mes modifications seront poussées vers la branche qui m'a été indiquée ou, si la branche n'est pas disponible, je dois créer une branche distante et y pousser mes modifications dans la branche locale.

Plus important encore, les changements poussés seront comparés avec le master dans l'URL du dépôt donné et si tout va bien, ils seront fusionnés avec le master. Je pousserai donc toujours mes modifications de la branche locale vers la branche distante uniquement.

Le problème est survenu parce que l'URL de clonage n'a pas été fournie lorsque j'ai commencé, seule la source a été fournie. J'ai donc créé un dépôt git local et j'ai commencé à travailler dessus, maintenant l'URL du dépôt a été fournie et on m'a demandé de pousser mes changements vers une branche.

J'aimerais savoir si c'est possible dans le premier cas et, si oui, quelles sont les commandes que je dois donner pour que cela fonctionne.

5voto

CharlesB Points 27070

Git est distribué et fonctionne localement pour la plupart de ses opérations ; il n'est pas important que le fichier distant existe lorsque vous faites vos branches ou vos commits localement. Il faut juste qu'il existe lorsque vous effectuez le push.

Vous pouvez donc ajouter le dépôt distant, puis y pousser votre branche. La branche sera créée à distance si elle n'existe pas.

git remote add github-repo https://github.com/myaccountname/project.git
git push github-repo issue_fix

4voto

Nils Werner Points 3392

Pour résoudre ce problème (j'ai déjà eu ce genre de problème par le passé, c'est très ennuyeux), vous pouvez essayer de faire ce qui suit :

Votre situation

Le dépôt principal

A-B-C-D-E-F-G-H

Votre dépôt

            A'-B'-C'-D'

Lorsque le code dans G est égal au code de votre A' mais ils n'ont pas la même histoire

Cloner le référentiel dans lequel vous souhaitez apporter des modifications

git clone https://....

Vous disposerez ainsi d'une copie de travail de la base de code et, surtout, de son historique.

Le clone du dépôt principal

A-B-C-D-E-F-G-H

dans un dossier différent de celui de votre repo

            A'-B'-C'-D'

Récupérez votre branche de fonctionnalités dans votre dépôt en désordre.

git fetch ../messed-up-repo

../messed-up-repo est le chemin d'accès à votre deuxième dépôt.

Cela permet de récupérer tous les changements de l'autre repo, sans les fusionner. La raison en est que votre branche ne trouvera pas d'ancêtre commun avec la branche master, il sera donc difficile, voire impossible, de les fusionner.

Le référentiel principal se présente désormais comme suit :

 A-B-C-D-E-F-G-H                       # master
/
\
 ------------A'-B'-C'-D'               # messy

Créer une nouvelle branche

git branch new-featurebranch aabbccdd

aabbccdd est l'ID du commit au moment où vous avez téléchargé le référentiel. Cela créera une nouvelle branche au niveau du commit que vous avez téléchargé à l'époque. Plus vous pouvez deviner cette valeur, moins vous aurez de conflits par la suite. mieux vous devinerez cette valeur, moins vous aurez de conflits par la suite.

                -                        # new branch
              /
 A-B-C-D-E-F-G-H                         # master
/
\
 ------------A'-B'-C'-D'                 # messy

Rebasez interactivement votre branche sur celle-ci

git checkout messy-featurebranch
git rebase -i new-featurebranch

Ceci affichera un éditeur avec une liste de tous les commits de votre branche. Le premier sera probablement le commit "J'ai téléchargé une copie du code, mais je ne l'ai pas cloné correctement". SUPPRIMER CETTE LIGNE . Toutes les autres modifications devraient alors s'appliquer de manière transparente.

               -B'-C'-D'                 # new branch
              /
 A-B-C-D-E-F-G-H                         # master
/
\
 ------------A'                          # messy

0voto

Asenar Points 2096

Comme il semble qu'il s'agisse d'une édition très limitée, je suggérerai de cloner le repo principal (dans un nouveau répertoire), puis d'écraser leurs fichiers avec les vôtres et de faire un nouveau commit.

Sinon, il n'y a pas de "méthode simple" pour le faire, mais peut-être quelques conseils :

  1. cloner dans un nouveau répertoire le repo principal https://github.com/myaccountname/project.git
  2. ajoutez votre ancienne copie de travail en tant que copie distante : git remote add old /path/to/old/repo/
  3. git fetch` importera toutes vos modifications

Il existe maintenant plusieurs options, selon ce qui vous convient le mieux : git cherry-pick <1st sha1 you want>..<last commit (probably old/issue_fix)> semble correspondre à vos besoins, mais si ce n'est pas le cas, vous pouvez essayer une autre solution. git rebase --interactive Nils, mais vous pouvez avoir des problèmes si le premier commit que vous avez fait n'était pas un commit vide.

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