Je suis nouveau sur Git, alors n'hésitez pas à me traiter comme un débutant.
Notre flux de travail est tel. Nous avons une succursale appelée à dev
laquelle je peux accéder origin/dev
. Lorsque nous apportons des modifications, nous créons une branche de développement:
git checkout -b FixForBug origin / dev
Maintenant, j'ai une branche appelée FixForBug
qui suit (je pense que c'est le bon mot) origin/dev
. Ainsi, si je fais un, git pull
cela apportera de nouveaux changements, origin/dev
ce qui est formidable. Maintenant, quand j'ai fini avec mon correctif, je pousse vers une branche distante appelée la même chose.
Tout d'abord, je tire vers le bas toutes les modifications origin/dev
et je fais un rebase:
git pull --rebase
Ensuite, je pousse les modifications vers une branche distante du même nom:
git push origin FixForBug
Maintenant, il y a une branche sur le serveur distant et je peux créer une demande d'extraction pour que ce changement soit approuvé et fusionné dans la branche de développement. Je ne me pousse jamais rien origin/dev
. Je suppose que c'est un flux de travail assez courant.
La première fois que je fais un git push
, cela fonctionne bien et crée la branche distante. Cependant, si je pousse une deuxième fois (disons lors de la révision du code, quelqu'un signale un problème), j'obtiens l'erreur suivante:
erreur: échec de l'envoi de certaines références vers ' https://github.limeade.info/Limeade/product.git ' indice: les mises à jour ont été rejetées car la pointe de votre branche actuelle est derrière indice: son homologue distant. Intégrez les modifications distantes (par exemple indice: 'git pull ...') avant de pousser à nouveau. astuce: Voir la 'Remarque sur les avancées rapides' dans 'git push --help' pour plus de détails.
Cependant, si je fais un, git status
cela dit que je suis en avance de origin/dev
1 commit (ce qui a du sens) et si je suis l'indice et que je cours git pull
, cela dit que tout est à jour. Je pense que c'est parce que je pousse vers une branche différente de ma branche en amont. Je peux résoudre ce problème en exécutant:
git push -f origin FixForBug
Dans ce cas, il transmettra les modifications à la branche distante, en disant (mise à jour forcée) et tout semble aller bien sur la branche distante.
Mes questions:
Pourquoi est -f
requis dans ce scénario? Habituellement, lorsque vous forcez quelque chose, c'est parce que vous avez fait quelque chose de mal ou du moins contre la pratique courante. Est-ce que je vais bien faire cela, ou est-ce que cela va gâcher quelque chose dans la branche distante ou créer des tracas pour quiconque doit éventuellement fusionner mes éléments dans le développement?
git pull origin FixForBug
avant de pousser vers ça? Ok, ça a du sens. N'hésitez pas à ajouter comme réponse!Réponses:
Le
-f
est en fait requis en raison du rebase. Chaque fois que vous effectuez un rebase, vous devez effectuer une poussée forcée car la branche distante ne peut pas être avancée rapidement vers votre validation. Vous voudrez toujours vous assurer que vous faites un pull avant de pousser, mais si vous n'aimez pas forcer push to master ou dev d'ailleurs, vous pouvez créer une nouvelle branche vers laquelle pousser, puis fusionner ou faire un PR .la source
Pour vous assurer que votre branche locale FixForBug n'est pas en avance sur la branche distante FixForBug, tirez et fusionnez les modifications avant de pousser.
la source
Si vous voulez éviter d'avoir à utiliser
-f
, vous pouvez utiliser simplementau lieu de
Le non-rebase récupérera les modifications
origin/dev
et les fusionnera dans votreFixForBug
branche. Ensuite, vous pourrez exécutersans utiliser
-f
.la source
-f
parce que vous remplacez les commit (s) sur le référentiel en amont par d'autres qui ont un historique différent (rebasé). Si vous deviez utiliser un produit tel que Gerrit, il prend en charge ce type de flux de travail de révision de code de rebasage sans avoir à l'utiliser-f
lors du push. Nous utilisons Gerrit au travail de cette manière et cela fonctionne très bien.the tip of your current branch is behind its remote counterpart
signifie qu'il y a eu des changements sur la branche distante que vous n'avez pas localement. et git vous dit d'importer de nouvelles modificationsREMOTE
et de les fusionner avec votre code, puispush
vers remote.Vous pouvez utiliser cette commande pour forcer les modifications au serveur avec local repo ().
avec une
-f
balise, vous remplacerezRemote Brach code
par votre code.la source
La commande que j'ai utilisée avec Azure DevOps lorsque j'ai rencontré le message «les mises à jour ont été rejetées car la pointe de votre branche actuelle est derrière» était / est cette commande:
git pull origin master
(ou peut commencer avec un nouveau dossier et faire un clonage).
Cette réponse ne répond pas à la question posée, en particulier, Keif a répondu à cela ci-dessus, mais elle répond au titre / titre de la question et ce sera une question courante pour les utilisateurs d'Azure DevOps.
J'ai noté le commentaire: "Vous voudriez toujours vous assurer que vous faites une traction avant de pousser" en réponse de Keif ci-dessus!
J'ai également utilisé l'outil Git Gui en plus de l'outil de ligne de commande Git.
(Je ne savais pas comment faire l'équivalent de la commande en ligne de commande "git pull origin master" dans Git Gui, donc je suis de retour en ligne de commande pour faire cela).
Un diagramme qui montre diverses commandes git pour diverses actions que vous pourriez vouloir entreprendre est celui-ci:
la source
Cela m'est juste arrivé.
Solution: déroulez ma propre branche pour obtenir ce commit supplémentaire. Puis repoussez- le dans ma branche distante.
littéralement ce que j'ai fait sur ma branche était:
la source
C'est ainsi que j'ai résolu mon problème
Supposons que la branche amont est celle à partir de laquelle vous avez bifurqué et que l'origine est votre dépôt et que vous souhaitez envoyer un MR / PR à la branche amont.
Vous avez déjà disons environ 4 commits et vous obtenez
Updates were rejected because the tip of your current branch is behind.
Voici ce que j'ai fait
Tout d'abord, écrasez tous vos 4 commits
Vous obtiendrez une liste de commits avec
pick
écrit dessus. (ouvert dans un éditeur)exemple
à
Après cela, vous pouvez enregistrer votre commit combiné
Prochain
Vous devrez cacher votre commit
Voici comment
maintenant rebase avec votre branche amont
Maintenant, pop votre commit caché
engager ces changements et les pousser
la source
Cela doit être parce que la validation est en avance sur votre poussée actuelle.
1) git pull origin "nom de la branche que vous voulez pousser"
2) git rebase
si git rebase réussit, alors c'est bien. Sinon, vous avez résolu tous les conflits de fusion localement et continuez jusqu'à ce que le rebase à distance réussisse.
3) git rebase --continuer
la source
J'ai eu ce problème en essayant de pousser après un rebase via Visual Studio Code, mon problème a été résolu en copiant simplement la commande à partir de la fenêtre de sortie git et en l'exécutant à partir de la fenêtre du terminal dans Visual Studio Code.
Dans mon cas, la commande était quelque chose comme:
git push origin NameOfMyBranch:NameOfMyBranch
la source
Vous devez avoir ajouté de nouveaux fichiers dans vos commits qui n'ont pas été poussés. Vérifiez le fichier et poussez-le à nouveau et essayez de tirer / pousser cela fonctionnera. Cela a fonctionné pour moi.
la source