ماهو - إعادة تعيين أو إعادة ملف معين إلى مراجعة محددة باستخدام Git؟




ماهو git (20)

الأسماء المستعارة git-awk و shell- إلى الإنقاذ!

git prevision <N> <filename>

حيث <N> هو عدد المراجعات للملف التراجع عن الملف <filename> .
على سبيل المثال ، للتحقق من المراجعة السابقة المباشرة لملف واحد x/y/zc ، شغّل

git prevision -1 x/y/z.c

كيف يعمل git prevision؟

أضف ما يلي إلى gitconfig الخاص بك

[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"

الأمر في الأساس

  • ينفذ git log على الملف المحدد و
  • يختار التزام الالتزام المناسب في تاريخ الملف و
  • تنفيذ إجراء git checkout إلى ملف الالتزام للملف المحدد.

بشكل أساسي ، كل ما يفعله المرء يدويًا في هذه الحالة ،
ملفوفة في واحد جميل ، اسم مستعار git-alias - git-prevision

لقد أجريت بعض التغييرات على ملف تم الالتزام به عدة مرات كجزء من مجموعة من الملفات ، ولكننا الآن بحاجة إلى إعادة تعيين / إعادة التغييرات على النسخة السابقة إلى إصدار سابق.

لقد قمت بعمل git log مع git diff للعثور على النسخة التي أحتاج إليها ، ولكن ليس لدي أي فكرة عن كيفية إعادة الملف إلى حالته السابقة في الماضي.


git الخروج السحب |

على سبيل المثال

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar

أول رئيس إعادة تعيين لملف الهدف

git reset HEAD path_to_file

الخروج الثاني هذا الملف

git checkout -- path_to_file

إذا ارتكبت ملفًا خاطئًا في التزامك الأخير ، فاتبع التعليمات:

  1. شجرة مفتوحة المصدر ، وتغيير لهذا الالتزام

  1. قم بتغيير الخطوط وابحث عن التزامك بإرسال الملف الخاطئ كترخيص

  1. يمكنك رؤية قائمة التغييرات الخاصة بك في هذا الالتزام
  2. حدده ثم اضغط على ... أزرار الجانب الأيمن ... انقر فوق ملف عكسي
  3. ثم يمكنك رؤيتها في علامة تبويب حالة الملف في الجانب الأيسر السفلي ثم انقر فوق unstage:

  1. فتح رمز الاستوديو المرئي والعودة مرة أخرى عن طريق ارتكاب الملفات التي تمت إزالتها
  2. بعد كل شيء ، يمكنك رؤية النتائج في التزامك الأخير في شجرة المصدر


إذا كنت تعرف عدد الإلتزامات التي تحتاج إلى الرجوع إليها ، فيمكنك استخدام:

git checkout master~5 image.png

هذا يفترض أنك على الفرع master ، والإصدار الذي تريده هو 5 يلتزم مرة أخرى.


استخدم git log للحصول على مفتاح التجزئة لإصدار محدد ثم استخدم git checkout <hashkey>

ملاحظة: لا تنس أن تكتب التجزئة قبل آخرها. يشير آخر تجزئة إلى موضعك الحالي (HEAD) ولا يغير شيئًا.


بافتراض أن تجزئة الالتزام الذي تريده هو c5f567 :

git checkout c5f567 -- file1/to/restore file2/to/restore

توفر صفحة الدخول إلى git مزيدًا من المعلومات.

إذا كنت تريد الرجوع إلى الالتزام قبل c5f567 ، قم بإلحاق ~1 (يعمل مع أي رقم):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

كملاحظة جانبية ، لقد كنت دائمًا غير مرتاح لهذا الأمر لأنه يُستخدم لكل من الأشياء العادية (التغيير بين الفروع) والأشياء غير العادية والمدمرة (تجاهل التغييرات في دليل العمل).


بالنسبة لي لم يكن أي رد واضحًا تمامًا ، ولذلك أود أن أضيف لي الذي يبدو سهلاً للغاية.

لدي ارتكاب abc1 وبعد ذلك فعلت عدة (أو تعديل واحد) إلى ملف file.txt .

الآن أقول أنني أفسدت شيئا في ملف file.txt وأريد أن أعود إلى ارتكاب abc1 السابق.

1. git checkout file.txt : سيؤدي هذا إلى إزالة التغييرات المحلية ، إذا لم تكن بحاجة إليها

2. git checkout abc1 file.txt : سيؤدي ذلك إلى إحضار ملفك إلى نسختك المطلوبة

3. git commit -m "Restored file.txt to version abc1" : سيؤدي ذلك git commit -m "Restored file.txt to version abc1" .

  1. git push : هذا سيدفع كل شيء على المستودع البعيد

بين الخطوة 2 و 3 بالطبع يمكنك القيام git status لفهم ما يجري. عادة يجب أن تشاهد file.txt وأضاف بالفعل وهذا هو السبب في عدم الحاجة إلى git add .


عليك أن تكون حذرا عندما تقول "التراجع". إذا كنت تستخدم إصدارًا واحدًا من ملف في ارتكاب $ A ، ثم أجريت في وقت لاحق اثنين من التغييرات في التزامين منفصلين $ B و $ C (لذلك ما تراه هو التكرار الثالث للملف) ، وإذا قلت " أريد العودة إلى أول "، هل تعني ذلك حقًا؟

إذا كنت تريد التخلص من التغييرات في كل من التكرار الثاني والثالث ، فمن السهل جدًا:

$ git checkout $A file

ثم ارتكبت النتيجة. يسأل الأمر "أريد التحقق من الملف من الحالة المسجلة بواسطة الالتزام $ A".

من ناحية أخرى ، ما تقصده هو التخلص من التغيير التكرار الثاني (أي الالتزام بـ $ B) الذي تم إحضاره ، مع الاحتفاظ بما ارتكبه $ C في الملف ، فأنت تريد إرجاع $ B

$ git revert $B

لاحظ أن الشخص الذي أنشأ الالتزام B $ ربما لم يكن منضبطًا تمامًا وقد يكون قد ارتكب تغييرًا غير مرتبط تمامًا في الالتزام نفسه ، وقد يؤدي ذلك إلى التراجع عن ملفات أخرى غير الملف الذي تشاهد تغييرات مسيئة فيه ، لذا قد ترغب في التحقق من النتيجة بعناية بعد إجراء وبالتالي.


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

git checkout HEAD^1 path/to/file

أو

git checkout HEAD~1 path/to/file

ثم مجرد مرحلة وإلزام النسخة "الجديدة".

إذا تسلحت بمعرفة أن الإلزام يمكن أن يكون له والدان في حالة الدمج ، فيجب أن تعرف أن HEAD ^ 1 هي الوالد الأول وأن الرأس ~ 1 هو الوالد الثاني.

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



للانتقال إلى نسخة سابقة من الملف ، احصل على رقم الالتزام ، على سبيل المثال eb917a1

git checkout eb917a1 YourFileName

إذا كنت بحاجة فقط إلى العودة إلى آخر إصدار commited

git reset HEAD YourFileName
git checkout YourFileName

سيؤدي ذلك ببساطة إلى آخر حالة ملتزمة بالملف


من دواعي سرورنا ، أن "git checkout foo" لن يعمل إذا كانت النسخة العاملة في دليل باسم foo؛ ومع ذلك ، فإن كل من "الخروج من HEAD foo" و "git checkout ./foo" سوف:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo

ها هي طريقي.

أ) في Android Studio ، افتح الملف.

