web-dev-qa-db-fra.com

Comment déplacer les commits de git du maître vers une autre branche existante

J'ai vérifié quelques commits dans master qui auraient dû être archivés dans develop. Quelles commandes git ai-je utilisées pour supprimer ces commits de la branche master et les inclure dans la branche develop?

22
gitq

Si je ne me trompe pas, vous aviez deux branches synchronisées, master et dev, et vous avez simplement oublié de changer de branche, Avant vos commits.

Si tel est le cas, nous avons:

----------------
git log in dev

xxx
yyy
...
----------------

et:

----------------
git log in master

ccc
bbb
aaa
        <---- here you forgot to switch branch
xxx
yyy
...
----------------

La solution est:

Tout d'abord, assurez-vous que:

git status -s

renvoie des résultats vides.

Ensuite, obtenez tous vos nouveaux commits de master à dev avec:

git checkout dev
git merge master

Maintenant, revenez à vous master:

git checkout master

Supprimer les commits inutiles:

git reset --hard HEAD~3

Le nombre ~3 est le nombre de commits que vous souhaitez supprimer.

N'oubliez pas que git status -s doit renvoyer des résultats vides ..__ sinon, git reset --hard peut entraîner une perte de données.

37

Pour faire face à une autre branche, vous pouvez utiliser la sélection de cerises:

git cherry-pick <commit>

Supprimer n'est pas si facile. Vous pouvez utiliser rebase et squash ou éditer le commit:

git rebase -i <commit>~1

Mais je ne suis pas sûr de pouvoir modifier lors de la réédition si vous pouvez également modifier les fichiers plutôt que le message de validation.

7
Jens Peters

Vous pouvez cherry-pick vos commits sur la develop et ensuite interactivement rebase votre branche master:

  1. git checkout develop
  2. git cherry-pick aabbcc
  3. git cherry-pick ddeeff
  4. ....
  5. git checkout master
  6. git rebase 123456 -i

123456 est un commit avant de commettre une erreur. Cela ouvrira un éditeur qui montrera chaque commit qui sera affecté par la base. Supprimez les lignes correspondant aux commits que vous souhaitez supprimer et quittez l'éditeur.

6
Nils Werner

Il y a généralement plusieurs façons de faire la même chose d'une manière possible:

git checkout develop
git cherry-pick XXX // XXX being the sha1 of the commit you want to grab
git checkout master
git rebase --interactive HEAD~IDX // IDX being the position of the last "good" commit compared to HEAD

La dernière commande affiche toutes les critiques de HEAD jusqu'au dernier bon commit et tout ce que vous avez à faire est de supprimer la ligne du commit dans le développement de la branche

0
bvidal