commands - git pull origin master




كيف أجبر "git pull" على الكتابة فوق الملفات المحلية؟ (20)

هام: إذا كان لديك أي تغييرات محلية ، فسيتم فقدها. مع أو بدون --hard خيار --hard ، سيتم فقدان أي تعهدات محلية لم يتم دفعها. [*]

إذا كان لديك أي ملفات لا يتم تتبعها بواسطة Git (مثل محتوى المستخدم الذي تم تحميله) ، فلن تتأثر هذه الملفات.

أعتقد أن هذا هو الطريق الصحيح:

git fetch --all

ثم لديك خياران:

git reset --hard origin/master

أو إذا كنت في فرع آخر:

git reset --hard origin/<branch_name>

تفسير:

git fetch download the latest from remote without try to merge or rebase anything.

ثم يعيد git reset تعيين الفرع الرئيسي إلى ما جلبته للتو. يقوم الخيار --hard بتغيير كل الملفات في شجرة العمل الخاصة بك لمطابقة الملفات في origin/master

الحفاظ على الالتزام المحلي الحالي

[*] : تجدر الإشارة إلى أنه من الممكن الحفاظ على الالتزام المحلي الحالي عن طريق إنشاء فرع من الصفحة master قبل إعادة التعيين:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

بعد ذلك ، سيتم الاحتفاظ بجميع الإلتزامات القديمة في الالتزامات new-branch-to-save-current-commits .

تغييرات غير ملتزم بها

سيتم فقدان التغييرات غير ملتزم بها ، (حتى تم تقسيمها). تأكد من خبأ وارتكاب أي شيء تحتاجه. لذلك يمكنك تشغيل ما يلي:

git stash

ثم إعادة تطبيق هذه التغييرات غير ملتزم بها:

git stash pop

كيف أقوم بإجبار الكتابة فوق الملفات المحلية على git pull ؟

السيناريو هو التالي:

  • يقوم أحد أعضاء الفريق بتعديل القوالب لموقع الويب الذي نعمل عليه
  • انهم يضيفون بعض الصور إلى دليل الصور (ولكن ينسى إضافتها تحت التحكم بالمصادر)
  • انهم يرسلون الصور عن طريق البريد ، في وقت لاحق ، بالنسبة لي
  • أقوم بإضافة الصور تحت التحكم في المصدر ودفعها إلى GitHub مع تغييرات أخرى
  • لا يمكنهم سحب التحديثات من GitHub لأن Git لا يريدون الكتابة فوق ملفاتهم.

هذا هو الخطأ الذي أحصل عليه:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

كيف أجبر Git للكتابة فوقهم؟ الشخص هو مصمم - عادةً أقوم بحل جميع التعارضات يدويًا ، بحيث يكون لدى الخادم أحدث إصدار يحتاج فقط إلى تحديثه على جهاز الكمبيوتر الخاص به.


علاوة:

عند التحدث عن السحب / الجلب / الدمج في الإجابات السابقة ، أود مشاركة حيلة ممتعة ومثمرة ،

git pull --rebase

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

قبل دفع الالتزام الخاص بك إلى الخادم حديثًا ، جرِّب هذا الأمر وسيقوم تلقائيًا بمزامنة أحدث تغييرات الخادم (مع الجلب + الدمج) وسوف يضع التزامك في الأعلى في سجل جيت. ليست هناك حاجة للقلق بشأن السحب اليدوي / الدمج.

العثور على تفاصيل في ماذا "سحب بوابة --rebase" تفعل؟ .


أعتقد أن هناك سببين محتملين للصراع ، يجب حلهما بشكل منفصل ، وبقدر ما أستطيع أن أقول أنه لا توجد أي من الإجابات المذكورة أعلاه تتناول كلا من:

  • يجب حذف الملفات المحلية التي لم يتم تعقبها ، إما يدويًا (أكثر أمنًا) أو كما هو مقترح في إجابات أخرى ، بواسطة git clean -f -d

  • يجب حذف التراخيص المحلية غير الموجودة في الفرع البعيد أيضًا. IMO أسهل طريقة لتحقيق ذلك هي: git reset --hard origin/master (استبدل 'master' بأي فرع تعمل فيه ، وقم بتشغيل git fetch origin أولاً)


أعرف طريقة أسهل وأقل إيلاما:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

هذا هو!


إعادة تعيين الفهرس والرأس إلى origin/master ، ولكن لا تقم بإعادة تعيين شجرة العمل:

git reset origin/master

الشيء الوحيد الذي كان يعمل بالنسبة لي هو:

git reset --hard HEAD~5

هذا سوف يأخذك مرة أخرى خمس تلتزم ثم مع

git pull

لقد وجدت ذلك من خلال البحث عن كيفية التراجع عن دمج Git .


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

هنا الحل الأنظف الذي نستخدمه:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • يجلب الأمر الأول أحدث البيانات.

  • يتحقق الأمر الثاني من وجود أي ملفات يتم إضافتها إلى المستودع ويقوم بحذف تلك الملفات غير القابلة للتتبع من المخزون المحلي الذي قد يتسبب في حدوث تعارضات.

  • يقوم الأمر الثالث بالتحقق من جميع الملفات التي تم تعديلها محليًا.

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


بدلا من القيام:

git fetch --all
git reset --hard origin/master

أنصحك بما يلي:

git fetch origin master
git reset --hard origin/master

