كيف تجد ما إذا كان الفرع هو فرع تم تتبعه محليًا أو فرعًا محليًا تم إنشاؤه؟
-
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