Comment puis-je trouver l'emplacement d'origine / maître dans git, et comment le changer?

227

Je suis un débutant Git. J'ai récemment déplacé un projet Rails de Subversion vers Git. J'ai suivi le tutoriel ici: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

J'utilise également unfuddle.com pour stocker mon code. J'apporte des modifications sur mon ordinateur portable Mac dans le train vers / depuis le travail, puis je les pousse à se désinstaller lorsque j'ai une connexion réseau à l'aide de la commande suivante:

git push unfuddle master

J'utilise Capistrano pour les déploiements et extrait le code du référentiel unfuddle en utilisant la branche master.

Dernièrement, j'ai remarqué le message suivant lorsque j'exécute "git status" sur mon ordinateur portable:

# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)

Et je ne sais pas pourquoi. Je pensais que mon ordinateur portable était à l'origine ... mais je ne sais pas si c'est le fait que j'ai initialement tiré de Subversion ou poussé vers Unfuddle qui est à l'origine du message. Comment puis-je:

  1. Découvrez où Git pense que «origine / maître» est?
  2. Si c'est ailleurs, comment transformer mon ordinateur portable en «origine / maître»?
  3. Obtenez ce message pour s'en aller. Cela me fait penser que Git est mécontent de quelque chose.

Mon Mac exécute Git version 1.6.0.1.


Lorsque je lance git remote show origincomme suggéré par dbr, j'obtiens ce qui suit:

~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly

Lorsque je cours git remote -vcomme suggéré par Aristote Pagaltzis, j'obtiens ce qui suit:

~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin  /Users/brian/Projects/GeekFor/gf/.git
unfuddle    [email protected]:spilth/geekfor.git

Maintenant, fait intéressant, je travaille sur mon projet dans le geekforrépertoire, mais cela dit que mon origine est ma machine locale dans le gfrépertoire. Je pense que gfc'était le répertoire temporaire que j'ai utilisé lors de la conversion de mon projet de Subversion en Git et probablement d'où j'ai poussé pour ne pas me familiariser. Ensuite, je crois avoir extrait une nouvelle copie de unfuddle dans le geekforrépertoire.

Il semble donc que je devrais suivre les conseils de dbr et faire:

git remote rm origin
git remote add origin [email protected]:spilth/geekfor.git
Brian Kelly
la source

Réponses:

202

1. Découvrez où Git pense que «origine / maître» utilise git-remote

git remote show origin

..qui renverra quelque chose comme ..

* remote origin
  URL: [email protected]:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

Une télécommande est essentiellement un lien vers un référentiel distant. Quand tu fais ..

git remote add unfuddle [email protected]/myrepo.git
git push unfuddle

..git poussera les modifications à l'adresse que vous avez ajoutée. C'est comme un signet, pour les référentiels distants.

Lorsque vous exécutez git status, il vérifie s'il manque des validations à distance (par rapport à votre référentiel local), et si oui, par combien de validations. Si vous poussez toutes vos modifications sur "origine", les deux seront synchronisées, vous n'aurez donc pas ce message.

2. Si c'est ailleurs, comment transformer mon ordinateur portable en «origine / maître»?

Cela ne sert à rien de le faire. Dites "origine" est renommé "ordinateur portable" - vous ne voulez jamais faire à git push laptoppartir de votre ordinateur portable.

Si vous souhaitez supprimer la télécommande d'origine, vous devez le faire.

git remote rm origin

Cela ne supprimera rien (en termes de contenu de fichier / historique des révisions). Cela arrêtera le message "votre branche est en avance par ..", car il ne comparera plus votre référentiel avec la télécommande (car il a disparu!)

Une chose à retenir est qu'il n'y a rien de spécial origin, c'est juste un nom par défaut que git utilise.

Git utilise originpar défaut lorsque vous faites des choses comme git pushou git pull. Donc, si vous avez une télécommande que vous utilisez beaucoup (Unfuddle, dans votre cas), je recommanderais d'ajouter unfuddle comme "origine":

git remote rm origin
git remote add origin [email protected]:subdomain/abbreviation.git

ou faites ce qui précède dans une seule commande en utilisant set-url:

git remote set-url origin [email protected]:subdomain/abbreviation.git

Ensuite, vous pouvez simplement faire git pushou git pullmettre à jour, au lieu degit push unfuddle master

dbr
la source
1
Il écrit qu'il pousse vers le originréférentiel (même s'il ne sait pas comment cela fonctionne en termes git) - retirer la télécommande ne serait guère utile pour lui.
Aristote Pagaltzis
10
Je ne comprends pas pourquoi les gens reformulent les questions. Cela modifie le sens de la question, rend les réponses existantes insensées et ne permet pas aux autres de savoir que le demandeur de questions a besoin de plus d'informations, car sa question peut être légèrement `` incorrecte ''.
stu
9
La suppression de l'origine distante était exactement ce dont j'avais besoin car elle pointait vers un référentiel local qui n'existait plus, pas le référentiel unuddle.
Brian Kelly
3
stu: La reformulation est une bonne chose! S'ils ne l'ont pas dit, c'est clairement en premier lieu, il est inutile d'obtenir des réponses qui ne résolvent pas le problème réel.
dbr
4
Mais c'est tellement plus facile de se mettre en colère et d'être amer. :-) Mais je vois votre point.
stu
286

Je suis venu à cette question en cherchant une explication sur ce que signifie le message "votre branche est en avance par ...", dans le schéma général de git. Il n'y avait pas de réponse à cela ici, mais puisque cette question apparaît actuellement en haut de Google lorsque vous recherchez la phrase "Votre branche est en avance sur 'origine / maître'", et j'ai depuis compris ce que le message signifie vraiment , J'ai pensé publier l'information ici.

Donc, étant un débutant git, je peux voir que la réponse dont j'avais besoin était une réponse nettement novice. Plus précisément, ce que signifie l'expression "votre branche est en avance par ...", c'est qu'il y a des fichiers que vous avez ajoutés et enregistrés dans votre référentiel local, mais que vous n'avez jamais poussés vers l'origine. L'intention de ce message est encore obscurcie par le fait que "git diff", du moins pour moi, n'a montré aucune différence. Ce n'est que lorsque j'ai lancé "git diff origin / master" que l'on m'a dit qu'il y avait des différences entre mon référentiel local et le maître distant.

Donc, pour être clair:


"your branch is ahead by ..." => Vous devez pousser vers le maître distant. Exécutez "git diff origin / master" pour voir quelles sont les différences entre votre référentiel local et le référentiel maître distant.


J'espère que cela aide d'autres débutants.

(De plus, je reconnais qu'il existe des subtilités de configuration qui peuvent invalider partiellement cette solution, comme le fait que le maître peut ne pas être réellement "distant", et que "origine" est un nom reconfigurable utilisé par convention, etc. Mais les débutants le font ne nous soucions pas de ce genre de choses. Nous voulons des réponses simples et directes. Nous pourrons lire les subtilités plus tard, une fois que nous aurons résolu le problème urgent.)

comte

Earl Jenkins
la source
2
@Earl ne serait pas git diff --cached origin/masterune meilleure instruction ici car elle indique quel serait le résultat de la prochaine poussée? La commande en surbrillance que vous avez ci-dessus montre également les fichiers non validés et non mis en scène (je pense que je suis aussi un débutant git)
nhed
48
Il est également possible que vous deviez exécuter git fetchsi vous obtenez cette erreur après a git pull remote branch. Vos références sont peut-être obsolètes. git fetchcorrige cela.
bryan kennedy
la origin/masterpartie signifie-t-elle une masterbranche dans le originréférentiel?
Rakib
1
Notez que cette description est incomplète. Je vis actuellement # On branch master # Your branch is ahead of 'origin/master' by 3 commits. Mais git diff origin / master ne montre rien (et l'option --cached ne change rien à cela). Et, git fetch ne change pas cela, git pull ne change pas cela, git reset --hard ne change pas cela. Pour changer cela, j'avais besoin de: git reset --hard origin / master Et j'ai choisi cette route parce que d'autres personnes travaillent avec moi dans ce référentiel et je ne voulais pas invalider leurs tests, et parce que je ne pouvais pas savoir ce que ces commits sont.
rdm
1
Je reçois également ce message lorsque j'ai besoin de tirer plutôt que de pousser vers origin / master. par exemple d'une autre branche si je git checkout masterreçois le message, ce qui signifie que je devrais git pull origin masteravant de travailler. mais je trouve cela très déroutant parce que la formulation du message suggère le contraire
Anentropic
38

J'ai eu un problème similaire à celui-ci, où se trouvait mon répertoire de travail, ahead of origin by X commitsmais git pullqui en résultait Everything up-to-date. J'ai réussi à le réparer en suivant ces conseils . Je poste ceci ici au cas où cela aiderait quelqu'un d'autre avec un problème similaire.

La correction de base est la suivante:

$ git push {remote} {localbranch}:{remotebranch}

Où les mots entre parenthèses doivent être remplacés par votre nom distant, votre nom de branche locale et votre nom de branche distante. par exemple

$ git push origin master:master
Mims H. Wright
la source
1
Merci, ça l'a fait pour moi. git diffn'a rien montré, et après avoir fait ce que vous avez décrit, je ne reçois plus ce message déroutant et ennuyeux.
LaundroMat
1
Besoin de plus de votes positifs :). Les réponses les plus votées étaient toutes "sans effet" pour moi (c'est-à-dire "git fetch" - n'a rien fait ... cocher "git remote show origin" - rien de incorrect, rien à changer)
Adam
24

