ما هو الفرق بين إعادة تعيين Git -Hard و Git Reset -Merge

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

  •  06-07-2019
  •  | 
  •  

سؤال

في تجاربي لم أتمكن من العثور على أي فرق وظيفي بين

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 فارغ ، كما كان بعد الالتزام الأول.

هل يمكن لأي شخص أن يتوصل إلى الخطوات التي توضح الفرق؟

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

المحلول

من GIT إعادة تعيين manpage:

--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> تضيع.

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

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