new - git checkout




لماذا أحتاج إلى القيام `--set-upstream` طوال الوقت؟ (11)

أقوم بإنشاء فرع جديد في Git:

git branch my_branch

ادفعه:

git push origin my_branch

الآن نقول أن أحدهم أجرى بعض التغييرات على الخادم وأريد سحبه من origin/my_branch . أنا افعل:

git pull

لكنني أحصل على:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

تعلمت أنه يمكنني العمل مع:

git branch --set-upstream my_branch origin/my_branch

ولكن لماذا أحتاج إلى القيام بذلك لكل فرع أقوم بإنشائه؟ أليس من الواضح أنه إذا دفعت my_branch إلى origin/my_branch ، فحينئذ أود سحب origin/my_branch إلى my_branch ؟ كيف يمكنني جعل هذا السلوك الافتراضي؟


أنا نوع من إعادة اكتشفت legit بسبب هذه المشكلة (OS X فقط). الآن كل ما أستخدمه عند التفرع هو هذين الأمرين:

legit publish [<branch>] ينشر الفرع المحدد إلى جهاز التحكم عن بعد. (الاسم المستعار: pub )

legit unpublish <branch> يزيل الفرع المحدد من جهاز التحكم عن بعد. (الاسم المستعار: غير unp )

يأتي SublimeGit مع دعم legit بشكل افتراضي ، مما يجعل روتين التفرّع الكامل سهل مثل الضغط على Ctrl-b.


الاختصار ، الذي لا يعتمد على تذكر بناء الجملة في git branch --set-upstream 1 هو:

git push -u origin my_branch

... في المرة الأولى التي تدفع هذا الفرع. تحتاج فقط إلى القيام بذلك مرة واحدة ، والتي تحدد الارتباط بين الفرع الخاص بك git branch --set-upstream في origin بنفس الطريقة مثل git branch --set-upstream does.

أنا شخصياً أعتقد أنه من الجيد أن ننشئ هذا الارتباط بين فرعك والآخر على جهاز التحكم عن بُعد بشكل صريح. من المخجل أن تكون القواعد مختلفة بالنسبة إلى git push و git pull .

1 قد يبدو الأمر سخيفًا ، لكنني كثيرا ما ننسى تحديد الفرع الحالي ، بافتراض أن هذا هو الوضع الافتراضي - إنه ليس كذلك ، والنتائج هي الأكثر إرباكًا :)

التحديث 2012-10-11 : يبدو أنني لست الشخص الوحيد الذي وجد أنه من السهل أن تحصل على خطأ! بفضل VonC للإشارة إلى أن git 1.8.0 يقدم git branch --set-upstream-to أكثر وضوحًا ، حيث يمكن استخدامه على النحو التالي ، إذا كنت على الفرع my_branch :

git branch --set-upstream-to origin/my_branch

... أو بالخيار القصير:

git branch -u origin/my_branch

تم وصف هذا التغيير ، ومنطقه ، في ملاحظات الإصدار لـ git 1.8.0 ، وإصدار المرشح 1 :

كان من المغري قول git branch --set-upstream origin/master ، لكن ذلك يخبر Git لترتيب فرع origin/master فرع الفرع المحلي للتكامل مع الفرع الذي تم سحبه حاليا ، وهو أمر غير محتمل إلى حد كبير ما قصده المستخدم. الخيار متوقف استخدم --set-upstream-to (مع خيار short-and -u ) الجديد بدلاً من ذلك.


لأن git لديه القدرة الرائعة على دفع / سحب فروع مختلفة إلى مستودعات مختلفة "المنبع". يمكنك حتى استخدام مستودعات منفصلة للدفع والسحب - على نفس الفرع. يمكن أن يؤدي ذلك إلى إنشاء تدفق موزّع متعدد المستويات ، ويمكنني أن أرى أنه مفيد في مشروع مثل نواة لينكس. بنيت Git في الأصل لاستخدامها في هذا المشروع.

نتيجة لذلك ، فإنه لا يجعل الافتراض حول أي فرع يجب أن يكون تتبع فرعك.

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

Git عموما منخفضة المستوى ويمكن أن يكون محبط. ومع ذلك ، فهناك واجهات GUI ويجب أن يكون من السهل كتابة البرامج النصية المساعدة إذا كنت لا تزال ترغب في استخدامها من القشرة.


لما يستحق ، إذا كنت تحاول تتبع فرع موجود بالفعل على جهاز التحكم عن بعد (على سبيل المثال ، المنشأ / somebranch) ولكنك لم تقم بفحصه محليًا حتى الآن ، فيمكنك القيام بما يلي:

$ git checkout --track origin/somebranch

ملاحظة: "-t" هي النسخة المختصرة من خيار "--track".

هذا يضع نفس الجمعية الحق قبالة الخفافيش.


هذا هو الاستخدام الأكثر شيوعًا لـ The Fuck .

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

أيضًا ، من الممتع كتابة الكلمات البذيئة في جهازك.


يمكنك أيضا أن تخبر بصراحة ما سحب سحب الفرع البعيد لسحب (كما يذكر في رسالة الخطأ):

git pull <remote-name> <remote-branch>

لكن كن حذرًا في هذا: إذا كنت على فرع مختلف وقمت بعمل سحب صريح ، فسيتم دمج refspec التي قمت بسحبها في الفرع الذي تتواجد فيه!


يمكنك إعداد اسم مستعار جيد بالفعل يمكنه التعامل مع هذا بدون بناء الجملة المفرط.

لدي الاسم المستعار التالي في ~/.gitconfig :

po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\""

بعد ارتكابك لفرع جديد ، يمكنك دفع فرعك الجديد ببساطة عن طريق كتابة الأمر:

git po

يمكنك استخدام:

git config --global branch.autosetupmerge always

التي ستربط فرع المنبع كلما قمت بإنشاء أو الخروج من فرع جديد.

انظر https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

يعمل هذا أيضًا مع autosetuprebase ، إذا قمت باتباع سير عمل أكثر تركيزاً على rebase ، ولكن لا تستخدم هذا إلا إذا كنت تعرف ما تفعله ، حيث أنه سيعمل على تغيير سلوك السحب الخاص بك إلى rebase ، مما قد يؤدي إلى نتائج غريبة.


يمكنك تعيين المنبع أبسط بطريقتين. أولاً عند إنشاء الفرع:

git branch -u origin/my-branch

أو بعد إنشاء فرع ، يمكنك استخدام هذا الأمر.

git push -u origin/my-branch

يمكنك أيضًا التفرع والتحقق من الأمر وتعيين المنبع في أمر واحد:

git checkout -b my-branch -t origin/my-branch

أفضلي الشخصي هو القيام بذلك في أمر مؤلف من خطوتين:

git checkout -b my-branch
git push -u origin/my-branch

يمكنك جعل هذا يحدث بأقل الكتابة. أولاً ، قم بتغيير طريقة عمل الدفع الخاص بك:

git config --global push.default current

سيؤدي ذلك إلى استنتاج جزء origin my_branch ، وبذلك يمكنك القيام بما يلي:

git push -u

والتي ستقوم بإنشاء الفرع البعيد بنفس الاسم وتتبعه.


git branch --set-upstream-to=origin/master<branch_name>




git-branch