Découvrez quelle succursale distante une succursale locale suit


845

Voir aussi:
Comment puis-je voir quelles branches Git suivent quelle branche distante / en amont?

Comment savoir quelle succursale distante une succursale locale suit?

Dois-je analyser la git configsortie ou existe-t-il une commande qui ferait cela pour moi?


19
Sheesh. Ce n'est pas un double exact. Il s'agit d'un sous-ensemble de l'autre, mais il existe d'autres façons de résoudre la question, comme git remote show origin. La réponse principale dans l'autre question est un script bash enroulé autour de la réponse simple ici, qui pourrait être utile à certains. Espérons que cette question ne sera pas complètement close.
cdunn2001

5
D'accord, cela ne devrait certainement pas être dupe. Cela pose quelque chose de complètement différent de la question liée
Adam Batkin

Réponses:


1006

Voici une commande qui vous donne toutes les branches de suivi (configurées pour 'pull'), voir:

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

Vous devez parcourir le SHA et tous les messages de validation à longue enveloppe, mais il est rapide à taper et j'aligne les branches de suivi verticalement dans la 3e colonne.

Si vous avez besoin d'informations sur la configuration «pull» et «push» par branche, consultez l'autre réponse sur git remote show origin.


Mise à jour

À partir de git version 1.8.5, vous pouvez afficher la branche amont avec git statusetgit status -sb


6
Cette sortie est plus directe que git branch -avou git remote show origin, ce qui vous donne BEAUCOUP de données, pas seulement la télécommande suivie
SimplGy

60
BTW, les dernières versions de git (1.8.5.x) affichent également la branche amont pendant git statuset git status -sb- donc une fois que vous avez mis à niveau vers 1.8.5.x, cette question (et réponse) n'a plus d'importance.
jdsumsion

11
Bien que cela vous donne les informations que vous souhaitez, je ne suis pas d'accord car c'est la bonne réponse. C'est une réponse de la même manière en donnant à quelqu'un un dictionnaire qui répond "comment épeler XYZ". Dans le cas présent, vous souhaitez UTILISER la réponse résultante (le nom de la branche) pour une opération .. Cette réponse ne m'aide qu'à le voir visuellement ... ne vous donne pas quelque chose utilisable dans une commande suivante.
UpAndAdam

La sortie de cette commande peut être trompeuse car un message de validation peut facilement commencer par exemple "[my-feature] ...". Veuillez consulter la réponse de @ cdunn2001 qui ne montre que la branche en amont (le cas échéant) et rien d'autre.
Jonas Berlin

1
Je suis d'accord avec @ jonas-berlin - la réponse de cdunn2001 est meilleure si vous voulez analyser le résultat - ma réponse est bonne si vous cherchez une commande simple et êtes prêt à analyser visuellement la sortie
jdsumsion

372

Deux choix:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

ou

% git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
origin/mainline

12
Agréable! Le premier donne des erreurs moches au cas où rien ne serait suivi, tandis que le second est particulièrement utile pour les scripts. BTW %(refname:short)est le nom de la référence actuelle à l'intérieur --format.
Tino