ب) git -> إظهار المحفوظات ، والعثور على الالتزام السابق الذي أريد العودة إليه. احصل على commit_id (على سبيل المثال ، التزام التجزئة).

c) git checkout commit_id file_path


واجهت نفس المشكلة الآن فقط ووجدت أن هذه الإجابة أسهل للفهم ( commit-ref هو قيمة SHA للتغيير في السجل الذي تريد الرجوع إليه):

git checkout [commit-ref] [filename]

هذا سوف يضع هذا الإصدار القديم في دليل العمل الخاص بك ومن هناك يمكنك ارتكابها إذا كنت تريد.


وللعودة إلى آخر نسخة ملتزمة ، والتي تكون مطلوبة بشكل متكرر ، يمكنك استخدام هذا الأمر الأبسط.

git checkout HEAD file/to/restore

يمكنك استخدام أي إشارة إلى التزام بوابة ، بما في ذلك SHA-1 إذا كان ذلك أكثر ملاءمة. النقطة هي أن الأمر يبدو كالتالي:

git checkout [commit-ref] -- [filename]


يمكنك مراجعة التغييرات التي تم إجراؤها على ملف بسرعة باستخدام الأمر diff:

git diff <commit hash> <filename>

ثم لإعادة ملف محدد إلى ذلك الالتزام ، استخدم الأمر reset:

git reset <commit hash> <filename>

قد تحتاج إلى استخدام الخيار --hard إذا كان لديك تعديلات محلية.

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

git checkout <commit hash>
git checkout -b <new branch name>

يمكنك بعد ذلك إعادة توجيه ذلك ضد الخط الرئيسي الخاص بك عندما تكون مستعدًا لدمج هذه التغييرات:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

git checkout -- foo

سيؤدي ذلك إلى إعادة تعيين foo إلى HEAD. بامكانك ايضا:

git checkout HEAD^ foo

لمراجعة واحدة مرة أخرى ، إلخ.


git revert <hash>

سوف يعيد ارتكاب معين. يبدو أنك تعتقد أن git revert فقط يؤثر على الالتزام الأخير.

هذا لا يحل مشكلتك ، إذا كنت تريد التراجع عن تغيير في ملف معين وتغير الالتزام أكثر من ذلك الملف.





version-control