328 votes

git push dit tout à jour, même si j’ai des modifications locales

J'ai une distance de gitosis serveur et un dépôt git local, et chaque fois que je fais un grand changement dans mon code, je vais pousser les modifications sur le serveur.

Mais aujourd'hui, je trouve que même si j'ai quelques changements locaux et de s'engager à un dépôt local, lors de l'exécution de la commande git push origin master , il dit "Tout à jour", mais lorsque j'utilise git clone à la caisse des fichiers sur le serveur distant, il ne contient pas les dernières modifications. Et je n'ai qu'une branche nommée maître et un serveur distant nommé d'origine.

PS: C'est ce que git affiche lors de l'exécution de la commande ls-distance, je ne suis pas sûr que ça aide

$ git ls-remote origin
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        HEAD
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/heads/master
$ git ls-remote .
49c2cb46b9e798247898afdb079e76e40c9f77ea        HEAD
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/heads/master
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/remotes/origin/master
3a04c3ea9b81252b0626b760f0a7766b81652c0c        refs/tags/stage3

317voto

VonC Points 414372

Vous ne travailler pas avec un détachée de la tête par hasard ?

Comme dans:

detached head

indiquant que votre dernier commit n'est pas une branche de la tête.

$ git log -1
# note the SHA-1 of latest commit
$ git checkout master
# reset your branch head to your previously detached commit
$ git reset --hard <commit-id>

Comme mentionné dans l' git checkout page de man (l'emphase est mienne):

Il est parfois utile d'être en mesure de commander un commit qui n'est pas à la pointe de l'une de vos branches.
L'exemple le plus évident est de vérifier que la livraison à une tagged version officielle, comme ceci:

$ git checkout v2.6.18

Les versions antérieures de git n'a pas permis ce et vous a demandé de créer un temporaire de la branche à l'aide de l' -b option, mais à partir de la version 1.5.0, la commande ci-dessus se détache de votre HEAD de la branche courante et directement de points à la commettre nommé par la balise (v2.6.18 dans l'exemple ci-dessus).

Vous pouvez utiliser toutes les commandes git dans cet état.
Vous pouvez utiliser git reset --hard $othercommit de plus de se déplacer, par exemple.
Vous pouvez apporter des modifications et de créer un nouveau commit sur le dessus d'un décollement de la TÊTE.
Vous pouvez même créer une fusion à l'aide d' git merge $othercommit.

L'état vous êtes, tandis que votre TÊTE est détachée n'est pas enregistré par n'importe quelle branche (ce qui est naturel --- vous n'êtes pas sur n'importe quelle branche).
Ce que cela signifie est que vous pouvez vous débarrasser de votre temporaire s'engage et fusionne en revenant à une branche (par exemple, git checkout master), et plus tard git prune ou git gc seraient des ordures-les recueillir.
Si vous n'avez par erreur, vous pouvez demander le reflog de la TÊTE où vous avez été, par exemple

$ git log -g -2 HEAD

216voto

Ram Bhat Points 1337

Err... Si vous êtes un git noob êtes-vous sûr d’avoir avant ? J’ai fait cette erreur la première fois !

29voto

Chris Burbridge Points 184

Une autre situation qui est important à connaître: Le tri de l'état par défaut pour git, c'est que vous travaillez dans le "maître" de la branche. Et pour beaucoup de situations, il vous suffit de traîner dans ton travail de la branche (bien que certaines personnes obtenir la fantaisie et de faire d'autres choses).

De toute façon, c'est juste une branche. Ainsi, une situation que je pourrais obtenir en est:

Ma branche active est en fait PAS la branche master. ... Mais j'ai habituellement faire la commande: git push (et j'avais déjà fait git push origin master, donc c'est un raccourci pour ça).

Donc, je suis habituellement en poussant la branche principale de la salle de repo ... ce qui est probablement un bon nettoyage de chose, dans mon cas ...

Mais j'ai oublié que les modifications que j'ai travaillé ne sont pas encore DANS la branche master !!!

Donc, chaque fois que j'essaie git push, et je vois "Tout à jour", je veux crier, mais bien sûr, il n'est pas git est la faute de! C'est le mien.

Donc, au lieu de cela, j'ai fusionner ma branche en maître, puis les faire pousser, et tout est de nouveau heureux.

7voto

user2079491 Points 19

Voir VonC la réponse ci-dessus - j'ai besoin d'une étape supplémentaire:

$ git log -1
- note the SHA-1 of latest commit
$ git checkout master
- reset your branch head to your previously detached commit
$ git reset --hard <commit-id>

Je l'ai fait, mais quand j'ai ensuite essayé d' git push remoterepo master, il a dit "erreur: impossible de pousser des refs. Pour vous éviter de perdre de l'histoire, non de l'avance rapide des mises à jour ont été rejetées, Fusionner les modifications distantes (par exemple 'git pull") avant de pousser à nouveau."

J'ai donc fait 'git pull remoterepo maître", et il a trouvé un conflit. Je n' git reset --hard <commit-id> encore, copié les fichiers en conflit pour un dossier de sauvegarde, avez - git pull remoterepo master encore, copié les fichiers en conflit dans mon projet, avez - git commit, alors git push remoterepo master, et cette fois ça a fonctionné.

Git arrêté en disant: "tout est à jour" - et il a cessé de se plaindre de 'rapides'.

3voto

samwize Points 4144

Votre statut de git, vous a probablement une situation différente de la mienne.

Mais en tout cas, voici ce qui m’est arrivé... J’ai rencontré l’erreur suivante :

Le message d’information plus ici est que la télécommande a raccroché. Il s’est avéré découle dépassant la taille de tampon http post. La solution consiste à augmenter avec

``

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