البحث في الموقع
المحتوى عن 'إيداع'.
-
يتناول هذا المقال الأدوات الأساسية للتراجع عن التعديلات في Git. ينبغي دائما الحذر عند التعامل مع أوامر التراجع، إذ أن التراجع من الأمور القليلة في Git التي قد تجعلك تخسر العمل إن أجريتها بطريقة خاطئة. يكثر استخدام التراجع عند الإيداع قبل أن تكون جاهزا لذلك؛ مثلا بنسيان ملفات أو رسائل الإيداع. في هذه الحالة يمكنك إعادة الإيداع باستخدام الخيار amend--: git commit --amend يأخذ الأمر أعلاه محتويات منطقة الإدراج Staging area ويستخدمها في الإيداع. إن لم تحدث أية تغييرات منذ آخر عملية إيداع (عند تنفيذ الأمر مثلا مباشرة بعد تطبيق الإيداع السابق) فسيكون بإمكانك التعديل على رسالة الإيداع الأخيرة التي ستظهر في المحرّر. بهذه الطريقة تكون عدلت على رسالة الإيداع السابق دون أن تضيف إيداعا جديدا. بنفس الطريقة، تمكن إضافة ملف منسي إلى الإيداع. نفترض أنك مثلا بعد إرسال الإيداع فطنت إلى نسيان ملف باسم forgotten_file كان يجب أن يكون فيه؛ في هذه الحالة تستخدم نفس الأمر كما في المثال التالي: git commit -m 'initial commit' git add forgotten_file git commit --amend أرسلنا الإيداع في الأمر الأول، ثم أضفنا في الأمر الثاني ملفا جديدا إلى منطقة الإدراج واستخدمنا خيار amend-- مع git commit. نحصُل في النهاية على إيداع واحد يحل محل الأول ويوجد فيه الملف المنسي. التراجع عن إضافة الملفات إلى منطقة الإدراج سنتطرق في الفقرتين التاليتين إلى كيفية التراجع عن التعديلات على منطقة الإدراج ومجلد العمل. من الجميل أن الأمر الذي يريك حالة هاتين المنطقتين يذكرك بكيفية التراجع عن التعديلات عليهما. لنفترض مثلا أنك عدلت على ملفين وتريد إيداعهما منفصلين (إيداع لكل ملف)، ولكنك نفذت الأمر * git add بالخطأ، وأضفتهما في نفس الوقت إلى منطقة الإدراج. كيف يمكنك نزع الاثنين من منطقة الإدراج؟ أمر git status يذكرك بالكيفية: git add * git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.md -> README modified: CONTRIBUTING.md مباشرة تحت عبارة Changes to be committed (التعديلات المهيّأة للإيداع) يوجد التذكير الذي يقول "استخدام reset HEAD... للتراجع عن إضافة ملف إلى منطقة الإدراج". إن قررنا اتباع النصيحة والتراجع عن إضافة ملف (وليكن CONTRIBUTING.md) إلى منطقة الإدراج: git reset HEAD CONTRIBUTING.md نحصل على الرسالة التالية: Unstaged changes after reset: M CONTRIBUTING.md وعند التحقق الآن من الحالة: git status نحصل على النتيجة التالية: On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.md -> README Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md عدلنا على الملف CONTRIBUTING.md إلا أنه الآن خارج منطقة الإدراج. ملحوظة: استخدام أمر git reset يمكن أن يكون خطرا عند استخدام الخيار hard-- إلا أنه ليس كذلك إن استخدم دون خيارات، في هذه الحالة يتعامل مع منطقة الإدراج فقط. التراجع عن تعديل ملفات ما ذا لو قررت أنك لا تريد الاحتفاظ بالتعديلات التي أجريتها على الملف CONTRIBUTING.md؟ كيف يمكن التراجع عن التعديلات بسهولة، إعادته إلى ما كان عليه قبل آخر إيداع مثلا؟ يخبرك أمر git status بكيفية ذلك، مثل ما فعل مع إضافة الملفات إلى منطقة الإدراج. في مخرجات المثال أعلاه تبدو منطقة الإدراج على النحو التالي: Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md تخبرك الرسالة "..."use "git checkout" بكيفية إلغاء التعديلات على ملفات مجلد العمل. نطبق التعليمات: git checkout -- CONTRIBUTING.md ثم نتحقق من تأثير الأمر: git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.md -> README تمكن ملاحظة أن التعديلات ألغيت. هام: من المهم فهمُ أن أمر git checkout خطير جدا. يلغي الأمر أي تعديل أجريته بلا رجعة، ولن يمكنك إعادته. استخدم هذا الأمر فقط عندما تكون متأكدا من أنك لم تعد ترغب في التعديلات. تذكر أن كل ما أودِع Commited في Git يمكن غالبا إرجاعه؛ حتى الإيداعات الموجودة على فروع Branches محذوفة أو تلك التي عدل عليها باستخدام خيار amend--. إلا أن البيانات التي لم تودع تُفقَد -على الأرجح- بغير رجعة. ترجمة -وبتصرّف- للفصل Git Basics - Undoing Things من كتاب Pro Git لصاحبه Scott Chacon.
-
قد تود بعد القيام بعمليات إيداع عدّة، أو بعد استنساخ Cloning مستودع Repository يحوي سجلا للإداعات، النظر إلى ماضي الإيداعات لرؤية مالذي كان يحصُل. أمر git log أيسر طريقة وأكثرها فعالية لهذا الغرض. تستخدم الأمثلة المقدّمة هنا مشروع simplegit-progit الذي يمكن الحصول عليه بتنفيذ الأمر التالي: git clone https://github.com/schacon/simplegit-progit نفذ أمر git log بعد الدخول إلى مجلد المشروع: git log ستحصل على مخرجات على النحو التالي: commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test commit a11bef06a3f659402fe7563abf99ad00de2209e6 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 10:31:28 2008 -0700 first commit يسرُد أمر git log - إن استخدِم دون خيارات - الإيداعات التي حدثت حسب ترتيب زمني عكسي، أي الإيداع الأحدث أولا. تمكن ملاحظة أنه مع كل إيداع يظهر مجموع التدقيق Checksum الخاص به، اسم من كاتب الإيداع وعنوانها البريدي، تاريخ الإيداع ورسالة الإيداع. توجد الكثير من الخيارات للاستخدام مع أمر git log من أجل إظهار ما تريده بالضبط. سنعرِض هنا لأكثرها شعبية. يعرض خيار p- عند استخدامه مع أمر git log الفروقات ضمن كل إيداع. تمكن إضافة عدد لتحديد المخرجات. يعرض المثال التالي آخر إيداعيْن مع إظهار الفروق: git log -p -2 النتيجة: commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number diff --git a/Rakefile b/Rakefile index a874b73..8f94139 100644 --- a/Rakefile +++ b/Rakefile @@ -5,7 +5,7 @@ require 'rake/gempackagetask' spec = Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.name = "simplegit" - s.version = "0.1.0" + s.version = "0.1.1" s.author = "Scott Chacon" s.email = "schacon@gee-mail.com" s.summary = "A simple gem for using Git in Ruby code." commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test diff --git a/lib/simplegit.rb b/lib/simplegit.rb index a0a60ae..47c6340 100644 --- a/lib/simplegit.rb +++ b/lib/simplegit.rb @@ -18,8 +18,3 @@ class SimpleGit end end - -if $0 == __FILE__ - git = SimpleGit.new - puts git.show -end \ No newline at end of file يعرض الخيار p- نفس المعلومات التي يعرضها الأمر بدون خيارات، مع إضافة الفروق بالنسبة لكل مُخرَج (إيداع). يفيد هذا الأمر كثيرا عند مراجعة الشفرة البرمجية أو للتصفح السريع لما جرى خلال سلسلة من عمليات الإيداع التي أجراها أحد أعضاء الفريق مثلا. يمكن أيضا استخدام خيارات للتلخيص مع الأمر git log. إن أردت مثلا إحصاءات ملخَّصة لكلّ إيداع فيمكنك استخدام خيار stat--: git log --stat النتيجة: commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test lib/simplegit.rb | 5 ----- 1 file changed, 5 deletions(-) commit a11bef06a3f659402fe7563abf99ad00de2209e6 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 10:31:28 2008 -0700 first commit README | 6 ++++++ Rakefile | 23 +++++++++++++++++++++++ lib/simplegit.rb | 25 +++++++++++++++++++++++++ 3 files changed, 54 insertions(+) يظهر خيار stat-- تحت كل إيداع قائمة بالملفات التي عُدلت في الإيداع، عددها وعدد الأسطر التي أُضيفت أو حُذفت. يضيف الخيار أيضا ملخصًا للتعديلات تحت كل إيداع. إن أردت تغيير الصيغة التي تظهر بها مخرجات السجل فيمكنك استخدام الخيار pretty--. توجد صيغ معدّة سلفا للاستخدام؛ عند إعطاء القيمة oneline لخيار pretty-- فإن كل إيداع يظهر في سطر واحد، وهو ما سيكون مفيدا إن كانت لديك الكثير من الإيداعات للنظر فيه. git log --pretty=oneline النتيجة: ca82a6dff817ec66f44342007202690a93763949 changed the version number 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test a11bef06a3f659402fe7563abf99ad00de2209e6 first commit تعدّ قيمة format من أكثر قيم pretty-- أهمية. تعطي هذه القيمة عند استخدامها مع الخيار إمكانية تحديد صيغة مخصَّصة لمخرجات السجلات. يساعد هذا الأمر كثيرا إن كنت تريد تهيئة المخرجات لتحليلها آليا: git log --pretty=format:"%h - %an, %ar : %s" مثال على النتيجة: ca82a6d - Scott Chacon, 6 years ago : changed the version number 085bb3b - Scott Chacon, 6 years ago : removed unnecessary test a11bef0 - Scott Chacon, 6 years ago : first commit توجد في الجدول أدناه قائمة بالخيارات التي يمكن استخدامها لتهيئة مخرجات format. table{border: 1px solid black; border-collapse: collapse;} td, th{border: 1px solid black; padding: 5px 15px;} th{background-color: #ecf0f1;} الخيار الوصف H% مجموع التدقيق h% الصيغة المختصرة لمجموع التدقيق T% مجموع التدقيق لكامل الشجرة Tree t% مجموع التدقيق المختصَر للشجرة P% مجموعات التدقيق للعنصر الأب an% اسم كاتب الإيداع ae% البريد الإلكتروني لكاتب الإيداع ad% تاريخ إنشاء الإيداع (Author date) ar% التاريخ النسبي لإنشاء الإيداع (قبل كذا من الزمن) cn% اسم صاحب الإيداع Commiter ce% البريد الإلكتروني لصاحب الإيداع cd% تاريخ الإيداع cr% التاريخ النسبي للإيداع s% الموضوع ملحوظة: ربما تتساءل عن الفرق بين كاتب الإيداع وصاحب الإيداع؛ كاتب الإيداع هو الشخص الذي كتب العمل بينما صاحب الإيداع هو آخر شخص أضاف العمل إلى المستودع. نفرض مثلا أنك أرسلت ترقيعا لمشروع برمجي، ثم أضافه أحد مطوري المشروع إلى المستودع. يُعزَى لكل منكما في السجل؛ أنت بوصفك كاتب الترقيع وهو بوصفه صاحب الإيداع. يفيد خيارا oneline و format كثيرًا عند استخدامهما مع خيار graph-- الذي يعرض مخطط ASCII لسجل التفرع Branch والدمج Merge. git log --pretty=format:"%h %s" --graph مثال على النتيجة: * 2d3acf9 ignore errors from SIGCHLD on trap * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit |\ | * 420eac9 Added a method for getting the current branch. * | 30e367c timeout code and tests * | 5a09431 add timeout protection to grit * | e1193f8 support for heads with slashes in them |/ * d6016bc require time for xmlschema * 11d191e Merge branch 'defunkt' into local يفيد خيار graph-- كثيرا عند استخدام التفريع والدمج في مستودعات git. توجد الكثير من الخيارات الأخرى للعمل مع أمر git log. يسرد الجدول التالي قائمة بخيارات تعمل مع git log إضافة لخيارات تهيئة أخرى قد تجدها مفيدة. الخيار الوصف p- إظهار الترقيع المصاحب لكل إيداع stat-- إظهار إحصاءات الملفات المعدّل عليها في كل إيداع shortstat-- قصر النتائج الظاهر من نتيجة stat-- على الأسطر المعدّل عليها، المضافة أو المحذوفة name-only-- عرض قائمة بالملفات المعدّل عليها بعد معلومات الإيداع name-status-- عرض قائمة بالملفات التي أضيفت إليها معلومات، عدلت معلوماتها أو حذفت abbrev-commit-- عرض المحارف الأولى من مجموع التحقق من الإيداع، بدلا من كامل المجموع (40 محرفا) relative-date-- عرض التواريخ بصيغة نسبية ("قبل يومين" مثلا) بدلا من الصيغة الكاملة graph-- عرض مخطّط ASCII لسجل التفريع والدمج بجانب مخرجات أمر log pretty-- عرض الإيداعات بصيغة بديلة، يمكن للخيار أن يأخذ إحدى القيم oneline ،short ،fuller ،full، أو format تحديد مخرجات أمر git log يقبل أمر git log خيارات لتحديد المخرجات الظاهرة في نتيجة الأمر، فلا يُعرَض سوى عدد محدّد منها. رأينا أعلاه خيار 2- الذي يعرض فقط الإيداعين الأخيرين. يمكن استخدام الخيار n- حيث n عدد طبيعي لإظهار العدد الموافق من الإيداعات (آخر 5 أو 10 إيداعات مثلا). عمليا، قد لا تستخدم هذه الخيارات كثيرا؛ عكسَ خيارات التحديد المتعلقة بالزمن مثل since-- أو until-- التي يكثر استخدامها. مثلا يسرد الأمر التالي قائمة بالإيداعات التي أضيفت خلال الأسبوعين الأخيرين: git log --since=2.weeks يمكن استخدام since-- مع الكثير من الصيغ؛ تحديد التاريخ 15-01-2016 مثلا، أو تاريخ نسبي (قبل 3 سنوات ويوم و3 دقائق): 3 years 1 day 3 minutes ago يمكنك أيضا ترشيح المخرجات لتطابق معايير بحث تحدّدها. يسمح خيار author-- بالترشيح حسب كاتب الإيداع، في ما يتيح خيار grep-- البحث حسب كلمات مفتاحية ضمن رسائل الإيداع (إن كنت ترغب باستخدام خياري author-- وgrep-- معا فيجب أن تضيف all-match-- إلى الأمر). يعد خيار S- من الخيارات المفيدة كثيرا، حيث يسمح بالبحث عن الإيداعات التي أضافت أو حذفت سلسلة محارف معيّنة. إن أردت على سبيل المثال البحث عن آخر إيداع أضاف أو حذف دالة باسم function_name فيمكن استخدام الأمر التالي: git log -Sfunction_name توجد أيضا إمكانية قصر نتائج أمر git log على الإيداعات التي أجرت تغييرات على ملفات أو مجلدات معينة بذكر مسار الملفات أو المجلدات. يجب أن تكون المسارات هي آخر عنصر في أمر git log ويُنصح أن تسبقها شرطتان -- لفصلها عن بقية الخيارات. يعرض الجدول التالي أهم الخيارات المستخدمة في تحديد مخرجات الأمر git log. الخيار الوصف n- تحديد عدد الإيداعات المراد عرضها since, --after-- عرض الإيداعات التي أضيفت بعد التاريخ المحدد until, --before-- عرض الإيداعات التي أضيفت قبل التاريخ المحدد author-- عرض الإيداعات التي يوافق حقل الكاتب فيها سلسلة المحارف المعيّنة committer-- عرض الإيداعات التي يوافق حقل صاحب الإيداع فيها سلسلة المحارف المعيّنة grep-- عرض الإيداعات التي تحوي الرسائل المصاحبة لها سلسلة المحارف المذكورة S- عرض الإيداعات التي أضافت أو حذفت سلسلة المحارف المعيَّنة يعرض الأمر التالي الإيداعات التي كتبها gitster في الشفرة المصدرية لـGit والتي لم تُدمَج Merge في شهر أكتوبر 2008: git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \ --before="2008-11-01" --no-merges -- t/ مثال على النتيجة: 5610e3b - Fix testcase failure when extended attributes are in use acd3b9e - Enhance hold_lock_file_for_{update,append}() API f563754 - demonstrate breakage of detached checkout with symbolic link HEAD d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths 51a94af - Fix "checkout --track -b newbranch" on detached HEAD b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch من بين 40 ألف إيداع في سجل الشفرة المصدرية لـGit أظهر الأمر الإيداعات الستة التي توافق المعايير المذكورة أعلاه. ترجمة -وبتصرّف- للفصل Git Basics - Viewing the Commit History من كتاب Pro Git لصاحبه Scott Chacon.
-
- 1
-
- سجل الإيداعات
- git
-
(و 3 أكثر)
موسوم في: