كيف أقوم بدفع الالتزام المعدل إلى مستودع Git البعيد؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

عندما عملت قليلاً مع كود المصدر الخاص بي، قمت بتنفيذ الشيء المعتاد ثم قمت بالدفع إلى مستودع بعيد.ولكن بعد ذلك لاحظت أنني نسيت تنظيم وارداتي في الكود المصدري.لذلك أقوم بأمر التعديل لاستبدال الالتزام السابق:

> git commit --amend

لسوء الحظ، لا يمكن إرجاع الالتزام إلى المستودع.يتم رفضه على النحو التالي:

> git push origin
To //my.remote.repo.com/stuff.git/
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'

ماذا علي أن أفعل؟(يمكنني الوصول إلى المستودع البعيد.)

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

المحلول

في الواقع دفعت مرة واحدة مع --force و .git مستودع وتم توبيخه من قبل لينوس لحظة عظيمة.بشكل عام، هذا سيخلق الكثير من المشاكل للآخرين.الجواب البسيط هو "لا تفعل ذلك".

أرى أن الآخرين أعطوا الوصفة للقيام بذلك على أي حال، لذلك لن أكررهم هنا.ولكن هنا نصيحة للتعافي من الوضع بعد لقد قمت بدفع الالتزام المعدل باستخدام --force (أو +master).

  1. يستخدم git reflog للعثور على الالتزام القديم الذي قمت بتعديله (اتصل به old, ، وسنستدعي الالتزام الجديد الذي أنشأته عن طريق التعديل new).
  2. إنشاء دمج بين old و new, ، تسجيل شجرة new, ، يحب git checkout new && git merge -s ours old.
  3. دمج ذلك مع سيدك git merge master
  4. قم بتحديث سيدك بالنتيجة مع git push . HEAD:master
  5. ادفع النتيجة للخارج.

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

نصائح أخرى

وأنت ترى ميزة السلامة جيت. بوابة ترفض تحديث فرع عن بعد مع الفرع الخاص بك، وذلك لأن رئيس فرع الخاص بك ارتكاب ليس سليل مباشر من الرئيس الحالي يرتكب من الفرع الذي كنت تدفع ل.

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

إذا كنت تعرف أنك الشخص الوحيد الذي دفع وتريد دفع معدلة ارتكاب أو دفع ارتكاب تلك الرياح العودة الفرع، يمكنك 'القوة' جيت لتحديث فرع عن بعد باستخدام مفتاح -f.

git push -f origin master

وحتى هذا قد لا تعمل كما يسمح بوابة مستودعات النائية في رفض غير fastforward-يدفع في النهاية البعيدة باستخدام التكوين receive.denynonfastforwards متغير. إذا كان هذا هو الحال فإن سبب الرفض تبدو هذه (لاحظ "رفض جهاز التحكم عن بعد" جزء):

 ! [remote rejected] master -> master (non-fast forward)

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

git push origin :master
git push origin master

في عام المعلمة الأخيرة إلى git push تستخدم <local_ref>:<remote_ref> الشكل، حيث local_ref هو اسم الفرع على مستودع المحلي وremote_ref هو اسم الفرع على مستودع بعيد. يستخدم هذا الزوج قيادة اثنين الإختزالات. :master ديه local_ref باطلة مما يعني دفع فرع لاغيا إلى master الجانب البعيد، أي حذف فرع بعيد. اسم الفرع مع عدم وجود : يعني دفع الفرع المحلي مع الاسم الذي يطلق على فرع البعيد الذي يحمل نفس الاسم. master في هذه الحالة هو اختصار لmaster:master.

وخرف سريع: حقيقة أن أحدا لم تنشر الجواب بسيط هنا يدل على اليأس المستخدم العداء التي أظهرتها بوابة CLI

.

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

وبمجرد الانتهاء من حل أي نزاعات، يمكنك دفع مرة أخرى.

وهكذا:

git pull

إذا تحصل أخطاء في السحب، ربما هناك شيئا خطأ في تكوين مستودع المحلي (كان المرجع الخطأ في قسم الفرع. بوابة / التكوين).

وبعد

git push

وربما ستحصل على مبلغ إضافي ارتكاب مع هذا الموضوع يقول عن "دمج تافهة".

والجواب باختصار: لا تدفع يرتكب تعديله لالريبو العام

والجواب الطويل: هناك عدد قليل من الأوامر جيت، مثل git commit --amend وgit rebase، في الواقع إعادة كتابة تاريخ الرسم البياني. هذا على ما يرام طالما أنك لم تنشر التغييرات، ولكن بمجرد القيام به، كنت حقا لا ينبغي أن التلويث حولها مع التاريخ، لأنه إذا ما حصل بالفعل التغييرات، ثم عندما يحاولون سحب مرة أخرى، فإنه قد تفشل . بدلا من تعديل على ارتكابها، ويجب عليك ان تجعل مجرد ارتكاب جديدة مع التغييرات.

ولكن، إذا كنت حقا، حقا تريد دفع معدلة ارتكابها، ويمكنك القيام بذلك من هذا القبيل:

$ git push origin +master:master

