ما هو الفرق بين إعادة تعيين Git -Hard و Git Reset -Merge
سؤال
في تجاربي لم أتمكن من العثور على أي فرق وظيفي بين
git reset --hard
و
git reset --merge
تعليمات الاستخدام لا تعطي أي تلميح أيضًا
--hard reset HEAD, index and working tree
--merge reset HEAD, index and working tree
أنا أستخدم بانتظام --hard
الخيار لذا فهم كيف يعمل ذلك. ما الفرق بين --merge
و ال --hard
والخيارات؟
هتافات ، أولي
ربما يساعد مثال هنا ، دعنا نستخدم التسلسل التالي:
cd git_repo
touch file_one
git add file_one
git commit -m "commit one" # sha1 of 123abc
echo "one" >> ./file_one
git commit -a -m "commit two" # sha1 of 234bcd
echo "two" >> ./file_one
git add . # populate index with a change
echo "three" >> ./file_one # populate working area with a change
الآن إذا حاولت
git reset --merge 123abc
انا حصلت
error: Entry 'file_one' not uptodate. Cannot merge.
fatal: Could not reset index file to revision '123abc'
والسبب هو أن File_one لديه تغييرات في كل من منطقة العمل والفهرس
لعلاج هذا أفعل
git add .
git reset --merge 123abc
هذه المرة تعمل ، ومع ذلك ، أحصل على نفس النتيجة git reset --hard
. الفهرس فارغ ، منطقة العمل فارغة ، File_one فارغ ، كما كان بعد الالتزام الأول.
هل يمكن لأي شخص أن يتوصل إلى الخطوات التي توضح الفرق؟
المحلول
--hard Matches the working tree and index to that of the tree being switched to. Any changes to tracked files in the working tree since <commit> are lost. --merge Resets the index to match the tree recorded by the named commit, and updates the files that are different between the named commit and the current commit in the working tree.
ال git reset --merge
من المفترض أن تكون نسخة أكثر أمانًا من git reset --hard
, ، عندما يتم خلط تغييراتك وتغييرات شخص آخر معًا ، في محاولة لإجراء تغييراتنا حولها.
نصائح أخرى
المقالة "git التراجع أو إعادة ضبط أو العودة؟"يلخص الاستخدامات المختلفة ، عند استخدامها مع ORIG_HEAD
:
# Reset the latest successful pull or merge
$ git reset --hard ORIG_HEAD
# Reset the latest pull or merge, into a dirty working tree
$ git reset --merge ORIG_HEAD
كما ذكر Manojlds'س إجابه, ، ويتضح من قبل مشاركة مدونة, ، هذا الأخير مفيد بشكل خاص عندما ترى رسالة خطأ مثل:
fatal: You have not concluded your merge. (`MERGE_HEAD` exists)
الخيط "التصحيح] يرفض الاندماج أثناء الدمج"تفاصيل هذه النقطة أيضًا:
git reset --merge HEAD
إنه يملأ الحالة المختلفة إلى حد ما حيث قمت بدمج نظيفة مع بعض التغييرات غير الملتزمة في قطار العمل ، ولكن بعد ذلك تريد تجاهل الدمج مرة أخرى دون فقدان التغييرات غير الملتزم.
في غياب التغييرات ، ستستخدم فقط--hard
, ، ولكن هنا تريد نقل نصيحة الفرع أثناء دمجها ، على غرار ما "git checkout -m
'هل للتحركHEAD
.
هذا مفيد عندما تقوم بتسحب التغييرات في شجرة العمل ، وتجد أن الدمج ليس كما هو متوقع (ربما كنت تتوقع أن تؤثر الالتزامات على الملفات التي كنت تعمل عليها). في هذه المرحلة ، إذا قمت بذلك git reset --hard ORIG_HEAD
, ، أنت تفجر كل شيء ، بما في ذلك التغييرات المحلية. اذا فعلت git reset --merge ORIG_HEAD
, ، ستحتفظ بتغييراتك المحلية.
على ما يبدو حسب:
http://www.kernel.org/pub/software/scm/git/docs/git-reset.html
--الصعب - يطابق شجرة العمل والفهرس مع الشجرة التي يتم تحويلها إلى. أي تغييرات على ملفات تتبع في شجرة العمل منذ ذلك الحين
<commit>
تضيع.--دمج - أعد ضبط الفهرس لمطابقة الشجرة المسجلة بواسطة الالتزام المسماة ، وتحديث الملفات التي تختلف بين الالتزام المسمى والالتزام الحالي في شجرة العمل.