انتقال WebAssembly به سرور یا WASI
Bringing WebAssembly to the .NET Mainstream - Steve Sanderson, Microsoft
Many developers still consider WebAssembly to be a leading-edge, niche technology tied to low-level systems programming languages. However, C# and .NET (open-source, cross-platform technologies used by nearly one-third of all professional developers [1]) have run on WebAssembly since 2017. Blazor WebAssembly brought .NET into the browser on open standards, and is now one of the fastest-growing parts of .NET across enterprises, startups, and hobbyists. Next, with WASI we could let you run .NET in even more places, introducing cloud-native tools and techniques to a wider segment of the global developer community. This is a technical talk showing how we bring .NET to WebAssembly. Steve will demonstrate how it runs both interpreted and AOT-compiled, how an IDE debugger can attach, performance tradeoffs, and how a move from Emscripten to WASI SDK lets it run in Wasmtime/Wasmer or higher-level runtimes like wasmCloud. Secondly, you'll hear lessons learned from Blazor as an open-source project - challenges and misconceptions faced bringing WebAssembly beyond early adopters. [1] StackOverflow survey 2021
آنالیز استاتیک کدهای Roslyn
Snippet های ضرروی در سی شارپ
شاید شما هم قصد داشته باشید تا از برخی درخواستها به وب سایت یا اپلیکیشن خود ممانعت عمل بیاورید. نظیر درخواستهای SQL Injection یا برخی Query Stringهای خاص یا برخی درخواستهای مزاحم.
یکی از مزاحمت هایی که گریبانگیر وب سایت هاست، Botهای متفاوتی است که برای کپی اطلاعات، درج کامنت به صورت خودکار و مواردی از این دست، به آنها مراجعه میکنند. شاید در نگاه اول بد نباشد که این Botها به سراغ وب سایت ما بیایند و باعث افزایش تعداد ویزیت سایتمان شوند؛ ولی ضررهای ناشی از کپی و سرقت مطالب سایت، آنهم با سرعت بالا، بیشتر از منافع ناشی از بالا رفتن رنک سایت است. به طور مثال همین سایت NET Tips. دارای تعداد زیادی مقالات مفید است که افراد متعددی در نگارش و تهیه آنها زحمت کشیده اند، یا وب سایتی برای جلب اعتماد مشتریان جهت درج اطلاعاتشان و یا آگهی هایشان زحمت زیادی کشیده است، Botهای آمادهی زیادی وجود دارد که با چند دقیقه صرف وقت جهت تنظیم شدن آماده میشوند تا مطالب را طبق ساختار تعیین شده، مورد به مورد کپی کنند.
برای خلاصی از این موارد روشهای متعددی وجود دارد که از جمله آنها میتوان به تنظیمات فایل htaccess در وب سرورهایی نظیر Apache و یا web.config در IIS اشاره کرد. در این مقاله این امکان را با IIS مرور میکنیم و برای فعال سازی آن کافی است در:
-
IIS 7.5 و بالاتر، همراه با انتخاب Request Filtering در مراحل نصب IIS
-
IIS 7.0 پس از نصب بسته آپدیت Microsoft Knowledge Base Article 957508 .
-
IIS 6.0 با نصب URLScan 3.0
در بخش <system.webServer> و سپس <security>، تگ requestFiltering را استفاده کنیم، در این تگ دستورالعملهای ویژهی پالایشگر درخواستها را مینویسیم (filteringRules) هر دستورالعمل پالایش دارای خصیصههای (Attributes) زیر است:
denyUnescapedPercentمقدار Boolean و انتخابی
اگر برابر با true تنظیم گردد، درخواست هایی که دارای کاراکتر "درصد" (%) هستند و به وسیله escape character ها پوشش داده نشده باشند، رد میشوند. (جهت جلوگیری از حملات XSS و...)
مقدار پیش فرض true است.
name
عنوان دستورالعمل.
مقدار پیش فرض نداشته و درج کردن آن اجباری است.
scanAllRaw
مقدار Boolean و انتخابی
اگر برابر با true تنظیم گردد، پالایشگر درخواستها موظف است تا با بررسی متن header های درخواست، در صورت یافتن یکی از واژه هایی که در خصیصه denyStrings ذکر کرده اید، درخواست را رد کند.
مقدار پیش فرض false است.
scanQueryString
مقدار Boolean و انتخابی
اگر برابر با true تنظیم گردد، پالایشگر درخواستها موظف است تا Query string را بررسی کند تا در صورتی که یکی از واژههای درج شده در خصیصه denyStrings را بیابد، درخواست را رد کند.
اگر خصیصهی unescapeQueryString از تگ < requestFiltering > برابر با true باشد، query string دوبار بررسی میشود: یکبار متن query string برای یافتن عبارات ممنوعه و بار دیگر برای یافتن کاراکترهای بدون پوشش scaped .
مقدار پیشفرض false است.
scanUrl
مقدار Boolean و انتخابی
اگر برابر با true تنظیم گردد، پالایشگر درخواستها URL را برای یافتن واژههای ممنوعهی ذکر شده در خصیصه denyStrings بررسی مینماید.
مقدار پیش فرض false است.
چند مثال:
مثال 1: در این مثال عنوان User-Agent هایی را که در موارد متعدد برای وب سایت هایی که روی آنها کار میکردم مزاحمت ایجاد میکردند را پالایش میکنیم. (لیست این Botها آپدیت میشود)
<requestFiltering> <filteringRules> <filteringRule name="BlockSearchEngines" scanUrl="false" scanQueryString="false"> <scanHeaders> <clear /> <add requestHeader="User-Agent" /> </scanHeaders> <appliesTo> <clear /> </appliesTo> <denyStrings> <clear /> <add string="Python UrlLib" /> <add string="WGet" /> <add string="Apache HttpClient" /> <add string="Unknown Bot" /> <add string="Yandex Spider" /> <add string="libwww-perl" /> <add string="Nutch" /> <add string="DotBot" /> <add string="CCBot" /> <add string="Majestic 12 Bot" /> <add string="Java" /> <add string="Link Checker" /> <add string="Baiduspider" /> <add string="Exabot" /> <add string="PHP" /> </denyStrings> </filteringRule> </filteringRules> </requestFiltering>
مثال 2: ممانعت از SQL Injection
<requestFiltering> <filteringRules> <filteringRule name="SQLInjection" scanUrl="false" scanQueryString="true"> <appliesTo> <clear /> <add fileExtension=".asp" /> <add fileExtension=".aspx" /> <add fileExtension=".php" /> </appliesTo> <denyStrings> <clear /> <add string="--" /> <add string=";" /> <add string="/*" /> <add string="@" /> <add string="char" /> <add string="alter" /> <add string="begin" /> <add string="cast" /> <add string="create" /> <add string="cursor" /> <add string="declare" /> <add string="delete" /> <add string="drop" /> <add string="end" /> <add string="exec" /> <add string="fetch" /> <add string="insert" /> <add string="kill" /> <add string="open" /> <add string="select" /> <add string="sys" /> <add string="table" /> <add string="update" /> </denyStrings> <scanHeaders> <clear /> </scanHeaders> </filteringRule> </filteringRules> </requestFiltering>
مثال 3: ممانعت از درخواست انواع خاصی از فایل ها
<requestFiltering> <filteringRules> <filteringRule name="Block Image Leeching" scanUrl="false" scanQueryString="false" scanAllRaw="false"> <scanHeaders> <add requestHeader="User-agent" /> </scanHeaders> <appliesTo> <add fileExtension=".zip" /> <add fileExtension=".rar" /> <add fileExtension=".exe" /> </appliesTo> <denyStrings> <add string="leech-bot" /> </denyStrings> </filteringRule> </filteringRules> </requestFiltering>
اطلاعات بیشتر در وب سایت رسمی IIS
SQLite امکان تعیین کلمهی عبور را به شما میدهد تا به وسیلهی آن بتوانید دیتابیس را رمزنگاری کنید تا امکان باز کردن آن به صورت عادی وجود نداشته باشد.
برای ایجاد کلمه عبور در دیتابیسی که از قبل رمزنگاری نشده است و یا تغییر کلمه عبور دیتابیسی که قبلا رمزنگاری شده است، به این صورت عمل کنید:
// بازکردن دیتابیسی که از قبل رمزنگاری نشده است SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3"); cnn.Open(); // دیتابیس رمزنگاری شده. ارتباط با دیتابیس همچنان صحیح و برقرار باقی میماند cnn.ChangePassword("mypassword");
برای حذف کلمه عبور در دیتابیسی که از قبل رمزنگاری شده است باید تابع ChangePassword را با مقدار null و یا "" فراخوانی کنید.
// بازکردن دیتابیسی که از قبل رمزنگاری شده SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword"); cnn.Open(); // حذف رمزنگاری از دیتابیس رمزنگاری شده cnn.ChangePassword( null as byte[] );
برای بازکردن دیتابیس رمزنگاری شده و یا ایجاد یک دیتابیس رمزنگاری شده باید کلمه عبور در ConnectionString (همانند مثال بالا) قید شود و یا با فراخوانی تابع SetPassword قبل از فراخوانی تابع Open این کار را انجام داد. در صورتی که کلمه عبور در ConnectionString قید شود باید به صورت cleartext باشد. در حالیکه وقتی از تابع SetPassword استفاده میکنید میتوانید کلمه عبور را به صورت آرایه ای از byte نیز تعریف کنید.
// SetPassword بازکردن دیتابیس رمزنگاری شده با استفاده از فراخوانی تابع SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3"); cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 }); cnn.Open();
در صورتیکه بخواهید ارتباطی را که وجود دارد، به یک فایل دیتابیس دیگر متصل کنید باید به صورت زیر عمل کنید:
- در صورتیکه کلمه عبور به صورت cleartext میباشد:
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.sqlite"); cnn.Open(); cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.sqlite' AS [Protected] KEY 'mypassword'", cnn); cmd.ExecuteNonQuery();
- در صورتیکه کلمه عبور به صورت باینری میباشد:
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3"); cnn.Open(); cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn); cmd.ExecuteNonQuery();
Side Panels
در پنل HTML درکنار ارائه امکاناتی برای مشاهده و کار با تگهای صفحه ، اطلاعات و امکانات دیگری هم برای تگ انتخاب شده در قسمت NodeView وجود دارد.
در این تب استایل هایی که در حال حاظر بروی تگ انتخاب شده اعمال شده اند ، نمایش داده میشود.
در صورتی که موس را بروی مقادیر استایل هایی که جلوهی بصری دارند بگیرید ، یک پاپآپ کوچک نمایان میشود که مقدار را نمایش میدهد.
Options Menu
هر تب یا پنل در فایرباگ دارای یک سری تنظیمات است که Options Menu نام دارد. تب Style هم دارای یک سری تنظیمات است که دانشتن آنها بسیار به شما کمک خواهد کرد.
این منو با کلیک کردن بروی فلش تب () یا راست کلیک کردن بروی تب ظاهر میشود.
- Only Show Applied Styles
در صورت انتخاب ، فقط استایل هایی که اعمال شده اند نمایش داده میشوند. (استایلهای Overwrite شده نمایش داده نمیشوند.)
(این گزینه قابلیت خوبی است ، اما چندبار برای بنده پیش آمده که این مورد به اشتباه استایلی که اعمال شده بود را هم Overwrite شده در نظر گرفته بود. پس در هین طراحی استایل و کار با CSS اگر احیانا یکی از استایل هایتان وجود نداشت و از وجود آن اطمینان داشتید ، غیرفعال کردن این گزینه را امتحان کنید.)
- Show User Agent CSS
با فعال کردن این گزینه ، استایل هایی که توسط مرورگر اعمال شده اند هم نمایش داده میشوند.
- Expand Shorthand Properties
با فعال کردن این گزینه ، استایل هایی که بصورت کوتاه شده تعریف شده اند را بصورت گسترده و باز شده نمایش میدهد.
برای مثال ، دستور margin را بصورت margin-top , margin-right , margin-bottom , margin-left نمایش میدهد.
- سه گزینه ی Colors As Hex ، Colors As RGB و Colors As HSL تعیین کنندهی فرمت نمایش رنگها هستند.
- سه گزینه ی :active ، :hover و :focus هم برای تعیین کلاس کاذب برای تگ جاری کاربرد دارند.
برای مثال شما میخواهید استایلی که یک لینک زمان موس برویش قرار دارد را بررسی کنید ، لینک را در NodeView انتخاب میکنید و سپس از گزینهی :hover را فعال میکنید.
Panel
- Element styles
استایل هایی که بصورت inline (در خود تگ) تعریف شده اند هم در این قسمت نمایش داده میشود و نام rule آن element.style است.
- Source Links
در بالا-راست هر بخش ، یک لینک قرار دارد که لینک فایل استایلی است که در همان قسمت وجود دارد و عددی که در پرانتز قرار دارد ، شماره خط استایل در همان فایل است.
اگر نام فایل با نام صفحهی جاری برابر باشد ، به معنی وجود استایل در تگ <style> در صفحهی جاری است و شمارهی بعد از # هم ایندکس تگ <style> است.
(با کلیک بروی لینک فایل ، فایل در خط مورد نظر در پنل CSS نمایش داده میشود.)
- Inherited rules
ruleهای به ارث رسیده هم در قسمتهای جداگانه به همراه استایلهای به ارث رسیده نمایش داده میشود و تگی والد که استایلها از آن به ارث رسیده اند هم در قسمت عنوان همان استایلها نمایش قرار داده شده است. (با کلیک بروی آن ، در قسمت Nodeview انتخاب میشود.)
- User agent rules
استایل هایی که توسط مرورگر اعمال شده اند (User agent rules) ، با عبارت <System> در زیر لینک منبع استایل ، مشخص شده اند.
- Overwritten styles
استایلهای overwrite شده ، با یک خط برویشان مشخص شده اند.
- Inline editing
استایلهای نمایش داده شده در این پنل را براحتی و با کلیک کردن بروی نام یا مقدار هر یک از دستورات میتوانید تغییر دهید.
برای نوشتن دستورات و مقادیر آنها میتوانید از پیشنهادهای فایرباگ هم کمک بگیرید و با دکمههای Arrow Up و Arrow Down هم بین مقادیر مجاز حرکت کنید.
دستورات یا مقادیر نا صحیح در هین تایپ ، با رنگ قرمز و مقادیر صحیح با رنگ سبز مشخص میشوند.
(این امکان خیلی مفید است ، برای مثال میخواهید فونتهای مختلف را برای یک استایل امتحان کنید ، دستور font-family را مینویسید و بعد از زدن Enter ، با دکمه های Arrow Up و Arrow Down در لحظه نتیجهی اعمال فونتهای مختلف و دردسترس را مشاهده میکنید و بهترین را بر میگزینید.
یا برای یافتن بهترین مقدار margin ، بعد از دستور margin ، زدن کلید Enter ، وارد کردن یک عدد برای شروع ، میتوان باز هم با دکمه های Arrow Up و Arrow Down به سرعت تغییر را در صفحه مشاهده کرد.)
- Rendered font highlighted
برای دستور font ، فایرباگ هوشمندانه عمل کرده و فونتی که در حال استفاده است را پررنگ میکند.
این امکان برای یافتن خطاهای متداول هنگام تعریف فونتهای غیر سیستمی ، بسیار مفید است.
Context Menu
این منو زمانی که در پنل راست کلیک کنید ظاهر میشود و نسبت به منطقه (Context)ای که در آن راست کلیک کرده اید ، گزینههای متفاوتی را مشاهده خواهید کرد. در جدول زیر ، گزینهها ، Contextشان و توضیح هر گزینه آمده است.
گزینه | Context | توضیحات |
Copy Rule Declaration | CSS selector | CSS Rule فعلی را به همراه استایل هایش در clipboard کپی میکند |
Copy Style Declaration | CSS selector | استایلهای CSS Rule فعلی را در clipboard کپی میکند |
Copy Location | source link | آدرس فایل تعریف CSS Rule را در clipboard کپی میکند |
Open in New Tab | source link | آدرس فایل تعریف CSS Rule را در تب جدید باز میکند |
Edit Element Style... | everywhere | امکان تعریف استایلهای درون تگ (inline) را محیا میکند |
Add Rule... | everywhere | یک Rule جدید ایجاد میکند CSS Rule هایی که در حال حاظر وجود دارد را هم پیشنهاد میدهد |
Delete "<rule name>" | CSS selector | CSS Rule فعلی را حذف میکند |
New Property... | CSS rule | یک استایل جدید به CSS Rule فعلی اضافه میکند |
Edit "<property name>"... | CSS property | Property فعلی را به حالت ویرایش میبرد راه دیگر ویرایش Property ، کلیک بروی آن است |
Delete "<property name>" | CSS property | Property فعلی را حذف میکند |
Disable "<property name>" | CSS property | Property فعلی را غیر فعال میکند را سریعتر ، کلیک کردن در ناحیهی پشت Property ، بروی علامت قرمز رنگ است |
Refresh | everywhere | محتویات پنل را بروز میکند |
Inspect in DOM Panel |
CSS rule | CSS Rule فعلی را در پنل DOM برای بررسی باز میکند |
Inspect in CSS Panel | CSS rule | CSS Rule فعلی را در پنل CSS برای بررسی باز میکند |
<Default Editor Name> | CSS rule | فایل تعریف استایلها را در ادیتور تعریف شده باز میکند (این گزینه در صورت تعریف ادیتور در تنظیمات FireBug نمایش داده خواهد شد) |
2 - Computed
دراین تب نتیجهی پردازش استایلهای ارائه شده توسط کاربر ، برای تگ مشخص شده در قسمت NodeView نمایش داده میشود. (مقادیر استایل هایی که در نهایت بروی تگ اعمال شده اند.)
Style Tracing
برای ردیابی استایلها ، استایلها به ترتیب اعمال شدنشان مرتب شده اند و اولین مقدار ، مقداری است که اعمال شده است.
مقادیر Overwrite بصورت خط کشیده شده و استایلهای Overwrite شده بصورت خاکستری-کمرنگ نمایش داده میشوند.
هر استایل هم مانند تب Style ، یک لینک به منبع خود دارد.
Options Menu
- Show User Agent CSS
در صورت انتخاب ، فقط استایل هایی که اعمال شده اند نمایش داده میشوند.
- Sort alphabetically
در صورت انتخاب ، استایلها به ترتیب الفبا ، و درصورت عدم انتخاب بصورت گروه بندی نمایش داده میشوند.
- Show Mozilla Specific Styles
در صورت انتخاب ، استایلهای مخصوص Mozilla را نمایش میدهد. (استایل هایی با پیشوند -moz-)
- سه گزینهی Colors As Hex ، Colors As RGB و Colors As HSL تعیین کنندهی فرمت نمایش رنگها هستند.
Context Menu
این منو زمانی که در پنل راست کلیک کنید ظاهر میشود و نسبت به منطقه (Context)ای که در آن راست کلیک کرده اید ، گزینههای متفاوتی را مشاهده خواهید کرد. در جدول زیر ، گزینهها ، Contextشان و توضیح هر گزینه آمده است.
گزینه | Context | توضیحات |
Expand All Styles | everywhere | CSS Rule فعلی را به همراه استایل هایش در clipboard کپی میکند |
Collapse All Styles | everywhere | استایلهای CSS Rule فعلی را در clipboard کپی میکند |
Inspect in DOM panel | styles | آدرس فایل تعریف CSS Rule را در تب جدید باز میکند |
Copy Location |
style source link | امکان تعریف استایلهای درون تگ (inline) را محیا میکند |
Open in New Tab | style source link | یک Rule جدید ایجاد میکند CSS Rule هایی که در حال حاظر وجود دارد را هم پیشنهاد میدهد |
Inspect in CSS panel | style source link | CSS Rule فعلی را حذف میکند |
<Default Editor Name> | style source link | فایل تعریف استایلها را در ادیتور تعریف شده باز میکند (این گزینه در صورت تعریف ادیتور در تنظیمات FireBug نمایش داده خواهد شد) |
3 - Layout
در این تب ، مقادیر Box Model بصورت بصری نمایش میدهد. میتوان با کلیک کردن بروی هریک از مقادیر ، آن را ویرایش کرد. (این تغییر بصورت inline در تگ اعمال میشود.)
با حرکت موس بروی قسمتهای مختلف ، میتوان همان قسمتها را در صفحه بصورت خط کشی شده مشاهده کرد.
(البته ظاهرا در ورژن 1.10.4 که بنده استفاده میکنم ، عملیات ویرایش مقادیر به درستی انجام نمیشود.)
Options Menu
- Show Rulers and Guides
در صورت انتخاب ، خطهای راهنما را هنگام حرکت موس بروی اجزای Box Model در صفحه نمایش میدهد.
4 - DOM
این پنل اطلاعات DOM تگ جاری را نمایش میدهد.
این پنل تمام قابلیتهای پنل DOM اصلی را دارا میباشد.
(در مقالات آینده با تب DOM آشنا خواهیم شد.)
تنظیم اول: تغییر نحوهی نمایش پیش فرض فایلهای XAML
اگر فایل XAML شما اندکی حجیم شود نمایش آن در VS.NET کمی طولانی خواهد شد و حالت پیش فرض نمایش در VS.NET هم split view mode است (نمایش XAML و پیش نمایش آن با هم). این مورد هم پس از مدتی تبدیل به عذاب میشود. برای رفع آن میتوان حالت پیش فرض نمایش یک فایل XAML را به XAML View تنها تغییر داد.
برای این منظور به منوی Tools ، گزینهی Options و سپس قسمت تنظیمات Text editor مراجعه کنید. در اینجا در قسمت XAML ، گزینهی Miscellaneous را انتخاب کرده و سپس "Always open documents in full XAML view" را تیک بزنید.
حتی ممکن است این مورد هم رضایت بخش نباشد. در این حالت میتوان ویرایشگر پیش فرض را کلا تغییر داد. Design tab را در پایین صفحه از دست میدهیم اما هنوز intellisense کار میکند و اگر نیاز به designer بود فقط کافی است کلیک راست کرده و گزینهی View designer را انتخاب کرد:
روی یک فایل XAML دلخواه کلیک راست کرده و گزینهی Open with را انتخاب کنید. سپس "Source Code (Text) Editor" را انتخاب کرده و روی دکمهی Set as Default کلیک کنید. تمام!
هر چند Blend این مشکلات را ندارد و با فایلهای حجیم XAML به خوبی کاری میکند.
تنظیم دوم: تغییر نحوهی نمایش مشکلات ناشی از Binding
عموما اگر مشکلاتی در حین عملیات Binding در WPF یا Silverlight وجود داشته باشند، خطاها در Debugger Output Window نمایش داده میشوند. حالت پیش فرض هم فقط روی Error تنظیم شده است به این معنا که warning ها را مشاهده نخواهید کرد. برای تغییر این مورد باید به صورت زیر عمل کرد:
به منوی Tools ، گزینهی Options و سپس قسمت تنظیمات Debugging مراجعه کنید. گزینهی Output Window -> WPF Trace Settings را انتخاب نمائید. سپس در اینجا قسمت WPF trace settings را یافته و مقدار پیش فرض Data binding را که به Error تنظیم شده است، به Warning تنظیم نمائید.
در این مقاله با یکی از مهمترین ویژگیهای git یعنی بازیابی تغییرات فایلها، آشنا میشویم. اما در ابتدا نگاهی میکنیم به چگونگی ایجاد تغییر در آخرین commit:
تغییر آخرین commit:
در
git این امکان وجود دارد که آخرین فرمان commit با استفاده از اصلاحکننده
amend تغییر کند. علت تاکید بر روی آخرین دستور این است که git به دلیل
ساختاری که دارد نمیتواند commitهای قبل را تغییر دهد. اگر مقالات ابتدایی
آموزش git را مطالعه کرده باشید، به خاطر دارید که هر commit دارای یک کد
منحصر به فرد SHA-1 است، که این کد از هش کردن BLOBها به همراه خود مقادیر
commit یعنی مشخصات ایجاد کننده آن و از همه مهمتر SHA-1 پدر ایجاد میشود.
در نتیجه تغییر commitیی که نقش برگ را ندارد، یعنی در ساختار درختی git
دارای فرزند است، سبب میشود کد SHA-1 آن تغییر کند. این تغییر، commitهای فرزند را مجاب میکند برای حفظ صحت دادهها مقدار SHA-1 خود را تغییر دهند.
به این ترتیب این تغییرات در کل repository پخش خواهد شد. به همین دلیل git
جز آخرین commit امکان اصلاح دیگر commitها را نخواهد داد.
برای اصلاح آخرین commit کافی است دستور commit خود را با amend-- بیاورید
دستورات بازیابی فایل:
دستور checkout:
این فرمان یکی از مهمترین فرمانهای git است که دارای دو کاربرد است:
۱) بازیابی فایلی از repository و یا stage
۲) تغییر شاخه (این مورد را در مقالات مربوط به branch بررسی خواهیم کرد)
با
استفاده از این دستور میتوان فایلی را از repository به stage یا working
tree و یا هر دو بیاوریم. عملکرد این دستور با اصلاح کنندههای گوناگون
متفاوت خواهد بود. در ادامه روشهای مختلف فراخوانی این دستور و کاربرد هر
کدام آورده شده است:
در صورتی که بخواهیم فایلی را از محلی که head اکنون به آن اشاره میکند به working tree بیاوریم از دستور زیر استفاده میکنیم:
git checkout --[filename]
در حالت فوق فایل مستقیما به working tree آورده شده و در stage قرار نمیگیرد
تذکر:
-- در دستور بالا اختیاری بوده، اما استفاده از آن توصیه میشود. زیرا در
صورتیکه نام فایل به اشتباه وارد شود و یا فایل موجود نباشد، git اقدام به
تعویض شاخه میکند. زیرا همانطور که گفته شد، این دستور کاربرد دوگانه دارد.
در این حالت ممکن است به علت سهل انگاری مشکلاتی ایجاد شود علامت -- تاکید میکند که مقدار نوشته نام فایل است.
حال اگر بخواهیم فایلی را از commitهای قبل بازیابی کنیم، میتوانیم از دستور زیر استفاده کنیم:
git checkout [SHA-1] [filename]
در این حالت فایل هم در stage و هم در working tree قرار میگیرد.
دستور reset:
در
صورتیکه بخواهید تعداد زیادی فایل را به وضعیت مشخصی در زمان قبل
برگدانید، reset فرمان مناسبی خواهد بود. البته استفاده از این دستور باید با
احتیاط کامل صورت گیرد. زیرا در صورت اشتباه، این امکان وجود دارد که دیگر
نتوانید به بخشی از سوابق فایلهای خود دسترسی داشته باشید. بنابراین این
دستور همانقدر که کاربردی است، به همان اندازه نیز خطرناک است.
دستور reset را میتوان به ۳ صورت اجرا نمود:
۱) soft
۲) mixed (حالت پیشفرض)
۳) hard
۱)در
حالت soft تنها head به commit گفته شده منتقل میشود و working tree و
همچنین stage تغییری نمیکند. دقیقا مانند آنکه هد یک نوار خوان ویدئویی به
جای آنکه به آخرین محل ضبط اشاره کند، به عقب برگشته و به قسمتی در قبل
برود. در این حالت در صورتیکه دستور commit جدیدی ایجاد نشود که باعث پاک
شدن commitهای از آنجا به بعد شود، میتوان با اجرای مجدد دستور reset و اشاره
به آخرین commit، مجددا head را به سر جای اول برگرداند. البته توجه کنید در
صورتیکه در هنگام برگرداندن head به commitهای قبلی، فایلهایی تغییر کرده
باشند، آنها به صورت خودکار به stage اضافه میشوند.
۲) در حالت mixed
که پیش فرض این دستور نیز است، working tree بدون تغییر میماند. اما stage
تغییر کرده و دقیقا مانند وضعیت commit میشود.
۳) در این حالت هم
working tree و هم stage تغییر میکند و عینا وضعیت commitیی را میگیرند
که اکنون head به آن اشاره میکند. استفاده از این اصلاح کننده بسیار
خطرناکتر از موارد قبل است.
در هر یک از موارد فوق تا زمانیکه دستور
commit جدیدی را اجرا نکرده باشید، میتوانید به وضعیت قبل برگردید. اما اگر
commit جدید اجرا شود دیگر امکان بازگشت به commitهای صورت گرفته بعد از
آن وجود ندارد.
نکته مهم:
علیرغم
آنکه میتوان به commitهای گذشته در صورت عدم داشتن commit جدید مراجعه
کرد، اما یک اشکال فنی وجود دارد و آن این است که شما نمیتوانید SHA-1های آن commitها را با دستوراتی نظیر log ببینید. بنابراین بهتر است مقدار آنها
را قبل از اجرای دستور، ذخیره و تا اطمینان از وضعیت فعلی در محلی نگه دارید.
شکل زیر نمایانگر وضعیتهای مختلف دستور reset در هنگام بازگشت به سه commit قبل نسبت به وضعیت فعلی Head است: