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


Answers

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

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

Question

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

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

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

إذا فعلت:

git checkout master
git diff test

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

git merge test

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

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

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




يحدث هذا لأن النسخة المحلية من الفرع الذي تريد دمجه غير محدثة. لدي فرعي ، ودعا 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.

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




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




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

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

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




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

مثال:

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

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