Pourquoi ne Git dire que ma branche principale est “à jour”, même si elle ne l'est pas?
Problème De Base
Je viens de supprimer TOUT le code à partir d'un fichier dans mon projet et engage le changement de mon git local (sur le but). Je n'ai
git pull upstream master
d'extraction et de fusion de l'amont (donc, en théorie, qui a supprimé le code devrait être de retour).
Git me dit que tout est à jour.
Tout ce qui n'est certainement PAS à jour tout ce qui supprimés code est toujours supprimé.
D'Autres Informations Pertinentes
Je n'ai qu'une branche appelée "maître".
J'ai récemment mis en place des "maître" de la piste en amont de la sorte:
Branche master mis en place pour le suivi à distance de la branche master de l'amont.
La commande git branch -vv
rendements:
* master 7cfcb29 [upstream/master: ahead 9] deletion test
Pourquoi pourquoi pourquoi est-ce arrivé? Je suis sur le point de tout e-mailing mon chef de projet des modifications que je fais sur notre code.
Mise à jour
Je pensais que c'était évident, mais de toute façon c'est mon but:
Obtenir la plus récente du code sur mon système.
Excusez ma colère ici, mais pourquoi une simple tâche d'avoir à être si difficile?
- Il est évident que si vous supprimez votre source puis essayez de tirer avec un simple "pull" qui git ne sera pas annuler vos modifications locales (dans ce cas, votre suppressions) sans s'assurer que vous voulez vraiment pour annuler vos modifications locales. La première réponse semble expliquer exactement comment vous pouvez aller à ce sujet.
Vous devez vous connecter pour publier un commentaire.
Je pense que votre question fondamentale ici est que vous êtes de mauvaise interprétation et/ou de l'incompréhension de ce que git fait et pourquoi il le fait.
Lorsque vous clonez certains autres référentiel git fait une copie de tout ce qui est "là-bas". Il prend également "leur" branche des étiquettes, telles que
master
, et fait une copie de ce label dont le "nom complet" dans votre arbre git est (normalement)remotes/origin/master
(mais dans votre cas,remotes/upstream/master
). La plupart du temps vous obtenez à omettre laremotes/
partie trop, de sorte que vous pouvez vous référer à cet original commeupstream/master
.Si maintenant vous faire et commettre des changement(s) de fichier(s), vous êtes le seul avec ces changements. Parallèlement, d'autres personnes peuvent utiliser le dépôt original (à partir de laquelle vous avez fait votre clone) pour faire d'autres clones et du changement de ces clones. Ils sont les seuls, avec leurs modifications, bien sûr. Finalement, si, quelqu'un peut-être des modifications ils renvoient le propriétaire d'origine (par l'intermédiaire de "pousser" ou des patchs ou autre).
La
git pull
de commande est la plupart du temps juste un raccourci pourgit fetch
suivie pargit merge
. Ceci est important car il signifie que vous devez comprendre ce que ces deux opérations réellement faire.La
git fetch
commande dit de retourner à l'endroit où vous cloné à partir de (ou ont par ailleurs mis en place comme un lieu de chercher à partir de) et de trouver "de nouveaux trucs à quelqu'un d'autre ajouté ou modifié ou supprimé". Ces changements sont copiées et appliquée à votre copie de ce que vous avez auparavant. Ils sont pas appliqué à votre propre travail, uniquement à la leur.La
git merge
de commande est plus compliqué et c'est là que vous allez mal. Ce qu'il fait, simpliste, un peu, est de comparer ce que vous avez changé dans votre copie" à "modifications que vous avez récupérée à partir de quelqu'un d'autre et ainsi ont été ajoutés à votre-copie-de-la-quelqu'un-autre-travaux". Si vos modifications et leurs modifications ne semblent pas en conflit, lemerge
opération mushes ensemble et vous donne une "fusion s'engager" que les liens de votre développement et de leur développement (bien qu'il soit très commun de "facile" au cas où vous n'avez pas de changements, et vous obtenez un "fast forward").La situation que vous êtes à la rencontre de maintenant est celui dans lequel vous avez effectué des modifications et commis—neuf fois, en fait, d'où le "à venir 9"—et ils ont fait pas changements. Donc,
fetch
consciencieusement récupère rien, et puismerge
prend leurs manque de modifications et ne fait rien.Ce que vous voulez, c'est de regarder, ou peut-être même "reset" pour, "leur" version du code.
Si vous voulez simplement pour regarder, vous pouvez simplement vérifier que version:
Qui indique à git que vous voulez déplacer le répertoire en cours à la direction générale dont le nom complet est en fait
remotes/upstream/master
. Vous verrez leur code de la dernière fois que vous avez exécutégit fetch
et ont obtenu leur code plus tard.Si vous voulez abandonner tous vos propres changements, ce que vous devez faire est de changer git de l'idée de la révision de votre étiquette,
master
, doit nom. Actuellement, il noms de votre dernier commit. Si vous obtenez de retour sur cette branche:puis le
git reset
commande vous permet de "déplacer l'étiquette", comme elle l'avait fait. Le seul problème restant (en supposant que vous êtes vraiment prêt à abandonner tout ce que vous avez don) est de trouver l'endroit où l'étiquette doit pointer.git log
vous permettra de trouver le numérique noms—les choses comme7cfcb29
—qui sont permanents (qui ne change jamais) les noms, et il y a un nombre ridicule de d'autres façons de les nommer, mais dans ce cas, vous voulez juste le nomupstream/master
.Pour déplacer l'étiquette, de l'anéantissement de vos propres changements (tout ce que vous avez commises sont effectivement récupérable pour un bon moment, mais il est beaucoup plus difficile après cela donc être très sûr):
La
--hard
indique à git pour effacer ce que vous avez fait, la direction générale de l'étiquette, et de vérifier ensuite la validation donnée.C'est pas super commun à vraiment voulez
git reset --hard
et effacer un tas de travail. Une méthode plus sûre (ce qui rend beaucoup plus facile de récupérer ce travail si vous décider de cela en vaut la peine, après tout) est de renommer votre branche:et ensuite faire une nouvelle branche locale nommée
master
que les "pistes" (je n'aime pas vraiment ce terme car je pense qu'il confond les gens, mais c'est le git terme 🙂 ) l'origine (ou en amont) le maître:et vous pourrez vous-même avec:
Ce que les trois dernières commandes de le faire (il y a des raccourcis pour deux commandes) est de changer le nom collé sur l'étiquette existante, puis faire une nouvelle étiquette, puis de passer à ça:
avant de faire quoi que ce soit:
après
git branch -m
:après
git branch -t master upstream/master
:Ici
C0
est le dernier commit (une source complète de l'arbre) que vous avez lorsque vous avez fait votregit clone
. C1-C9 sont vos commits.Notez que si vous étiez à
git checkout bunchofhacks
et puisgit reset --hard HEAD^^
, ce serait de modifier la dernière image de:La raison en est que
HEAD^^
noms de la révision de deux de la tête de la branche courante (qui vient avant la réinitialisation seraitbunchofhacks
), etreset --hard
se déplace ensuite l'étiquette. S'engage C8 et C9 sont maintenant la plupart du temps invisible (vous pouvez utiliser des choses comme le reflog etgit fsck
de les trouver, mais il n'est plus trivial). Vos étiquettes sont à vous déplacer comme vous le souhaitez. Lefetch
commande prend soin de ceux qui commencent avecremotes/
. C'est classique pour correspondre à "la vôtre" avec "leurs" (si ils ont unremotes/origin/mauve
vous auriez le nom de vôtremauve
trop), mais vous pouvez taper dans "leurs" chaque fois que vous voulez le nom/voir vous engage a obtenu "d'eux". (Rappelez-vous que "un commit" est un ensemble de l'arborescence source. Vous pouvez choisir un fichier à partir d'un commit, avecgit show
par exemple, si et quand vous voulez.)git merge
comme une commande de ligne de commande (ce qui est quelque chose que je fais moi-même, c'est une méthode raisonnable). Notez, cependant, quegit pull
commence par la première exécution degit fetch
, puis en cours d'exécutiongit merge
(ougit rebase
si vous lui dites de le faire à la place). C'est le fetch étape qui apporte réellement au cours de la nouvelle s'engage à être fusionnés (ou relocalisée seule).git status
, que je peux utiliser pour voir si, en amont, les pensions de titres sont en avance de mon repo? Le message que je reçois avecgit status
qui dit "Votre branche est à jour avec 'origin/master'" me confond en pensant que j'ai les derniers changements, quand je n'en ai pas. Parfois, je reçois un message qui dit quelque chose comme "origin/master est de 5 s'engage à l'avance de votre branche" (paraphrase). Mais il n'est pas cohérent.git fetch
d'abord, puisgit status
. Vous pouvez faire un alias qui fait les deux, si vous le souhaitez. Il y a aussigit ls-remote
, qui obtiendra le SHA-1 à partir de la télécommande (c'est la première étape d'un véritablegit fetch
), mais ceux-ci sont assez inutile pour l'homme, et si votre réseau est rapide, completgit fetch
n'est pas beaucoup plus lent (et utile), alors vous devriez probablement justegit fetch
.git fetch
autonome de commande. Maintenant j'ai compris! Merci!git status
dit: "Votre direction est jusqu'à ce jour" quand immédiategit fetch
puis tire vers le bas plus d'une centaine d'objets et résout près d'une centaine de deltas, mentionne plusieurs nouvelles branches et un couple de nouvelles balises et les changements de la main (suivi à distance) chef de la direction générale de commettre - et puis un autre git status cheerily, et hypocritement, dit encore "Votre direction est jusqu'à ce jour". Clairement beaucoup descendit de l'origine, mais la direction a "jusqu'à date avec mention de leur origine", à la fois avant et après?master
n'est pas le même que leurs branchemaster
. Dans ce cas, il y a deux "eux"—origin
etupstream
—il y a donc troismaster
s; et votre maître n'est pas encore associé à l'un de ces troismaster
s. est, l'un des trois, et est associé à un autre, mais pas avec le troisième. Pas tous les cas de tomber dans ce piège particulier, mais si vous avez à la foisorigin
etupstream
, certains le font.fetch
lagit status
est juste la comparaison de la local (à distance) suivi de la branche, qui est toujours l'ancienne.status
ne se compare pas à la réel branche distante. Lefetch
apporte les modifications à partir de la distance à la local (à distance) de suivi de la branche et puisstatus
peut faire sens.$ git status On branch release/2019 Your branch is up to date with 'origin/release/2019'.
Il dit que c'est jusqu'à ce jour, mais quand je tire il tire encore les choses.$ git pull remote: Counting objects: 32, done.
git pull
s'exécutegit fetch
d'abord, puisgit merge
(ou d'autres, deuxième de la commande de votre choix). Legit fetch
étape à jour votre Git dans la mémoire de l' leurs Git de l'état, par l'appel de leurs Git et arriver à quelque chose de nouveau à partir d'eux. Votregit status
vérifie seulement votre Git la mémoire de leurs Git.J'ai eu le même problème que vous.
Je n'ai
git status
git fetch
git pull
, mais ma branche était encore derrière à l'origine. J'ai eu des dossiers et des fichiers poussé à distance et j'ai vu les fichiers sur le web, mais sur mon local ils étaient manquants.Enfin, ces commandes de mise à jour de tous les fichiers et dossiers sur mon local:
ou si vous voulez une branche
Toutes les modifications que vous avez commis, comme la suppression de tous les fichiers de votre projet, sera toujours en place après un pull. Tous un pull n'est de fusionner les modifications les plus récentes à partir de quelque part d'autre dans votre propre branche, et si votre succursale a supprimé tout, puis, au mieux, vous obtiendrez des conflits de fusion lorsque l'amont changements affectent les fichiers que vous avez supprimé. Donc, en bref, oui tout est à jour.
Si vous décrivez ce que le résultat vous plaît, au lieu de "tous les fichiers supprimés", peut-être quelqu'un capable de proposer un plan d'action approprié.
Mise à jour:
Ce que vous ne semblez pas comprendre, c'est que vous avez déjà la plus récente du code, qui est la vôtre. Si ce que vous voulez vraiment est de voir le plus récent de de quelqu'un d'autre de travail sur la branche master, il suffit de faire:
Noter que ce ne sera pas vous laisser dans une position immédiatement (re)démarrer votre propre travail. Si vous avez besoin de savoir comment faire pour annuler quelque chose que vous avez fait ou autrement annuler les changements que vous ou quelqu'un d'autre l'ont fait, alors s'il vous plaît fournir des détails. Aussi, pensez à lire jusqu'à ce que le contrôle de version est pour, puisque vous semblez méconnaître son objectif de base.
upstream/master
. Mise à jour de ma réponse.Comme les autres posters dire, tirez fusionne les modifications de l'amont à votre référentiel. Si vous souhaitez remplacer ce qui est dans votre espace de stockage avec ce qui est en amont, vous avez plusieurs options. En improvisant, j'irais avec
Quelqu'un s'il vous plaît corrigez-moi si je me trompe, mais je crois que c'est parce que votre direction est en avance de l'amont branche master par 9 s'engage. Quand vous faites une traction à partir de la télécommande, vous disposez déjà de ces changements, c'est juste que vous êtes devant eux par 9 s'engage. Il ne serait pas logique pour ces vieux changements que vous avez déjà dans votre histoire et sont en avance par 9 s'engage, pour remplacer vos nouveaux changements.
Je crois que si l'engage dans la télécommande ont été les plus récents puis ils seront fusionnées dans (par défaut, sauf si vous spécifiez
--rebase
) de votre branche courante.Comme Ryan a dit, je vous suggère de préciser exactement ce que votre objectif est donc que quelqu'un peut vous aider plus directement.
Haut réponse est beaucoup mieux en termes de largeur et de profondeur de l'information, mais il semble comme si vous vouliez que votre problème fixe presque immédiatement, et ne me dérange pas trodding sur certains des principes de base du contrôle de version, vous pouvez ...
Commutateur maître
Supprimer les indésirables de la branche. (Note: il faut avoir l'-D, au lieu de la normale-d indicateur parce que votre direction est beaucoup s'engage devant le maître.)
Créer une nouvelle branche
Aucune de ces réponses a travaillé pour moi, j'ai été en mesure de résoudre le problème à l'aide de la commande suivante.
git fetch origin
Ce fait un truc pour moi.