Git merge reports “updated new-to-date” بالرغم من وجود اختلاف


Answers

يحدث ذلك غالبًا عندما أعرف أن هناك تغييرات على جهاز التحكم عن بعد ، لذا أحاول دمجها باستخدام git merge master . ومع ذلك ، لا يتم دمج هذا مع الرئيسي البعيد ، ولكن مع الرئيسي المحلي الخاص بك.

حتى قبل القيام بعملية الدمج ، سيد التدقيق ، ثم git pull هناك. ثم ستتمكن من دمج التغييرات الجديدة في الفرع الخاص بك.

Question

لدي مستودع git مع فرعين: سيد واختبار.

هناك فروق بين الفروع الرئيسية وفروع الاختبار.

كل الفروع لديها كل التغييرات التي ارتكبت.

إذا فعلت:

git checkout master
git diff test

تظهر شاشة مليئة بالتغييرات تظهر الاختلافات. أريد دمج التغييرات في فرع الاختبار وكذلك القيام بما يلي:

git merge test

لكن احصل على الرسالة "بالفعل محدثة"

ومع ذلك ، فإن فحص الملفات تحت كل فرع مختلف يظهر بوضوح الاختلافات.

ما المشكلة هنا وكيف يمكنني حلها؟




يكون الدمج دائمًا بين العنوان HEAD الحالي وواحد أو أكثر (عادةً ما يكون رأس الفرع أو العلامة) ،
ويجب أن يتطابق ملف الفهرس مع الشجرة التي يرتكبها HEAD (أي محتويات الالتزام الأخير) عندما تبدأ.
وبعبارة أخرى ، يجب أن يكون git diff --cached HEAD report no changes.

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

يجب أن يعني ذلك أن الدمج في الاختبار يتم دمجه بالفعل في الماجستير ، ولكن بما أن هناك إلتزامات أخرى يتم إجراؤها على الماجستير ، فإن git diff test سيعطي بعض الاختلافات.




حدث الشيء نفسه بالنسبة لي. لكن السيناريو كان مختلفًا بعض الشيء ، كان لديّ فرع رئيسي ، وأنا قمت بنقش الإصدار (say) منه. أجرت بعض التغييرات في الفرع version_1 ودمجتها في الأصل. ثم فعلت سه وعلى الخادم البعيد أنا مرة أخرى الخروج من release_1 باستخدام الأمر git الخروج -b release_1 - الذي يقوم في الواقع بحفر فرع جديد release_! من الرئيسي بدلا من التحقق من الفرع القائم بالفعل release_1 من الأصل. حل المشكلة عن طريق إزالة التبديل "-b"




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

مثال:

  1. يمكنك إنشاء الفرعين A و B قبالة الرئيسية
  2. يمكنك إجراء بعض التغييرات في الرئيسية ودمج هذه التغييرات فقط في الفرع B (لا يتم تحديث أو نسيان تحديث الفرع A).
  3. قمت بإجراء بعض التغييرات في الفرع A ودمج A إلى B.

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




يحدث هذا لأن النسخة المحلية من الفرع الذي تريد دمجه غير محدثة. لدي فرعي ، ودعا MyBranch وأريد دمجها في ProjectMaster .

_>git status
On branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

nothing to commit, working tree clean

_>git merge ProjectMaster
Already up-to-date.

لكني أعلم أن هناك تغييرات يجب دمجها!

إليك الشيء ، عندما أكتب git merge ProjectMaster ، تبحث git في نسختي المحلية من هذا الفرع ، والتي قد لا تكون حديثة . لمعرفة ما إذا كانت هذه هي الحالة ، أخبرت شركة Git أولاً أن تتحقق مما إذا كانت أفرعنا قديمة وتجري أية تغييرات إذا كان الأمر كذلك باستخدام ، uh ، fetch . ثم أقفز إلى الفرع الذي أريد دمجه ليرى ما يحدث هناك ...

_>git fetch origin

_>git checkout ProjectMaster
Switched to branch ProjectMaster
**Your branch is behind 'origin/ProjectMaster' by 85 commits, and can be fast-forwarded.**
  (use "git pull" to update your local branch)

آه ها! نسختي المحلية لا معنى لها من قبل 85 التزام ، وهذا يفسر كل شيء! الآن ، MyBranch ، ثم MyBranch إلى MyBranch وحاول الدمج مرة أخرى.

_>git pull
Updating 669f825..5b49912
Fast-forward

_>git checkout MyBranch-Issue2
Switched to branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

_>git merge ProjectMaster
Auto-merging Runbooks/File1.ps1
CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1

Automatic merge failed; fix conflicts and then commit the result.

والآن لدي مشكلة أخرى لإصلاح ...