لا حاجة لجلب جميع أجهزة التحكم عن بعد والفروع إذا كنت ترغب في إعادة تعيين إلى فرع الأصل / الرئيسي الصحيح؟


جرب هذا:

git reset --hard HEAD
git pull

يجب أن تفعل ما تريد.


على الرغم من السؤال الأصلي ، يمكن أن تتسبب أعلى الإجابات في حدوث مشكلات للأشخاص الذين لديهم مشكلة مماثلة ، ولكن لا يريدون فقد ملفاتهم المحلية. على سبيل المثال ، راجع تعليقات Al-Punk و crizCraig.

تلزم النسخة التالية التغييرات المحلية الخاصة بك إلى فرع مؤقت ( tmp ) ، تحقق من الفرع الأصلي (الذي أفترض أنه master ) ودمج التحديثات. يمكنك فعل ذلك باستخدام stash ، ولكنني وجدت أنه من الأسهل عادةً استخدام نهج فرع / دمج.

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch origin master
git merge -s recursive -X theirs origin master

حيث نفترض أن المستودع الآخر هو origin master .


قد تجد أن هذا الأمر مفيد في التخلص من التغييرات المحلية:

git checkout <your-branch> -f

ثم قم بتنظيف (إزالة الملفات غير المتقطعة من شجرة العمل):

git clean -f

إذا كنت ترغب في إزالة الدلائل غير القابلة للتتبع بالإضافة إلى الملفات التي لم يتم تتبعها:

git clean -fd

قرأت جميع الإجابات لكنني كنت أبحث عن أمر واحد للقيام بذلك. هذا ما فعلته. وأضاف اسم مستعار gitconfig

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

قم بتشغيل الأمر الخاص بك

git fp origin master

أي ما يعادل

git fetch origin master
git reset --hard origin/master

كان لي نفس المشكلة ولسبب ما ، حتى git clean -f -d لن تفعل ذلك. هذا هو السبب: لسبب ما ، إذا تم تجاهل ملفك بواسطة Git (عبر إدخال .gitignore ، أفترض) ، فإنه لا يزال يزعج حول الكتابة فوق ذلك بسحب لاحق ، لكن التنظيف لن يزيله ، إلا إذا قمت بإضافة -x .


كان لي نفس المشكلة. لم يعطيني أحد هذا الحل ، لكنه عمل بالنسبة لي.

أنا حلها من قبل:

  1. حذف جميع الملفات. اترك فقط دليل .git.
  2. git reset --hard HEAD
  3. git pull
  4. git push

الآن يعمل.


لقد حلت هذا بنفسي من خلال:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

حيث يعطي الأمر الأخير قائمة بما كانت عليه تغييراتك المحلية. استمر في تعديل فرع "tmp" حتى يتم قبوله ثم أعد الدمج مرة أخرى إلى الرئيسية باستخدام:

git checkout master && git merge tmp

في المرة القادمة ، يمكنك التعامل مع هذا بطريقة أنظف من خلال البحث عن "git stash branch" على الرغم من أن المخبأ من المحتمل أن يتسبب لك في مشاكل في المحاولات القليلة الأولى ، لذلك قم بإجراء أول تجربة على مشروع غير حرج ...


لقد لخصت إجابات أخرى. يمكنك تنفيذ git pull دون أخطاء:

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

تحذير : هذا البرنامج النصي قوي جدًا ، لذا قد تفقد تغييراتك.


هذه الأوامر الأربعة تعمل بالنسبة لي.

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

للتحقق / السحب بعد تنفيذ هذه الأوامر

git pull origin master

حاولت الكثير ولكن في النهاية حصلت على النجاح مع هذه الأوامر.


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

في ذهنك هذا ، قمت بتحديث برنامج Kustudic النصي للقيام بذلك. أنا أيضا إصلاح الخطأ المطبعي (مفقود في النص الأصلي).

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull

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

استنادًا إلى مزيج من جواب الـ RNA وإجابة torek لسؤال مشابه ، لقد توصلت إلى هذا الأمر الذي يعمل بشكل رائع:

git fetch
git reset --hard @{u}

قم بتشغيل هذا من فرع وستقوم فقط بإعادة تعيين الفرع المحلي الخاص بك إلى إصدار upstream.

هذا يمكن وضعه بشكل جيد في اسم مستعار git forcepull ( git forcepull ) كذلك:

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

أو ، في ملف .gitconfig الخاص بك:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

استمتع!


تحذير ، يؤدي القيام بذلك إلى حذف ملفاتك نهائيًا إذا كان لديك أي إدخالات للدليل / * في ملف gitignore الخاص بك.

بعض الإجابات تبدو سيئة. رهيبة بمعنى ما حدث لـLauri باتباع اقتراح David Avsajanishvili.

بدلا من ذلك (git> v1.7.6):

git stash --include-untracked
git pull

في وقت لاحق يمكنك تنظيف تاريخ المخبأ.

يدويًا واحدًا تلو الآخر:

$ git stash list
[email protected]{0}: WIP on <branch>: ...
[email protected]{1}: WIP on <branch>: ...

$ git stash drop [email protected]{0}
$ git stash drop [email protected]{1}

بوحشية ، في كل مرة:

$ git stash clear

بالطبع إذا كنت ترغب في العودة إلى ما خبأته:

$ git stash list
...
$ git stash apply [email protected]{5}




git-fetch