سؤال كيف يمكن معرفة الفرع المحلي الذي يتتبع الفرع البعيد في Git؟


أود أن أعرف ما إذا كانت هناك طريقة لمعرفة الفرع المحلي الذي يتتبع الفرع البعيد في Git.

أنا أستخدم خادمًا بعيدًا واحدًا يدعى "origin".


231
2017-08-27 01:04


الأصل


تصحيح لي إذا كنت مخطئا ولكن ليس "فرع بعيد يسمى أصل افتراضيا بدلا من الخادم؟ - Chris Halcrow


الأجوبة:


باستخدام مثال نسختي من الدمية تم سحبها من مستودع Git المنبع على موقع Github.com ...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

ثم إذا كنت لتنفيذ ما يلي:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

وأخيرا إعادة تشغيل git remote show origin الأمر مرة أخرى سوف أرى ما يلي لأسفل بالقرب من الأسفل:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

197
2017-08-27 03:03



هذا يعني أنه يمكنك تتبع جميع الفروع البعيدة في الدمية على الرغم من أن لديك عدد قليل من الفروع المحلية. ما هي العلامات "المتعقبة" الكثيرة التي تعني أنك ترى في نتيجة الأمر؟ "تعقب" من أي فرع محلي؟ - PJ.
يتم تعقب الفروع البعيدة في ذلك إذا كنت تفعل git fetch أو git pull سيتم تعقب التحديثات إلى الفروع البعيدة في المستودع المستنسخة. الفروع المحلية هي فقط ، الفروع المحلية للفروع النائية وبالتالي سيتم تعقب التحديثات إلى الفروع البعيدة ودمجها عند إعطاء الأمر المناسب للقيام بذلك. أقوم بوضوح بتضمين الخيار "-t" عند إنشاء الفرع المحلي لضمان تتبع الفرع الذي نشأت منه. تذكر فرع محلي يمكن أيضا تتبع فرع محلي آخر لذلك لا يجب أن يكون فرعا عن بعد. - Jeremy Bouse
PJ: مصطلح "track" له معنيان مختلفان في Git. الخطوط "المتعقبة" في git remote show remote-nameتشير إلى "تتبع الفروع" (لقطات من الفروع من المستودعات عن بعد). تشير خطوط "الدمج مع" إلى الفروع المحلية التي لها "فرع المنبع" التكوين (مع --track/-t خيار من فرع بوابة أو بوابة الخروج وبالتالي في كثير من الأحيان الخلط مع "تتبع الفروع"). - Chris Johnsen
"فرع التتبع عن بعد"هو إدخال قاموس مصطلحات" فروع التتبع "الذي تم ذكره أعلاه. تم تحديث المستند 8b3f3f84. - ento


لجميع الفروع:

git branch -avv

للفروع المحلية فقط:

git branch -lvv

للفروع البعيدة فقط:

git branch -rvv

يظهر لك جميع الفروع وكذلك اسم فرع المنبع.


122
2018-02-14 16:02



هذا هو أبسط وأكمل إجابة!
في إصدار git 1.7.7.5 هذا يعرض لي الفرع المحلي ويشير إلى sha-1 ، لكنه لا يظهر الفرع البعيد تعقب ... - mpontillo
يعمل لي على إصدار git 1.7.4.1 مطلوب 'v' الثاني لإظهار فرع تعقب عن بعد. - Peter Johnson
للحد من الانتاج git branch -lvv تظهر الفروع المحلية مع المنبع قد تكون مفيدة - A B
^git branch -vv يعمل لدي... - notacouch


يوضح جيريمي بوس ماذا git remote show يعرض معلومات التعقب. يجب أن يكون ذلك كافيًا إذا كنت تريد فقط المعلومات للاستهلاك البشري.

إذا كنت تخطط لاستخدام المعلومات في سياق تلقائي (على سبيل المثال ، نص برمجي) ، يجب عليك استخدام المستوى الأدنى ("السباكة") git for-each-ref في حين أن.

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

ال git for-each-ref تعلمت %(upstream) رمز في بوابة 1.6.3. مع الإصدارات السابقة من Git ، سيكون عليك استخراج معلومات التتبع باستخدام git config branch.<name>.remote و git config branch.<name>.merge (ربما باستخدام git for-each-ref لبناء الأوامر لكل اسم فرع محلي).


52
2017-08-27 03:18



إجابتك الإجابات أكثر مقتضبة وأسهل في المتابعة ، حتى تحصل على التصويت لأعلى :) - CubanX
لجعله أقل اختصارًا ، ولكن قم بتوفير طريقة لطيفة للتحقق من أن الأسماء عن بُعد هي نفس أسماء الفروع المحلية ، مثل git gotcha العام: in bash git for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n' - hobs


بالنسبة لفرع معين ، يمكنك استخدامه git rev-parse مع ال @{u} أو @{upstream} لاحقة على اسم الفرع ، على سبيل المثال:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

... أو للنموذج المختصر ، أضف --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

يمكنك استخدام عموما branch@{upstream} بناء جملة أينما هو مطلوب التزام.


18
2018-05-01 09:18



+1 أعطاني إجابتي بالضبط ما أحتاجه: git rev-parse --symbolic-full-name HEAD ضد. git rev-parse --symbolic-full-name HEAD@{u}، شكر! - Tino


أنا استخدم البرنامج النصي قذيفة التالية (اسمه git-tracks) لإظهار الفرع البعيد الذي يتم تتبعه بواسطة الفرع الحالي:

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

هذا يمكن أيضا استخدام المذكورة git for-each-ref، لكنني وجدت الوصول المباشر إلى حد ما أبسط من تصفية الإخراج للفرع الحالي.


10
2018-01-21 14:26



قد تفكر في استخدام "set -e" في الجزء العلوي من البرنامج النصي. سيسمح لك ذلك بإزالة جميع مثيلات "| الخروج $؟" مع الحفاظ على نفس السلوك الفاشل المبكر. - John Whitley
JohnWhitley: شكرًا ، لقد قمت بتحرير إجابتي. وأنا أعلم عن set -e، ولكن عادة ما يتم الالتزام بالتحقق الصريح. لكن في هذه الحالة ، إنه أفضل حقا. - Ingo Karkat
لا يعمل بالنسبة لي git version 1.9.4. لا شيء echos :( - Ain


.git/config الملف أيضا سوف توفر معلومات فرع التتبع كما

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*

8
2017-10-11 12:59





git branch -vv

يبين بالضبط ما تطلبه. فإنه يعرض الفروع المحلية جنبا إلى جنب مع فرع عن بعد المقابلة التي تتبعها.


5
2018-05-07 07:50





إضافة هذه الرونية إلى [alias] مقطع من ملفك .gitconfig:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'

2
2018-03-07 16:48