il existe parfois une différence entre la version locale en cache du maître d'origine (origine / maître) et le vrai maître d'origine.

Si vous exécutez git remote updatecela resynchronisera l'origine master avec origin / master

voir la réponse acceptée à cette question

Différences entre git pull origin master et git pull origin / master

chim
la source
10

Je pensais que mon ordinateur portable était à l'origine…

C'est un peu absurde: originfait référence au référentiel distant par défaut - celui dont vous récupérez / tirez habituellement les modifications des autres.

Comment puis-je:

  1. git remote -vvous montrera ce qui originest; origin/masterest votre «signet» pour le dernier état connu de la masterbranche du originréférentiel, et le vôtre masterest une branche de suivi pour origin/master. C'est tout comme ça devrait être .

  2. Non. Au moins, cela n'a aucun sens pour un référentiel d'être le référentiel distant par défaut pour lui-même.

  3. Ce n'est pas le cas. Cela vous indique simplement que vous avez effectué tant et tant de validations localement qui ne se trouvent pas dans le référentiel distant (selon le dernier état connu de ce référentiel).

Aristote Pagaltzis
la source
1
J'ai supposé que mon ordinateur portable était à l'origine puisque c'est là que j'ai créé le référentiel (d'où il est originaire).
Brian Kelly
1
En revanche, il est parfaitement logique pour moi de originpointer l'ordinateur portable localement, car être hors ligne ou changer de réseau est un cas très courant pour les appareils portables comme les ordinateurs portables. De cette façon, vous pouvez utiliser git pushet à git pulltout moment, pas besoin de penser si vous êtes actuellement connecté au bon réseau. Ce local originpeut être synchronisé avec les vraies télécommandes automatiquement lorsqu'une liaison réseau est disponible, selon l'état d'itinérance actuel. La partie problématique est de savoir quand exécuter quelle synchronisation, par rapport à la partie GIT qui est assez facile.
Tino
2
Il est parfaitement logique de pointer originvers un autre référentiel sur votre ordinateur portable. Cependant, le fait de pointer le originréférentiel sur lui-même ne fait rien: cela ne ferait aucune différence que vous exécutiez git pushou git pull, car un référentiel est toujours exactement synchronisé avec lui-même de toute façon. C'est err, un peu tautologique.
Aristote Pagaltzis
3

[ Solution ]

$ git push origin

^ ceci l'a résolu pour moi. Ce qu'il a fait, il a synchronisé mon maître (sur un ordinateur portable) avec "origine" qui se trouve sur le serveur distant.

Chris
la source
1

Je me bats avec ce problème et aucune des réponses précédentes ne s'attaque à la question telle que je la vois. J'ai résolu le problème à ses bases pour voir si je peux clarifier mon problème.

Je crée un nouveau référentiel (rep1), y mets un fichier et le valide.

mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"

Je crée un clone de rep1 et l'appelle rep2. Je regarde à l'intérieur de rep2 et je vois que le fichier est correct.

cd ~
git clone ~/rep1 rep2
cat ~/rep2/README

Dans rep1, j'apporte une seule modification au fichier et je le valide. Ensuite, dans rep1, je crée une télécommande pour pointer vers rep2 et pousser les modifications.

cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master

Maintenant, quand j'entre dans rep2 et que je fais un `` statut git '', on me dit que je suis en avance sur l'origine.

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#

README dans rep2 est tel qu'il était à l'origine, avant le deuxième commit. Les seules modifications que j'ai apportées sont à rep1 et tout ce que je voulais faire était de les repousser à rep2. Qu'est-ce que je ne saisis pas?

Steve Hindmarch
la source
1
Deux choses: la vérification "origin / master" de rep2 ne regarde pas réellement rep1. Si vous faites un «git pull» dans rep2, il remarquera qu'ils sont dans le même état et cessera de se plaindre. Pour voir réellement les changements d'une poussée dans une copie de travail, vous devez faire un «git checkout» - les poussées ne touchent jamais la copie de travail du repo dest.
Walter Mundt
J'ai pensé que cela pourrait être le cas, mais j'obtiens "git checkout M README Votre branche est en avance sur 'origin / master' par 1 commit." Mais ma copie de travail est en fait en retard d'un commit, pas en avant.
Steve Hindmarch
1

Il vous attend pour "pousser". Essayer:

$ git push

Vino
la source
1

J'ai eu ce problème récemment et j'ai pensé que c'était parce que j'avais supprimé certains fichiers dont je n'avais plus besoin. Le problème est que git ne sait pas que les fichiers ont été supprimés et qu'il voit que le serveur les a toujours. (serveur = origine)

Alors j'ai couru

git rm $(git ls-files --deleted)

Et puis exécuté un commit et push.

Cela a résolu le problème.

looneydoodle
la source
1
Cela ne fonctionne que si le message de validation dit supprimer - <nom de fichier>
looneydoodle
1

Je suis aussi un débutant git. J'ai eu le même problème avec les messages «votre branche est en avance sur les messages origine / maître par N commits». Faire le "git diff origin / master" suggéré a montré quelques différences que je ne tenais pas à garder. Alors ...

Étant donné que mon clone git était destiné à l'hébergement et que je voulais une copie exacte du référentiel maître et que je ne souhaitais pas conserver les modifications locales, j'ai décidé de sauvegarder l'intégralité de mon référentiel et d'en créer un nouveau:

(sur la machine d'hébergement)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

Pour plus de commodité, j'avais l'habitude d'apporter des modifications au clone sur ma machine d'hébergement. Pas plus. Je vais apporter ces modifications au maître, git s'y engager et faire un git pull. Espérons que cela devrait garder mon clone git sur la machine d'hébergement en parfaite synchronisation.

/ Nara

Nara Narasimhan
la source
0

Je me demandais la même chose à propos de mon repo. Dans mon cas, j'avais une vieille télécommande sur laquelle je ne poussais plus, j'ai donc dû la retirer.

Obtenez la liste des télécommandes:

git remote

Retirez celui dont vous n'avez pas besoin

git remote rm {insert remote to remove}
Jason Rikard
la source
0

Il est possible de réinitialiser un commit spécifique avant que vos propres commits aient lieu.

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

Utilisez git logpour trouver quel commit était le commit que vous aviez avant les modifications locales.

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Prenez note des validations locales et réinitialisez directement la validation précédente:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
RobLoach
la source
-1

J'ai eu le problème "Votre branche est en avance sur 'origine / master' par nn commits." quand j'ai poussé vers un référentiel distant avec:

git push ssh://[email protected]/yyy/zzz.git

Quand j'ai trouvé que mon adresse distante était dans le fichier .git / FETCH_HEAD et que j'ai utilisé:

git push

le problème a disparu.

Noob
la source