9
git help revisions(l'une des parties les moins connues mais les plus utiles de la documentation) et recherchez upstream.
cdunn2001

15
Cette réponse est bien meilleure que les deux réponses ci-dessus, surtout si vous voulez faire quelque chose commegit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
Jian

2
C'est vraiment utileecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
albfan

6
Si vous voulez trouver l'amont pour une autre branche, une variante du deuxième choix est: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)remplacer SOMEBRANCH par le nom de la branche, ou "HEAD" pour la branche actuelle
Jonas Berlin

220

Je pense git branch -avque vous indique uniquement les branches que vous avez et à quel engagement elles se trouvent, vous permettant de déduire quelles branches distantes les branches locales suivent.

git remote show originvous indique explicitement quelles branches suivent quelles branches distantes. Voici un exemple de sortie d'un référentiel avec un seul commit et une branche distante appelée abranch:

$ git branch -av
* abranch                d875bf4 initial commit
  master                 d875bf4 initial commit
  remotes/origin/HEAD    -> origin/master
  remotes/origin/abranch d875bf4 initial commit
  remotes/origin/master  d875bf4 initial commit

contre

$ git remote show origin
* remote origin
  Fetch URL: /home/ageorge/tmp/d/../exrepo/
  Push  URL: /home/ageorge/tmp/d/../exrepo/
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    abranch
    master
  Remote branches:
    abranch tracked
    master  tracked
  Local branches configured for 'git pull':
    abranch merges with remote abranch
    master  merges with remote master
  Local refs configured for 'git push':
    abranch pushes to abranch (up to date)
    master  pushes to master  (up to date)

3
J'ai besoin d'une commande qui découvre la branche en amont, donc utiliser 'origin' comme entrée fait une supposition, donc cela ne fonctionne pas pour moi
Alexander Mills

1
Mais cela répond à l'OP. La commande git remote show originvous montre les branches locales et ce qu'elles suivent à la fois pour pousser et tirer.
dudewad

1
@dudewad Je pense que le fait était que cette commande suppose que la télécommande est appelée origin, alors qu'elle pourrait être n'importe quoi (par exemple, plusieurs télécommandes, avec différentes branches suivant les branches de différentes télécommandes).
Ruslan

74

Mise à jour: Eh bien, cela fait plusieurs années que j'ai posté ça! Pour mon objectif spécifique de comparer HEAD à amont, j'utilise maintenant @{u}, qui est un raccourci qui fait référence à HEAD de la branche de suivi en amont. (Voir https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).

Réponse originale: J'ai également rencontré ce problème. J'utilise souvent plusieurs télécommandes dans un même référentiel, et il est facile d'oublier celui contre lequel votre branche actuelle effectue le suivi. Et parfois, il est utile de le savoir, par exemple lorsque vous souhaitez consulter vos commits locaux via git log remotename/branchname..HEAD.

Tout cela est stocké dans des variables de configuration git, mais vous n'avez pas besoin d'analyser la sortie de configuration git. Si vous appelez git config suivi du nom d'une variable, il affichera simplement la valeur de cette variable, aucune analyse requise. Dans cet esprit, voici quelques commandes pour obtenir des informations sur la configuration du suivi de votre branche actuelle:

LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`

Dans mon cas, comme je ne suis intéressé que par le nom de ma télécommande actuelle, je fais ceci:

git config branch.`git name-rev --name-only HEAD`.remote

2
Cela a été très utile pour créer un alias pour rebaser quelle que soit ma branche actuelle. Merci!
Justin Spahr-Summers

De même utile pour notre alias «fastforward» qui fera avancer la branche de suivi local vers la télécommande tant que l'opération est une avance rapide.
Altreus

4
En fait, j'ai découvert que cela git name-rev --name-only HEADne vous dirait pas sur quelle branche vous vous trouvez. Pour cela, je viens d'utilisergit branch | grep '^\*' | cut -d' ' -f2
Altreus

1
Merci! Les autres réponses à des questions similaires n'ont pas mentionné d' @{u}alias / raccourci et c'est exactement ce que je cherchais! Aucune raison de comparer avec la branche principale si vous voulez seulement déterminer si vous devez tirer ou non.
Dan M.

1
@{u}est la bombe. Et existe depuis la 1.7.0, ce qui signifie que s'il n'est pas disponible dans un git que quelqu'un utilise en 2018, ils sont probablement dus à une mise à niveau.
Chris Cleeland

48

Les succursales locales et leurs télécommandes.

git branch -vv 

Toutes les branches et télécommandes de suivi.

git branch -a -vv

Voyez où les branches locales sont explicitement configurées pour push et pull.

git remote show {remote_name}

21

Cela vous montrera la branche sur laquelle vous vous trouvez:

$ git branch -vv

Cela ne montrera que la branche actuelle sur laquelle vous vous trouvez:

$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)

par exemple:

myremote/mybranch

Vous pouvez trouver l'URL de la télécommande utilisée par la branche actuelle avec laquelle vous vous trouvez:

$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)

par exemple:

https://github.com/someone/somerepo.git

19

Vous pouvez utiliser git checkout, c'est-à-dire "vérifier la branche actuelle". Il s'agit d'un no-op avec des effets secondaires pour afficher les informations de suivi, si elles existent, pour la branche actuelle.

$ git checkout 
Your branch is up-to-date with 'origin/master'.

17

Je ne sais pas si cela compte pour analyser la sortie de git config, mais cela déterminera l'URL de la télécommande que le maître suit:

$ git config remote. $ (git config branchement.master.remote) .url

Ou git config branch.$(git symbolic-ref -q HEAD).remotesi vous voulez simplement le nom de la télécommande en cours de suivi de la branche actuelle - git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).urlpour l'URL.
Anakhand

J'avais besoin d'ajouter une --shortoption pour que cela fonctionne. Donc, pour obtenir le nom distant de la branche actuelle: git config branch.$(git symbolic-ref -q --short HEAD).remoteet pour obtenir l'URL de la télécommande de la branche actuelle:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson

13

Encore une autre façon

git status -b --porcelain

Cela vous donnera

## BRANCH(...REMOTE)
modified and untracked files

10

Un autre moyen simple consiste à utiliser

cat .git/config dans un git repo

Cette liste répertorie les détails des succursales locales


Fonctionne bien sous Linux. Ne fonctionnera pas sur Windows sauf dans une invite de type Unix (par exemple cygwin ou git bash).
Contango

Dans Windows, utilisez simplement type .git/configau lieu de cat .git/configbien sûr sur la ligne de commande ordinaire ..
khmarbaise

9

Une autre méthode (merci osse), si vous voulez juste savoir si elle existe ou non:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi

Quelle langue? Cela ressemble à un script shell Linux mais ne donne aucune autre information ou contexte.
Suncat2000

8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : Cette partie montrera toutes les branches locales ainsi que leur branche en amont.

grep 'BRANCH_NAME' : Il filtrera la branche actuelle de la liste des branches.



5

Répertorie les succursales locales et distantes:

$ git branch -ra

Production:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

3

La sortie de la porcelaine git-status (lisible par machine) ressemble à ceci:

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2

Et pour obtenir la branche en amont uniquement:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name

Si la branche n'a pas en amont, la commande ci-dessus produira une sortie vide (ou échouera avec set -o pipefail).


2

Si vous souhaitez trouver l'amont pour n'importe quelle branche (par opposition à celle que vous utilisez), voici une légère modification de la réponse de @ cdunn2001:

git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}

Cela vous donnera le nom de la branche distante de la branche locale nommée YOUR_LOCAL_BRANCH_NAME.


2

Vous pouvez essayer ceci:

git remote show origin | grep "branch_name"

branch_name doit être remplacé par votre succursale


Que se passe-t-il si le nom de votre succursale correspond également à d'autres succursales? Que se passe-t-il si votre nom de branche correspond à un autre texte dans la sortie de git remote show origin- s'il est appelé mergesou configure?
Tom Swirly

n'a pas eu u. voulez-vous dire plusieurs branches ayant les mêmes noms
xpioneer

1

J'utilise cet alias

git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
 then
   echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
   git branch --set-upstream \$1 \$2;
 else
   git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi  
" -'

puis

git track

notez que le script peut également être utilisé pour configurer le suivi.

Plus d'alias géniaux sur https://github.com/orefalo/bash-profiles


0

J'utilise EasyGit (aka "eg") comme un emballage super léger sur (ou le long de) Git. EasyGit a une sous-commande "info" qui vous donne toutes sortes d'informations super utiles, y compris la branche de suivi à distance des branches actuelles. Voici un exemple (où le nom de la branche actuelle est "foo"):

pknotz @ s883422: (foo) ~ / workspace / bd
$ eg info
Total des engagements: 175
Dépôt local: .git
Référentiels distants nommés: (nom -> emplacement)
  origine -> git: //sahp7577/home/pknotz/bd.git
Branche actuelle: foo
  Somme de contrôle cryptographique (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Référentiel pull / push par défaut: origine
  Options de pull / push par défaut:
    branch.foo.remote = origine
    branch.foo.merge = refs / heads / aal_devel_1
  Nombre de contributeurs: 3
  Nombre de fichiers: 28
  Nombre de répertoires: 20
  Taille du fichier le plus grand, en octets: 32473 (pygooglechart-0.2.0 / COPYING)
  Commits: 62

0

En améliorant cette réponse , j'ai trouvé ces .gitconfigalias:

branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push  = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url        \"$remote\" #"  # cognizant of insteadOf
branch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf

quelle langue est-ce?
Daniel Farrell

3
@Dan Farrell: shell. Alias ​​commençant par un! utilisez / bin / sh. Les guillemets doubles sont cités pour le fichier de configuration de git.
Tom Hale

0

Si vous utilisez Gradle,

def gitHash = new ByteArrayOutputStream()
    project.exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = gitHash
    }

def gitBranch = new ByteArrayOutputStream()
    project.exec {
        def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d'  -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
        commandLine "bash", "-c", "${gitCmd}"
        standardOutput = gitBranch
    }

-2

La commande suivante fera référence à la fourchette actuelle d'origine distante

git remote -v

Pour ajouter un chemin distant,

git remote add origin chemin_nom


ici vous ne trouvez pas un chemin distant - vous ajoutez
serup
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.