كيف تجد ما إذا كان الفرع هو فرع تم تتبعه محليًا أو فرعًا محليًا تم إنشاؤه؟

StackOverflow https://stackoverflow.com/questions/2887242

  •  04-10-2019
  •  | 
  •  

سؤال

لديّ فرع تتبع عن بُعد تم تتبعه محليًا في مستودعتي المحلية باستخدام "GIT Branch -B-Branch-Name Origin/Branch-Name". فرعي البعيد هو Test2/Test2 (Origin/Branch-Name) والذي يتم تتبعه محليًا كاختبار 2.

الأصل يسمى أيضا Test2. لم أتحقق من اختبار فرع التتبع المحلي الخاص بي.

عندما أفعل "Git Pull Origin Origin الفرع عن بُعد: الفرع المحلي" ، أحصل على هذا الخطأ

Test2] $ git سحب test2 test2: test2 من/gitvobs/git_bare/test2! [مرفوض] Test2 -> Test2 (غير سريع للأمام)

بينما عندما أقوم بتغلب على اختبار فرع التتبع المحلي الخاص بي وسحب "Git Pull Origin Original-Tracked-Branch" لا أحصل على الخطأ وأقوم بسحب باستخدام "Git Pull Test2 Test2"

من/gitvobs/git_bare/test2 * test2 -> فشل دمج A.TXT التلقائي A.TXT A.TXT ؛ إصلاح النزاعات ثم ارتكب النتيجة.

أعلم أن إضافة A + (GIT سحب Test2 + Test2: Test2) سيساعد ولكنه يكتب التغييرات المحلية.

فكيف أعرف أيًا من فروعي المحلية التي تم إنشاؤها من قبلي محليًا باستخدام "Git Branch New-Name" أو تتبع محليًا من الفروع البعيدة باستخدام GIT Branch-Branch-Name Origin/Branch-Name "؟

هل كانت مفيدة؟

المحلول

بشكل مستقل عن قائمة تتبع المتفرعة (والتي يمكنك رؤيتها مع git config -l)، أ "non-fast-forward" رسالة لا يمكن أن تندمج الفرع البعيد (أي النسخة المحلية من الالتزام بالفرع البعيد) في فرعك لأنه:

  • فرعك لديه ارتباطات خاصة به
  • الفرع البعيد له ارتباط جديد منذ آخر سحب

لذا:

  --last pull
  |
  v
x-x-x-x-x <--test2
  \
   -y-y-y <-- test2/test2

في حين أن هذا كان سيكون دمجًا سريعًا

  --last pull
  |
  v
x-x <--test2
  \
   -y-y-y <-- test2/test2

لذا:

git checkout test2
git fetch test2 test2 
git merge test2/test2
#fix conflicts
git commit

ورجاء ، هل اتصل بإعادة الريبو عن بُعد أي اسم آخر غير Test2. هذا هو الكثير من Test2 هنا ؛)


الآن للحصول على قائمة الفروع عن بُعد التي تم تتبعها في ريبو المحلي:

git config --get-regexp branch..*

نصائح أخرى

سحب git ارتباك

مفرط

لك سحب git يتضمن الأمر الكثير من المعلومات.

Test2] $ git سحب test2 test2: Test2
من/gitvobs/git_bare/test2
! [مرفوض] Test2 -> Test2 (غير سريع للأمام)

أعلم أن إضافة A + (GIT سحب Test2 + Test2: Test2) سيساعد ولكنه يكتب التغييرات المحلية.

هذا ما يعنيه أمرك:

#             *------------ (1) remote repository name
#            /     *------- (2) ref in remote repository
#           /     /     *-- (3) ref in  local repository
#          /     /     /
git pull test2 test2:test2

# Means this: From remote repository `test2` (1),
# fetch branch `test2` (2), store it in local branch `test2` (3), then
# merge the fetched history into HEAD.

أنت تقول سحب git للكتابة المحلية الخاصة بك test2 الفرع مع كل ما يمتلكه عن بعد test2 فرع ثم دمج ذلك بالرأس. ربما لا ترغب في تضمين جزء الوجهة من REFSPEC ( :test2).


إذا تم تكوين الفرع المحلي الذي قمت بفحصه لتتبع شيء ما (انظر "الفروع: ..." أدناه) ، فقط افعل

git pull

إذا كنت بحاجة إلى توفير (أو تجاوز) جهاز التحكم عن بُعد ومستودع ، فما عليك سوى توفير الاسم/عنوان URL عن بُعد والفرع المحلي على جهاز التحكم عن بُعد (اترك الجزء الأخير من المرجع):

