J'ai fait pas mal de travail ("Votre branche est en avance sur 'origine / master' par 37 commits.") Qui aurait vraiment dû aller dans sa propre branche plutôt que dans master
. Ces commits n'existent que sur ma machine locale et n'ont pas été poussés vers origin
, mais la situation est quelque peu compliquée dans la mesure où d'autres développeurs ont poussé origin/master
et j'ai retiré ces changements.
Comment déplacer rétroactivement mes 37 commits locaux dans une nouvelle succursale? Sur la base des documents, il semble que cela devrait git rebase --onto my-new-branch master
ou ...origin/master
devrait le faire, mais les deux me donnent simplement l'erreur "fatal: besoin d'une seule révision". man git-rebase
ne dit rien sur la fourniture d'une révision rebase
et ses exemples ne le font pas, donc je ne sais pas comment résoudre cette erreur.
(Notez qu'il ne s'agit pas d' un doublon de Déplacer un travail existant non engagé vers une nouvelle branche dans Git ou Comment fusionner mes modifications locales non validées dans une autre branche Git? Car ces questions concernent les modifications non validées dans l'arborescence de travail locale, pas les modifications qui ont été engagé localement.)
Réponses:
Cela ne devrait pas poser de problème, car vous n'avez encore poussé vos validations nulle part ailleurs et vous êtes libre de réécrire l'historique de votre branche par la suite
origin/master
. Je voudrais d'abord exécuter ungit fetch origin
pour m'assurer queorigin/master
c'est à jour. En supposant que vous êtes actuellement connectémaster
, vous devriez pouvoir:... qui rejouera toutes vos validations qui ne sont pas
origin/master
enregistréesorigin/master
. L'action par défaut de rebase est d'ignorer les validations de fusion (par exemple celles que vous avezgit pull
probablement introduites) et il essaiera simplement d'appliquer le patch introduit par chacune de vos validationsorigin/master
. (Vous devrez peut-être résoudre certains conflits en cours de route.) Ensuite, vous pouvez créer votre nouvelle branche en fonction du résultat:... puis réinitialisez votre
master
dos àorigin/master
:Quand vous faites ce genre de manipulation avec des branches
git branch
,git reset
etc. Je trouve utile de regarder souvent au commettras graphique avecgitk --all
ou un outil similaire, juste pour vérifier que je comprends tous les différents refs pointent.Alternativement, vous pourriez avoir simplement créé une branche de sujet en fonction de l'endroit où se trouve votre maître en premier lieu (
git branch new-work-including-merges
), puis réinitialisermaster
comme ci-dessus. Cependant, étant donné que votre branche de sujet inclura des fusions deorigin/master
et que vous n'avez pas encore poussé vos modifications, je vous suggère de faire un rebase afin que l'historique soit plus ordonné. (De plus, lorsque vous fusionnerez éventuellement votre branche de sujet en maître, les changements seront plus évidents.)la source
master
; le rebase réécrit lamaster
branche de sorte que les nouveaux validations soient linéairement au-dessus deorigin/master
, puisgit branch new-work
crée unenew-work
branche pointant à la pointe demaster
(la branche actuelle) sans basculer la branche actuelle versnew-work
.new-work
Contient donc maintenant tous les nouveaux commits. Ensuite, la réinitialisationmaster
ramène (encore ) la branche actuelle àorigin/master
.git reset
différentes manières. Legit branch new-work
dit simplement "créer une branche pointant sur ce commit pendant que je reste sur ma branche actuelle (qui est master dans ce cas)". Il n'est donc pas nécessaire d'avoir une commande qui déplace les validations de master vers la nouvelle branche - vous créez simplement une nouvelle branche là-bas et lorsque vous réinitialisez master, la nouvelle branche reste là où se trouvait masterSi vous avez un faible nombre de commits et que vous ne vous souciez pas de les combiner en un méga-commit, cela fonctionne bien et n'est pas aussi effrayant que de le faire
git rebase
:désinstaller les fichiers (remplacez 1 par # de commits)
créer une nouvelle branche
ajouter les modifications
faire un commit
la source
git log --all --decorate --oneline --graph
.Je suis resté avec le même problème. J'ai trouvé la solution la plus simple que j'aime partager.
1) Créez une nouvelle branche avec vos modifications.
2) (Facultatif) Poussez le nouveau code de branche sur le serveur distant.
3) Revenez à la succursale principale.
4) Réinitialisez le code de branche maître avec le serveur distant et supprimez la validation locale.
la source
Une autre façon de supposer que branch1 - est une branche avec des changements validés branch2 - est une branche souhaitable
sélectionnez les ID de validation que vous devez déplacer
Maintenant, annulez les validations non poussées de la branche initiale
la source
Alternativement, juste après vous être engagé dans la mauvaise branche, procédez comme suit:
git log
git diff {previous to last commit} {latest commit} > your_changes.patch
git reset --hard origin/{your current branch}
git checkout -b {new branch}
git apply your_changes.patch
Je peux imaginer qu'il existe une approche plus simple pour les étapes un et deux.
la source
Qu'en est-il de:
git reset
revenir au dernier commit avant de commencer à apporter des modifications.git pull
pour ré-extraire uniquement les modifications à distance que vous avez supprimées avec la réinitialisation.Ou cela explosera-t-il lorsque vous tenterez de refusionner la branche?
la source
Voici une manière beaucoup plus simple:
Créer une nouvelle branche
Sur votre nouvelle branche, faites un
git merge master
- cela fusionnera vos modifications validées (non poussées) dans votre nouvelle brancheSupprimez votre branche principale locale
git branch -D master
Utilisez-D
plutôt que-d
parce que vous souhaitez forcer la suppression de la branche.git fetch
Faites juste un sur votre branche principale et faites ungit pull
sur votre branche principale pour vous assurer d'avoir le dernier code de vos équipes.la source
Une approche plus simple, que j'ai utilisée (en supposant que vous vouliez déplacer 4 commits):
(Regardez dans le répertoire à partir duquel vous avez exécuté la dernière commande pour les 4
.patch
fichiers)Alors:
Dans l'ordre que vous vouliez.
la source
Commander une nouvelle copie de vos sources
git clone ........
Créer une succursale à partir de la position souhaitée
git checkout {position}
git checkout -b {branch-name}
Ajouter un référentiel distant
git remote add shared ../{original sources location}.git
Obtenez des sources distantes
git fetch shared
Commander la branche souhaitée
git checkout {branch-name}
Fusionner les sources
git merge shared/{original branch from shared repository}
la source
Pour moi, c'était la meilleure façon:
git fetch
git branch my-changes
et pousser vers la télécommandegit master -u upstream-branch remotes/origin/my-changes
git branch master --set-upstream-to remotes/origin/master
la source