وعلامة + الرائدة سيجبر الضغط ويحدث، حتى لو كان لا يؤدي إلى "سريع إلى الأمام" الالتزام. (A-سريع إلى الأمام ارتكاب يحدث عندما يتغير كنت تدفع هي <م> أحفاد من التغييرات بالفعل في إعادة الشراء العام).

إليك طريقة بسيطة جدًا ونظيفة لدفع التغييرات بعد إجراء التغييرات بالفعل commit --amend:

git reset --soft HEAD^
git stash
git push -f origin master
git stash pop
git commit -a
git push origin master

والذي يقوم بما يلي:

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

تذكر تغيير "الأصل" و"الرئيسي" في حالة تطبيق ذلك على فرع أو جهاز تحكم عن بعد مختلف.

ولقد حلها عن طريق تجاهل بلدي المعدل المحلي ارتكاب وإضافة التغييرات الجديدة على رأس:

# Rewind to commit before conflicting
git reset --soft HEAD~1

# Pull the remote version
git pull

# Add the new commit on top
git add ...
git commit
git push

كان لي نفس المشكلة.

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

باعتباري مبتدئًا في Git، اعتقدت أنه مكتمل فوبار.

حل:إلى حد ما مثل @bara الذي اقترحه + إنشاء فرع نسخ احتياطي محلي

# Rewind to commit just before the pushed-and-amended one.
# Replace <hash> with the needed hash.
# --soft means: leave all the changes there, so nothing is lost.
git reset --soft <hash>

# Create new branch, just for a backup, still having all changes in it.
# The branch was feature/1234, new one - feature/1234-gone-bad
git checkout -b feature/1234-gone-bad

# Commit all the changes (all the mess) not to lose it & not to carry around
git commit -a -m "feature/1234 backup"

# Switch back to the original branch
git checkout feature/1234

# Pull the from remote (named 'origin'), thus 'repairing' our main problem
git pull origin/feature/1234

# Now you have a clean-and-non-diverged branch and a backup of the local changes.
# Check the needed files from the backup branch
git checkout feature/1234-gone-bad -- the/path/to/file.php

ربما لم يكن هذا حلاً سريعًا ونظيفًا، وقد فقدت سجلي (التزام واحد بدلاً من 5)، لكنه وفر عملاً ليوم واحد.

إذا لم تقم بدفع الكود إلى فرعك البعيد (GitHub/Bitbucket)، فيمكنك تغيير رسالة الالتزام في سطر الأوامر على النحو التالي.

 git commit --amend -m "Your new message"

إذا كنت تعمل في فرع معين، قم بما يلي:

git commit --amend -m "BRANCH-NAME: new message"

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

يرجى قراءة الإجابة كاملة قبل القيام بذلك

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

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

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

هذه هي أفضل ممارسة عند تغيير رسالة الالتزام، إذا تم دفعها بالفعل.

إذا كنت تعرف أحدا قد سحبت الخاص بك المعدل الامم المتحدة ارتكابها، واستخدام الخيار --force-with-lease من git push.

في تورتويز جت، يمكنك أن تفعل الشيء نفسه تحت عنوان "دفع ..." خيارات "القوة: قد تجاهل". وتدقيق "التغييرات المعروفة"

<اقتباس فقرة>   

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

وهنا هو طريقة بسيطة جدا ونظيفة لدفع التغييرات بعد أن كنت قد قدمت بالفعل git add "your files" وgit commit --amend:

git push origin master -f

وأو:

git push origin master --force

وأنت الحصول على هذا الخطأ لأن جهاز التحكم عن بعد بوابة لديها بالفعل هذه ارتكاب الملفات. لديك لإجبار دفع فرع لهذا العمل:

git push -f origin branch_name

وأيضا تأكد من سحب رمز من بعيد كما شخص آخر في فريقك قد دفعت إلى نفس الفرع.

git pull origin branch_name

وهذا هو واحد من الحالات حيث لدينا لإجبار دفع الالتزام عن بعد.

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

لقد واصلت فعل ما طلب مني جيت أن أفعله.لذا:

  • لا يمكن الدفع بسبب الالتزام المعدل.
  • أقوم بالسحب كما هو مقترح.
  • فشل الدمج.لذلك أقوم بإصلاحه يدويًا.
  • إنشاء التزام جديد (المسمى "دمج") ودفعه.
  • يبدو أن العمل!

ملحوظة:وكان الالتزام المعدل هو الأحدث.

هنا، كيف أصلحت تعديلًا في التزام سابق:

  1. احفظ عملك حتى الآن.
  2. قم بتخزين تغييراتك بعيدًا في الوقت الحالي إذا تم إجراؤها: git stash الآن أصبحت نسخة العمل الخاصة بك نظيفة في حالة التزامك الأخير.
  3. قم بإجراء التعديلات والإصلاحات.
  4. ارتكاب التغييرات في "يعدل" وضع: git commit --all --amend
  5. سيظهر المحرر الخاص بك ويطلب منك رسالة السجل (افتراضيًا، رسالة السجل القديمة).احفظ المحرر وقم بإنهائه عندما تكون راضيًا عنه.

    تتم إضافة التغييرات الجديدة إلى الالتزام القديم.شاهد بنفسك مع git log و git diff HEAD^

  6. أعد تطبيق التغييرات المخزنة، إذا تم إجراؤها: git stash apply

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top