git pull test2 test2

اسحب إلى فرع لم يتم فحصه

سحب git هو (كما ذكر أعلاه) مزيج من جلب git و دمج git (أو جيت ريباس).

بشكل عام ، قد ينطوي الدمج على حل الصراع. يتطلب حل الصراع شجرة عمل. لذلك ، لا يمكن إجراء عملية دمج طبيعية بدون شجرة عاملة. هذا يعني أن رأسك الحالي يجب أن يكون واحدًا من آباء الاندماج (سيكون الوالد الأول). يحتاج Rebase أيضًا إلى شجرة عاملة لحل الصراع.

نظرًا لأن السحب يتضمن دمجًا أو Rebase ، فليس من الممكن سحب فرع محلي لم يتم فحصه. يمكنك فقط السحب إلى الفرع الذي تم فحصه حاليًا.

الفروع: محلية ، تتبع ، تتبع عن بُعد

الأنواع المختلفة من فروع GIT هي نفس الكائن الأساسي: الحكام. الحكام يعيشون في refs/ مساحة الاسم في $GIT_DIR/refs/ و $GIT_DIR/packed-refs.

  • فروع "المحلية" تعيش في refs/heads/ مساحة الاسم.
    • لفحص test2 المرجع الفرع المحلي:
      • git show-ref refs/heads/test2, ، أو
        • cat .git/refs/heads/test2, ، أو
        • grep -F refs/heads/test2 .git/packed-refs
  • فروع "التتبع عن بُعد" تعيش في refs/remotes/<remote-name>/ مساحات الأسماء.
    • فروع التتبع عن بُعد هي نسخ محلية من الفروع من مستودع بعيد.
      • اسم "التتبع عن بُعد" منطقي عندما تفكر في الأمر على هذا النحو --track وظيفة فرع git و Git Checkout (انظر نوع الفرع النهائي).
    • لفحص test2 فرع التتبع عن بُعد المرجع:
      • git show-ref refs/remotes/test2/test2, ، أو
        • cat .git/refs/remotes/test2/test2, ، أو
        • grep -F refs/remotes/test2/test2 .git/packed-refs
  • الفروع المحلية التي تتعقب فرع آخر هي فروع محلية طبيعية (في refs/heads/) التي لها تكوين إضافي في $GIT_DIR/config:

    [branch "test2"]
            remote = test2
            merge = refs/heads/test2
    

    من المهم أن نلاحظ أن merge (أو rebase) أسماء خيار التكوين أ المرجع على جهاز التحكم عن بُعد. لذا refs/heads/test2 هنا يعني الفرع المحلي test2 وجدت على جهاز التحكم عن بعد test2. الاسم البعيد الخاص . يمكن استخدامها للإشارة إلى الفروع المحلية في المستودع المحلي.

    • الغرض من الفروع المحلية التي "تتبع" بعض الفروع الأخرى هو تسهيل الكتابة فقط git pull ودمجها في (أو Rebase فوق) التاريخ في بعض الفروع الأخرى.

قلت إنك تريد التمييز بين الفروع المحلية العادية عن الفروع المحلية التي تتبع بعض الفروع الأخرى. يمكنك القيام بذلك من خلال البحث عن تكوين الفرع في $GIT_DIR/config ملف.

قد تستخدم GIT التكوين لفعل هذا:

branch_tracks_something() {
    {
        git config branch."$1".merge ||
        git config branch."$1".rebase
    } >/dev/null 2>&1
}
# test local branch 
branch_tracks_something test2 && echo 'test2 tracks something' || echo 'test2 does not track anything'

أو ، إذا كان لديك Git 1.6.3 أو لاحقًا ، يمكنك استخدام %(upstream) شكل git for-each-ref:

{ echo 'show_ref_desc() {
    case "$1" in
        refs/heads/*)
            t=''
            test -n "$2" && t=" (tracks $2)"
            echo "local: $1$t"
        ;;
        refs/remotes/*)
           echo "remote tracking: $1"
        ;;
        *)
            echo "other: $1"
        ;;
    esac
}'; git for-each-ref --shell --format='show_ref_desc %(refname) %(upstream)'; } |
sh

يبدو الناتج مثل هذا:

local: refs/heads/test2 (tracks refs/remotes/test2/test2)
remote tracking: refs/remotes/test2/HEAD
remote tracking: refs/remotes/test2/test2
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top