Skip to content

mehrdadTemp/git-toturial

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 

Repository files navigation

به نام خدا

payvast-ag3-repo

this is a payvast AG3 repository loation is AG3 Repo

نصب گیت در ویندوز

جهت نصب گیت در ویندوز ابتدا به سایت گیت رفته و از پنل دانلود ها گیت برای ویندوز را دانلود کنید.مطابق تصویر زیر.

install git in windows image 1

مجوز عمومی گنو را مرور کنید و وقتی آماده نصب شدید ، روی Next کلیک کنید

install git in windows image 2

گیت محل نصب را از شما درخواست می کند. محل نصب پیش فرض در Program File می باشد(بهتر است در همین مکان بماند) و در صورت علاقه به تغییر آن محل مورد نظر خود را انتخاب کرده و روی Next کلیک کنید.

install git in windows image 3

صفحه انتخاب مؤلفه (component selection) ظاهر می شود. پیش فرض ها را رها کنید مگر اینکه نیاز خاصی به تغییر آنها داشته باشید و روی Next کلیک کنید.

install git in windows image 4

نصب کننده می خواهد پوشه منوی شروع (start menu folder) را ایجاد کند. بر روی Next کلیک کنید.

install git in windows image 5

ویرایشگر متنی را که می خواهید با Git استفاده کنید انتخاب کنید.(در محیط bash برای کارهای مختلف متنی) از منوی کشویی هر ویرایشگر متنی که ترجیح می دهید را انتخاب کنید بهتر است به فرم پیش فرض همان ویرایشگر قدرتمند vim باشد(توضیح داده خواهد شد) ولی می توانید ویرایش گرهای دیگری مثل notepad++ را هم برای استفاده انتخاب کنید (مانند شکل) و Next را بزنید.

install git in windows image 6

این مرحله نصب به شما امکان می دهد محیط PATH را تغییر دهید. PATH مجموعه پیش فرض دایرکتوری ها است که هنگام اجرای یک دستور از خط فرمان ، شامل می شود. (هر دستوری که در گیت انجام می شود یک فایل اجرای در این محیط و پوشه دارد) این گزینه را در قسمت وسط (توصیه شده) بگذارید "Git From the command line and also from 3rd-party software"و روی Next کلیک کنید

install git in windows image 7

شبیه سازهای ترمینال

این قسمت مربوط به گواهینامه های سرور است. بیشتر کاربران باید از پیش فرض استفاده کنند(پیش فرض) .گر در یک محیط Active Directory کار می کنید ، ممکن است لازم باشد به گواهی های Windows Store تغییر دهید. روی Next کلیک کنید

install git in windows image 8

مرحله بعدی line ending را مشخص می کند. توصیه می شود که انتخاب پیش فرض را قبول کنید (“Checkout Windows-style, commit Unix-style line endings”). این مربوط به نحوه شکل گیری داده ها و تغییر این گزینه ممکن است باعث ایجاد مشکلاتی شود. روی Next کلیک کنید

install git in windows image 9

در مرحله بعدی شبیه ساز ترمینال مورد نظر خود را انتخاب کنید. پیش فرض برای ویژگی های آن توصیه می شود.( MinTTY ) و سپس روی Next کلیک کنید

install git in windows image 10

گزینه های اضافی سفارشی سازی

گزینه های پیش فرض توصیه می شود ، اما این مرحله به شما امکان می دهد تصمیم بگیرید کدام گزینه اضافی را که می خواهید فعال کنید. اگر از پیوندهای نمادین استفاده می کنید ، که مانند میانبرهای خط فرمان است ، کادر را تیک بزنید(Enable symbolic links). و بعد روی Next کلیک کنید

install git in windows image 11

بسته به نسخه Git شما در حال نصب هستید ، ممکن است نصب ویژگی های آزمایشی را ارائه دهد. گزینه گنجاندن گزینه های تعاملی ارائه شد. آن را بدون تیک رها کنید و روی نصب کلیک کنید. تا فرایند نصب گیت آغاز گردد.

install git in windows image 12

بعد از نصب روی دکمه finish کلیک کنید

install git in windows image 12

congratulation

نحوه راه اندازی Git در ویندوز

برای راه اندازی Git Bash ، منوی Windows Start را باز کنید ، git bash را تایپ کنید و Enter را فشار دهید.

install git in windows image 14

install git in windows image 15

برای راه اندازی Git GUI (بعدا در مورد git gui صحبت می کنیم) ، منوی Windows Start را باز کنید ، git gui را تایپ کنید و Enter را فشار دهید.

install git in windows image 16

install git in windows image 17

برای راه اندازی gitk که یک واسط گرافیکی (ویزارد) دیگر برای گیت می باشد هم منوی Windows Start را باز کنید ، gitk را تایپ کنید و Enter را فشار دهید.

install git in windows image 19

install git in windows image 20

در محیط git bash برای تست درست کار کردن آن 2 دستور زیر را که برای نمایش مکان ذخیره شدن برنامه git (which git) و ورژن برنامه git می باشد را اجرا می کنیم.

which git
git --version

install git in windows image 18

git status

به طور کلی برای درک کلیه دستورات گیت ، می باید با سه مفهوم اصلی Working Directory ، StagingAreaو Repositoryدر گیت آشنایی داشته باشید. عکس زیر به خوبی شما را در این امر کمک می کند و می توانید با استفاده از آن، کلیه این سه حالت را گیت درک کنید.

push image

سه وضعیت کلی در پروژه‌های گیت وجود دارد که شامل موارد زیر می‌شود:

  1. staged
  2. committed
  3. modified

stage

بعد از تغییراتی در کد و استفاده از دستور ```git add``` این تغییرات در stage ذخیره می شوند.

در شکل زیر مراحل مختلف گردش کار در یک پروژه گیت را می توانید ببینید

push image

بررسی مخزن گیت

می‌توانید وضعیت مخزن گیت را هر زمان که می‌خواهید با استفاده از دستور زیر بررسی کنید

git status

همانطور که در تصویر زیر مشاهده می کنید مخزن هیچ مورد تغییر یا ویرایشی را در خود ندارد

git status image (1)

حالا فرض کنیدی فایلی به نام main.py را به پروژه اضافه کردید با این کار و بعد انجام دوباره دستور بالا (git status) می بینید که فایل فوق با رنگ قرمز مشخص شده و نشان دهنده این است که این فایل در مخزن محلی قرار دارد (working directory)

push image

init

برای ساخت یک مخزن محلی یک پوشه خالی ساخته و در داخل آن با کلیک راست از منوی ظاهر شده قسمت “Git Bash Here” را انتخاب کرده. مطابق شکل زیر

git status image (1)

در مرحله بعدی برای ساخت یک مخزن خالی توسط دستور git init اقدام به این کار می کنیم مطابق شکل زیر.

git init

push image

بعد از انجام اینکار یک پوشه به نام .git در پوشه ایجاد می شود که وظیفه نگهداری اطلاعات مخزن را دارد و به هیچ وجه این پوشه را دست نزنید.

.git

شامل تمام اطلاعات مورد نیاز برای کنترل نسخه است. اگر می خواهید مخزن خود را کلون کنید ، کپی کردن پوشه .git کافی می باشد.

پوشه ها

  1. hooks
  2. info
  3. objects
  4. refs
  5. logs

فایل ها

  1. config
  2. description
  3. HEAD
  4. index

پوشه objects

محتوای مخزن Git در objectها نوشته میشود. همه آنها در پوشه ی git /objects. ذخیره می شوند. Objectها می توانند یکی از انواع commit و tree و blob باشند. Treeحاوی اطلاعاتی در مورد ساختار پوشه ها و فایل ها است و هر پوشه یا فایل دارای هش (hash) خاص خود است که در tree object ذخیره می شود Blob . نوعی از شیء Git است که در آن محتوای فایل ها ذخیره می شوند. به عبارت دیگر ، درصورتیکه hash یک فایل خاص را بدانید ، می توانید محتویات این فایل را با استفاده ازدستور git cat-file بخوانید.

پوشه logs

برای شروع بازیابی اطلاعات از مخزن Git ابتدا باید نقطه شروع را پیدا کنیم. Git تمامی اطلاعات را در فایل log ذخیره میکند و این فایل در مسیر .git/logs/head در دسترس میباشد. (و یا در مسیر .git/logs/HEAD)

فایل .gitignore

نکته ی ارزشمندی که برای اشاره وجود دارد، این است که اگر پوشه git. را در وب سرور به صورت متروک شده پیدا کنیم .این جایی است که می توانید اسامی تمام پوشه ها وفایل هایی که نباید در مخزن commit شوند،قرار دهید (اما این بدان معنی نیست که آنها کلا وجود ندارند – آنها فقط به عنوان بخشی از مخزن Git وجود ندارند). در حقیقت در این فایل اطلاعاتی است که نمی خواهیم در مخزن ذخیره شوند.

به عنوان مثال شما نمی خواهید در موقع ارسال اطلاعات مخزن به سرور (push) مثلا فایل های با پسوند pyc به گیت منتقل شوند برای این منظور این مقادیر را در این فایل قرار دهید.

*.pyc

برای اینکه مثلا یک دایرکتوری (پوشه) هم نادیده گرفته شود نام پوشه را درج می کنیم

node_modules/

فایل config

این فایل شامل اطلاعت پیکره بندی مخزن جاری می باشد و دقت شود که برای اینکه پیکره بندی شما روی ماشین بنشیند باید از سوییچ --global استفاده شود.

نکته

به هیچ وجه این فایل را به فرم دستی تغییر ندهید بلکه با استفاده از دستور git config اقدام به تغییرات روی این فایل کنید

stage

در این مرحله می خواهیم فایل ایجاد شده را در stage قرار دهیم. برای این منظور باید از دستور زیر استفاده کنیم.

git add main.py

push image

نکته

برای افزودن چند فایل به طور همزمان می توان نام فایل ها را به ترتیب و با فاصله کنار هم در stage اضافه کرد. به عنوان مثال فرض کنید ما 3 فایل با نام های file1.txt و file2.txt و file3.txt داریم برای افزودن همزمان این 3 فایل به stage از کد زیر استفاده می شود.

git add file1.txt file2.txt file3.txt

نکته

برای افزودن تمام فایل ها و پوشه های جدید یا ویرایش شده پروژه درstage.از کدی مثل زیر استفاده می شود.

git add .

local repository

در مرحله بعدی باید فایل های موجود در stage را به local repository منتقل کرد که برای این کار از دستور commit استفاده می گردد. برای استفاده از این دستور باید با استفاده از سوییچ –m و قرار دادن یک پیام اقدام به ذخیره فایل های خود در مخزن محلی کنید.

git commit -m "add main.py file to repository"

push image

remote repository

در مرحله آخر باید فایل های موجود در مخزن محلی را به remote repository منتقل کرد که برای این منظور نیز از دستور push استفاده می گردد. که باید نام مخزنی را که در آن قرار داریم به عنوان هدف ذخیره قرار گیرد.مطابق با دستور زیر.

git push origin master

push image

نکته

متن درج شده در commit کاملا اختیاری می باشد ولی بهتر است متنی باشد که در مراحل بعد متوجه تغییرات در مخزن شویم. در صورت عدم درج سوییچ –m گیت شما را به صفحه ادیتور پیش فرض که برایش تعریف کرده اید می برد تا در آنجا متن مورد نظر خود را تایپ کنید. در گیت به فرم پیش فرض از ویرایشگر متنی قدرتمند vim استفاده می شود.(در قسمت های پایین در مورد این ادیتور صحبت می شود). برای تایپ در این ادیتور ابتدا دکمه i را زده و ادیتور به حالت ویرایشی می رود بعد از تایپ متن مورد نظر خود دکمه esc را زده و با تایپ عبارت :wqa (دستورات در vim با : شروع می شوند و هر کلمه معادل یک حرکت خاص می باشد به عنوان مثال w به منظور write کردن متن و q به منظور خروج یا quit استفاده می گردد) از ادیتور متن را ذخیره و خارج می شوید.

بعد از تایپ دستور git commitصفحه زیر نمایش داده می شود.

input to vim editor

برای ورود به مد ویرایش کلمه i را فشار دهید (در قسمت پایین صفحه عبارت – INSERT – نشان دهنده ورود به این مد می باشد). و اقدام به تایپ متن مورد نظر کنید (در بالای صفحه می توان عبارت مورد نظر را مشاهده کرد با رنگ زرد در اینجا شما حتی می توانید comment خود را در چند خط و با enter از هم جدا کنید)

input to insert mode

در نهایت و بعد از تایپ عبارت مورد نظر کلمه escape در کی برد(دکمه Esc) را فشار داده و عبارت :wqa را تایپ کنید (ماننده پایین صفحه شکل زیر). و در نهایت اقدام به ذخیره با زدن دکمه Enter کنید.

save in vim

همانطور که در شکل می بینید بعد از برگشت از ادیتور متن مورد نظر در commit درج گردیده است.

back to commit

unstage repository

می‌توانید به سادگی فایل‌ها را از قسمت stage نیز حذف کنید(ممکن است به اشتباه فایلی را به stage با دستور git add ارسال کرده باشید) برای این کار باید از دستور زیر استفاده شود.(در اینجا منظور از filename نام فایل مورد نظر می باشد)

git rm --cached filename

اگر می‌خواهید پوشه‌ها را نیز حذف کنید به یک پرچم –r نیازمندید

git rm --cached -r foldername

برای حذف چند فایل هم می شود با فاصله آنها را یکجا از stage حذف کرد.

git rm --cached file1 file2 file3

برای اینکه تمام فایل‌ها و دایرکتوری‌ها را یکجا حذف کنید می‌توانید به صورت زیر عمل کنید

git rm --cached -r .

push image

نمایش تاریخچه کامل کامیت‌ها

LOG

برای مشاهده همه commit های انجام شده در پروژه می توانید از دستور git log استفاده کنید. با اجرای این دستور، آیتم های مربوط به commit به نمایش در می آیند. این آیتم ها که در هر لاگ به نمایش در می آیند عبارتند از:

  1. Commit ID :

    که ID مربوط به هر کامیت می باشد که عددی منحصر به فرد است.

  2. Author :

    کسی که commit را انجام داده است (شامل نام او به همراه آدرس ایمیل فرد)

  3. Date :

    تاریخ انجام commit را نمایش می دهد.

  4. Message :

    پیامی را که در هر commit ثبت می شود را نمایش می دهد.

git log

push image

نکته

شناسه (id) هر commit بسیار مهم بوده و می شود از آن برای برگرداندن نسخه محلی به یک نسخه مشخص در مخزن ریموت استفاده کرد. در پایین درباره این مورد توضیح می دهیم.

نکته

نمایش لاگ به همراه فایل هایی که در هر commit تغییر یافته اند
برای نمایش اینکه در هر commit چه فایل هایی تغییر کرده اند، از دستور git log –stat به صورت زیر استفاده می کنید

git log --stat

push image

نکته

نمایش commit ها به صورت گراف
برای نمایش به صورت گراف، از دستور git log –graph استفاده می شود. از این دستور برای نمایش branch ها و همین طور commit ها به شکل گراف استفاده می شود.

git log --graph

push image

نکته

نمایش commit ها به صورت خطی
برای نمایش commit ها به شکل خطی، از دستور git log –oneline استفاده می شود. با این دستور کل commit ها به صورت خطی و پشت سر هم در صفحه به نمایش در می آیند.

git log --oneline

push image

نکته

مشاهده جزئیات کامل هر commit
جهت نمایش جزئیات کامل هر commit و تغییرات انجام شده در آن، می توانید از دستور git log -p استفاده کنید.

git log -p

push image

نکته

نمایش n کامیت آخربه صورت خطی
برای نمایش n کامیت آخر (مثلا 5 کامیت آخر در پروژه) می توانید از دستور git log -n –oneline استفاده کنید. با این دستور n تا commit آخر فقط به نمایش در می آیند.

git log -4 --oneline 

push image

نکته

نمایش لاگ های با فرمت دلخواه
شما می توانید از فرمت خاص برای نمایش لاگ های commit های خود در گیت استفاده کنید. برای نمایش خلاصه و منظم ، عموما از دستور git log –pretty=format به همراه فرمت دلخواه خود، استفاده می شود.

git log --graph --pretty=format:'%Cred%h%Creset -%C(green)%d%Creset %s %Cgreen(%cr) %C(bold red)<%an>%Creset' --abbrev-commit

push image

No command Description
1 %n ایجاد یک خط جدید
2 %% نمایش کاراکتر %
3 %Cred تغییر رنگ به قرمز
4 %Cgreen تغییر رنگ به سبز
5 %Cblue تغییر رنگ به آبی
6 %Creset پاک کردن رنگ
7 %T نمایش به فرم درختی
8 %an نام اقدام کننده commit
9 %ae نمایش ایمیل اقدام کننده به commit
10 %ad تاریخ commit
11 %as نمایش تاریخ کوتاه commit

git format

خلاصه دستورات لاگ در گیت

No Git Log Command Description
1 git log Show log without any format
2 git log --stat Show log with files which are changed in each commit
3 git log --graph show log as a graph
4 git log --oneline show log as one line
5 git log -5 --oneline show last 5 commits as oneline
6 git log --merge show only log related to branches merge
7 git log -p show log with each specification in each commit
8 git log --graph --pretty=format:'%Cred%h%Creset -%C(green)%d%Creset %s %Cgreen(%cr) %C(bold red)<%an>%Creset' --abbrev-commit Show log with pretty format

clone

یعنی یک مخزن (repository) را دقیقا مشابهش را روی سیستم خود بسازید.و البته دسترسی به فایل ها ، commit های قبلی در مخزن و ... برای این کار در git از دستوری مشابه زیر استفاده می شود.

git clone repo_address

push image

git clone https://github.com/mehrdadTemp/git-toturial.git

نکته

جهت دریافت تغییرات کاربران دیگر از مخزن اصلی هم از دستور زیر استفاده می گردد.

git pull origin master

البته بجای master می توان نام شاخه مورد نظر را درج کرد

شاخه (Branch)

در صورتی که بخواهید شاخه های متفاوتی را در توسعه کدهای خود داشته باشید، از مفهومی به نام branch در گیت استفاده می کنید. در واقع با استفاده از branch شما از شلوغی ها و بی نظمی هایی که در هنگام کار تیمی ممکن است پیش بیاید، جلوگیری می کنید. برای اینکه پس از توسعه، هر branch را با feature های اصلی به شاخه اصلی خود یا همان master اضافه کنید، کافی است از دستورات گیت با نام های merge و rebase استفاده کنید.

نحوه ساخت یک branch جدید و وارد شدن در آن
برای ساخت یک branch جدید و وارد شدن به آن یا همان checkout کردن به آن از دستور git checkout -b به همراه نام branch استفاده می کنیم. همچنین برای ساخت و ایجاد یک branch می توانید از دستور git branch به همراه نام آن شاخه استفاده کنید.

git checkout -b  mehrdad

push image

نکته

برای برگشت سریع به شاخه قبلی از دستور زیر استفاده گردد.

git checkout -

رفتن به یک شاخه دیگر در گیت برای جابجایی از یک شاخه به شاخه دیگر کافی است از دستور git checkout به همراه نام branch مربوطه استفاده کنیم.

git checkout master

push image

نکته

نمایش کلیه شاخه های موجود در یک پروژه

برای دیدن کلیه branch های موجود در یک پروژه می توانید از دستور git branch -a استفاده کنید.

git branch -a

توضیح

در شکل زیر مشاهده می گردد که پروژه شامل چند شاخه با نام های mehrdad و master می باشد. سبز بودن master نیز نشانه این بوده که این شاخه در حال حاضر برای کاربر فوق فعال می باشد(در این شاخه قرار دارد).

push image

نکته

پاک کردن یک شاخه در گیت

جهت حذف نمودن یک branch در گیت کافی است از دستور git branch -d به همراه نام branch استفاده کنید. در اینجا ما شاخه mehrdad را حذف کردیم

git branch -d mehrdad

push image

در صورتی که در شاخه مورد نظر برای حذف موردی باشد که هنوز commit نشده اجازه حذف به شما داده نمی شود در صورت اینکه حتما می خواهید فایل حذف شود از سوییچ –D (بزرگ) استفاده گردد.

git branch -D mehrdad

نکته

دیدن کلیه شاخه ها در remote

جهت دیدن کلیه branch ها برای حالت های fetch و همین طور push می توانید از دستور remote -v استفاده کنید.

git remote -v

push image

git branch commands

No Git Branch Command Description
1 git branch mehrdad Create a new branch
2 git checkout -b mehrdad Create a new branch and checkout in new branch
3 git checkout master Checkout to master
4 git branch --help
git branch -h
Show helps for branch
5 git branch -a Show all branches in a project
6 git branch -d mehrdad Remove mehrdad branch
7 git remote -v View current remotes
8 git remote rm destination Remove remote

merge

انجام عملیات ترکیب branch ها

برای انجام ترکیب بین دو شاخه مثلا شاخه mehrdd و شاخه master ، کافی است ابتدا به شاخه master وارد شوید و سپس دستور git merge mehrdad را اجرا کنید. برای دیدن نتایج آن (که آیا merge به درستی صورت گرفته است یا خیر) می توانید پس از انجام این کار در شاخه master از دستور git log –graph استفاده کنید.

git merge mehrdad

push image

git log -graph

push image

بیان ساده ای از دستور merge

بعد از اتمام کار و نهایی شدن کد یک شاخه، لازم است کدهای شاخه با یک شاخه‌ی دیگه معمولاً (master) ترکیب شود. گاهی اوقات هم می‌خوایم تغییراتی که در یک شاخه‌ی سومی وجود داره را وارد شاخه‌ای که درحال کار در آن هستیم کنیم. در این مواقع باید از دستور merge استفاده کنیم. برای merge اول باید وارد شاخه‌ی مقصد بشویم(با دستورcheckout ) و سپس با دستور مناسب شاخه‌ی ثانویه رو با مقصد ترکیب کنیم.

git checkout dest
git merge source

نکته

اگر مشکلی اتفاق نیفتد merge ما به صورت fast-forward اتفاق می افتد. بدین معنی که بدون هیچ تداخلی (conflict) انجام می گیرد. در غیر اینصورت ابتدا باید کانفلیکت‌ها را برطرف کنیم (در قسمت های بعدی در برباره این مورد صحبت می کنیم) و بعد از اتمام یک کامیت merge انجام دهیم. با استفاده از پرچم ‎--no-ff می شود کاری کنیم که در هر صورت commit merge ساخته بشه. چه ادغام fast-forwardd باشه و بدون commit اضافه انجام بشه و چه تداخل اتفاق بیفته و commit merge ضروری باشد.

بازگردانی کارها با استفاده از دستورات گیت

در حین کار در پروژه خود، ممکن است نیاز داشته باشید تا در مراحل مختلف، تغییرات انجام شده را نادیده بگیرید و دوباره بخواهید فایل های قبلی خود را بازگردانی نمایید. در این حالت است که می باید از دستورات مربوط به undo کردن کارها در گیت استفاده کنید. برای این کار عموما از اشکال مختلف دستور reset استفاده می شود که در ادامه به صورت کامل به حالت های مختلف آن اشاره می کنیم.

بازگردانی تغییرات پیش از اضافه کردن فایل ها به Staging Area

این حالت زمانی اتفاق می افتد که شما تغییراتی را در فایل های خود انجام داده اید اما هنوز فایل های خود را به Staging Area اضافه یا همان add نکرده اید. مثلا فرض کنید فایل main.py را تغییر داده اید و بدون add کردن آن، تصمیم دارید تغییرات موجود را به حالت قبل بازگردانی کنید. در این حالت می توانید از دستورزیر استفاده کنید تا فایل مورد نظر به حالت قبل از تغییرات بازگردد.

git checkout -- main.py

push image

بازگردانی فایل ها، زمانی که در Staging Area می باشند

در این حالت شما به عنوان مثال تغییراتی را در فایل main.py انجام داده اید و آن را به Staging Area اضافه کرده اید. در این حالت برای بازگردانی فایل به Working Directory می توانید از دستور git reset HEAD به همراه نام فایل استفاده کنید. در واقع با انجام این دستور، شما فایل مورد نظر خود را Unstageکرده اید.

git reset HEAD main.py

نکته

با اجرای کد بالا فایل فقط از stage خارج می شود و برای حذف تغییرات باید دوباره دستور git checkout – main.py را بزنیم

push image

بازگردانی commit انجام شده به حالت Stage

فرض کنید که شما یک commit را انجام داده اید. برای بازگرداندن این commit به حالت stage (حالت قبل ازcommit ( درآورید، کافی است از دستور git reset –soft به همراه ID مربوط به آن commit استفاده کنید.در این حالت فایل هایی که commit کرده اید، به حالتstage باز گردانده خواهند شد.

git reset --soft  COMMITID

نکته

برای گرفتن لیست شناسه (id) لاگ ها از دستور git log استفاده کنید

push image

نکته

بازگردانی تغییرات commit شده به مرحله Working Space

در صورتی که بخواهید فایل های یک commit را به حالت Working Space بازگردانید، کافی است از دستور git reset –-mixed به همراه commit ID مربوط به آن استفاده کنید.

git reset --mixed  COMMITID

Add And Commit In One Line

commit کردن همه فایلهای موجود در stage

به طور همزمان، هم فایل ها راadd میکنیم و هم commit میکنیم و توضیحی برای commit قرار می دهیم.برای این منظور از سوییچ –am در دستور استفاده می کنیم

git commit -am  "commit message"

push image

Git UI

در بعضی مواقع دوست دارید به جای استفاده از محیط CLI از واسط گرافیکی یا به اصطلاح wizard برای کارهای مختلف استفاده کنید بدین منظور دستور زیر را در محیط cli تایپ کرده تا پنجره گرافیکی گیت برای شما باز گردد.

git gui 

push image

برای مشاهده لیست تغییرات (افزوده شده ها ، تغییر کرده ها و حذف شده ها) در ویزارد از منوی بالا قسمت commit و سپس قسمت Rescan را انتخاب می کنیم.

push image

حال لیست فایل های تغییر یافته در قسمت “Unstaged Changes“ قرار می گیرند مطابق با شکل زیر.(با کلیک روی هر فایل می توان تغییرات آنرا در روبه روی آن نیز دید.

push image

در مرحله بعدی برای انتقال لیست فایل ها از stage به repository (commit) باید مطابق شکل زیر از منو و قسمت commit قسمت Stage To Commit را انتخاب کنید.

push image

همانطور که در شکل زیر ملاحظه می کنید فایل ها در مخزن محلی قرار گرفته اند و بعد از تایپ یک پیغام برای commit روی دکمه کلیک می کنیم تا فرایند ذخیره در مخزن محلی نیز انجام گیرد. بعد از آن و با کلیک روی دکمه push نیز امکان ذخیره فایل ها در مخزن ریموت فراهم می شود.

push image

کلیک روی دکمه push و باز شدن ویزارد آن و انتخاب مخزن (اینجا master) فایل ها در مخزن اصلی نیز ذخیره می گردند. مطابق 2 شکل رو به رو

push image

push image

gitk vs git gui

در حالی که gitk به پیمایش و نمایش تاریخچه یک مخزن می پردازد ، git gui به پالایش شخصی commit و سابقه پروژه می پردازد

مزایای git gui

  1. راحتی در commit
  2. امکان merge ، push و pull

مزایای gitk

  1. نمایش تاریخچه و درخت git

push image

push image

نکته

با زدن دستور git gui دیگر محیط خط فرمان (cli) قابل استفاده نیست و تا بستن ویزارد قفل می شود برای باز کردن ویزارد در یک نخ (thread) جدا از دستور زیر استفاده کنید.

git-gui

gitk and git-gui document

branch in github

جهت ساخت یک شاخه (branch) جدید در پروژه روش های مختلفی وجود دارد. می توان با اجرای دستور زیر یک شاخه ساخت (بدون ورود به شاخه جدید). در دستور زیر branch1 نام شاخه می باشد. و می تواند هر نامی داشته باشد.

git branch branch1

push image

حال برای ورود به شاخه جدید باید از دستور checkout استفاده شود مطابق دستور و شکل زیر.

git checkout branch1

push image

بعد از ورود به شاخه با اجرای دستور merge می توان شاخه فوق را به روز کرد. البته اگه شاخه جدید باشد نیازی به این کار نیست زیرا شاخه جدید ایجاد شده است.

push image

حال با push کردن این شاخه جدید آنرا درمخزن remote هم ایجاد می کنیم مطابق 2 شکل زیر.

push image

push image

برای ایجاد یک شاخه و رفتن به داخل آن به فرم مستقیم از سوییچ –b در دستور chekout استفاده می شود. به دستور زیر توجه کنین که شاخه جدیدی به نام branch2 ایجاد کرده و بلافاصله به داخل آن می رویم.

git checkout -b branch2

push image

نکته

برای حذف یک شاخه از سوییچ –d استفاده می شود مطابق شکل زیر که شاخه branch1 در آن حذف گردیده است.

git branch -d branch1

push image

نکته

برای حذف یک شاخه که هنوز داخل آن merge اتفاق نیوفتاده است دقیقا مثل branch2 برای حذف از سوییچ –D استفاده می شود مطابق شکل زیر که شاخه branch2 در آن حذف گردیده است.

git checkout master
git branch -D branch2

بررسی یک مثال

فرض کنید مطابق شکل زیر ما در شاخه اصلی (master) هستیم. و در حال حاضر در commit با نام c2 قرار داریم.

push image

حال شاخه ای با نام branch1 را ساخته و وارد آن شاخه می شویم.

git checkout -b branch1

push image

در شاخه branch1 اقدام به ویرایش یک فایل به نام index.html کرده و commit می کنیم. (رفتن به مرحله c3 در شاخه branch1) و شاخه master در همان commit شماره c2 می ماند.

vim  index.html
git commit -a -m "generate index.html in branch1"

push image

حال دوباره به شاخه اصلی (master) بازگشته و اقدام به ایجاد یک شاخه جدید دیگری به نام branch2 می کنیم. و در داخل این شاخه اقدام به ویرایش فایل index.html کرده و آنرا هم commit می کنیم.

git checkout master
git checkout -b branch2
vim index.html
git commit -a -m "generate new index.html"

push image

حال به شاخه اصلی (master) بازگشته و با شاخه branch2 ادغام (merge) می کنیم مطابق با شکل زیر

git checkout master
git merge branch2

push image

حال اقدام به حذف شاخه branch2 کرده و سپس دوباره به شاخه branch1 بازگشته و فایل index.html را ویرایش کرده و سپس commit می کنیم (تولید commit جدیدی با نام c5)

git branch -d  branch2
git checkout branch1
vim index.html
git commit -a -m "modify index.html"

push image

حال به شاخه master بازگشته و این شاخه را با شاخه branch1 ادغام می کنیم. در صورت بروز conflict باید ابتدا مشکلات رفع گردد و سپس بعد رفع کردن مشکلات فایل را commit کنیم (ایجاد حالت c6)

git checkout master
git merge branch1
#  if occur conflicted here first fixed 
git commit -a -m "merge and commit"

push image

در نهایت نیز اقدام به حذف شاخه branch1 می کنیم.

git branch -d branch1

push image

اسم مستعار

در گیت نیز امکان تعریف اسم مستعار (alias) نیز وجود دارد. جهت ذخیره این اسم مستعار در کل ماشین کاربر از سوییچ –qlobal استفاده می شود. این نام ها درفایل مشخصی با نام .gitconfig قرار می گیرند که در ویندوز در مسیر %USERPROFILE%\.gitconfig و در سیستم عامل لینوکس در مسیر $HOME/.gitconfig قرار می گیرد. شما می توانید این فایل را باز کرده و به طور دستی مقادیر داخل آن را ویرایش کنید. ولی بهتر است با استفاده از دستور زیر اقدام به ویرایش این فایل کنید.

git config --global aliasName "git command name"

برای تعریف یک نام و ایمیل برای خود در git مشابه زیر دستورات را وارد کنید.

git config --global user.name  "Mehrdad Salehi"
git config --global user.email [email protected]

نکته

حال فرض کنید می خواهیم به جای دستور commit فقط 2 کلمه co را تایپ کنیم و همینطور به جای دستور checkout از 2 حرف ch استفاده کنیم. برای این منظور از دستور زیر استفاده می کنیم.

git config --global alias.co "commit"
git config --global alias.ch "checkout"	

نکته

البته می شود در فایل .gitconfig هم به فرم زیر این دستورات را اضافه کرد

[alias]
    co = commit
    ch = checkout

حال برای تست به مثال زیر توجه کنید

git co -m "insert new file"

نکته

البته می شود از دستورات هم در اینجا استفاده کرد به عنوان مثال برای خارج کردن فایل ها از stage می شود از خلاصه ساز زیر استفاده کرد.

git config --global alias.unstage "reset --"

مثال

git unstage

pull

در حقیقت وظیفه این دستور گرفتن تغییرات از مخزن راهدور (remote repository) و انتقال آن به مخزن محلی می باشد. مطابق با دستور زیر. (این دستور تغریبا معادل با دستور update در SVN می باشد.

git pull

نکته

البته می توان از 2 دستور زیر نیز که مشابه دستور pull هستند استفاده کرد.

git fetch 
git merge FETCH_HEAD

نکته

به طور دقیق تر ، pull ، سر شاخه بازیابی شده را به شاخه فعلی ادغام کند. با استفاده از سوییچ --rebase ، به جای ادغام git ، بازگرداندن (rebase) git را اجرا می کند.(به زودی در مورد دستور rebase صحبت می کنیم)

rebase

  1. Rebase روشی دیگر(مشابه با دستور merge) برای ادغام تغییرات از یک شاخه به یک شاخه دیگر است. Rebase تمام تغییرات را در یک وصله(patch) فشرده‌سازی کرده، و سپس وصله مورد نظر را در یک شاخه (branch) هدف ادغام می‌کند.

  2. Rebase کردن بر خلاف merge کردن، تاریخچه را از بین می برد به این خاطرکه ابزار کار تمکیل شده را از یک شاخه به یک شاخه دیگر منتقل می‌نماید. در این روند، تاریخچه مذکور ناخواسته از بین می‌رود.

  3. Rebaseها، نحوه منتقل شدن تغییرات از بالای سلسله مراتب به سمت پایین و mergeها هم نحوه جریان یافتن آن‌ها به سمت بالا هستند.

rebaseو mege هر دو برای یکپارچه سازی تغییرات از یک branch به branch دیگر طراحی شده اند اما هر یک به روش مختلفی این کار را انجام می دهند. در شکل زیر به branch ی که تغییرات در آن صورت گرفته و یا ويژگی های جدیدی به آن اضافه شده feature branch و به branch ی که می خواهیم روی آن ادغام انجام شود master branch می گوییم. برای مثال، بیاید در نظر بگیریم که ما commit هایی به صورت زیر داریم، نتیجه merge به صورت ترکیب commit ها خواهد بود در حالیکه rebase همه تغییرات در feature branch را از شروع آخرین commit از master branch اضافه می کند. مطابق شکل زیر

git remove file image

نکات مثبت

No توضیحات
1

یک تاریخچه پیچیده را ساده‌سازی می‌کند.

2

دستکاری یک commit تنها ساده است.

3

با تبدیل کردن commitهای حد واسط به یک commit تنها که می‌تواند برای گروه‌های توسعه دهنده کاربردی باشد، آن‌ها را مرتب می‌کند.

نکات منفی

No توضیحات
1

له کردن یک feature در قالب چند commit، می‌تواند زمینه را مخفی کند.

2

Rebase کردن مخازن عمومی می‌تواند در هنگام کار به عنوان یک تیم، خطرناک باشد.

3

کار بیشتری مورد نیاز است: استفاده از rebase برای بروز نگه داشتن شاخه ویژگی خود.

4

Rebase کردن با شاخه‌های کنترل از راه دور، نیاز دارد که شما آن را force push‌ کنید. بزرگ‌ترین مشکلی که افراد با آن مواجه می‌شوند، این است که force push کرده‌اند، اما git push default را تنظیم نکرده‌اند. این به یک سری بروزرسانی در تمام شاخه‌ها ختم می‌شود که نام مشابهی دارند، و این مسئله وحشتناک است.

نکته مهم

اگر شما به طور ناصحیحی rebase‌ می‌کنید و به طور غیر عمدی تاریخچه را بازنویسی می‌کنید، این موضوع می‌تواند به مشکلات جدی ختم شود؛ پس مطمئن شوید که می‌دانید چه کاری انجام می‌دهید.

شاخه feature را با استفاده از این دستورات، به یک شاخه اصلی rebase کنید:

قبل از rebase

git remove file image

git checkout feature
git rebase master

git remove file image

Rebase‌ کردن تعاملی

این کار دستکاری کردن commitها را همینطور که به شاخه جدید منتقل می‌شوند، ممکن می‌سازد و از rebase‌ کردن خودکار بسیار قدرتمندتر است؛ زیرا یک کنترل کامل را بر روی تاریخچه commit شاخه ارائه می‌دهد. معمولا این کار برای تمیز کردن یک تاریخچه به هم ریخته، قبل از ادغام یک شاخه ویژگی در قالب شاخه اصلی انجام می‌شود.

$ git checkout feature
$ git rebase -i master

این کار با لیست کردن تمام commitهایی که قرار است منتقل شوند، ویرایشگر را باز می‌کند.

pick 22d6d7c Commit message#1
pick 44e8a9b Commit message#2
pick 79f1d2h Commit message#3

این کد تعریف می‌کند که شاخه‌ها پس از اجرای rebase دقیقا چه ظاهری خواهند داشت. شما با بازچینی موجودیت‌ها می‌توانید تاریخچه را به هر شکلی که می‌خواهید در آورید. برای مثال، شما می‌توانید از دستوراتی مانند fixup، squash، edit و... به جای pick استفاده کنید.

مقدمه‌ای بر Git Merge و Git Rebase: این دو چه کاری انجام می‌دهند، و چه زمانی باید از آن‌ها استفاده کنیم؟

git remove file image

کجا از rebase و کجا از merge استفاده کنیم

No توضیحات
1

شما در حال توسعه‌دهی به طور محلی هستید: اگر شما کارتان را با هیچ کس به اشتراک نگذاشته‌اید. در اینجا، شما بهتر است rebase کردن را به merge کردن ترجیح دهید، تا تاریخچه خود را مرتب نگه دارید. اگر شما مخزن شخصی خود را دارید و آن را با کسی به اشتراک نگذاشته‌اید، به راحتی می‌توانید rebase کنید.

2

کد شما برای بازبینی آماده است: شما یک درخواست pull ساخته‌اید. افراد دیگر در حال بازبینی کار شما هستند. در اینجا، خوب نیست که کار خود را rebase کنید. شما باید commitهای rework بسازید و شاخه ویژگی‌‌های خود را بروزرسانی کنید. این کار به شما در قابلیت ردگیری در درخواست‌های pull کمک می‌کند و از اختلالات اتفاقی در تاریخچه جلوگیری می‌کند.

3

بازبینی انجام شده است و آماده ادغام با شاخه هدف است. تبریک! کم مانده است که شاخه ویژگی خود را حذف کنید. با توجه به این که توسعه دهندگان از این پس دیگر در این تغییرات fetch-merge نخواهند کرد، حال شما فرصت تصفیه کردن تاریخچه خود را دارید. در اینجا، شما می‌توانید تاریخچه مذکور را بازنویسی کنید و commitهای اصلی را fold کنید. ساخت یک merge خارجی برای این commitها اختیاری است، اما ارزشش را دارد. این کار وقتی که ویژگی‌ها به شاخه اصلی بروند را ضبط می‌کند.

بررسی یک مثال

git remove file image

حال کلیه اطلاعات را از مخزن اصلی در مخزن محلی بارگیری می کنیم با استفاده از دستور زیر

git pull

git remove file image

حال شاخه جدیدی در مخزن محلی با نام rebase-branch مطابق دستور زیر ایجاد می کنیم

git checkout –b rebase-branch

git remove file image

حال اقدام به commit می کنیم

همانطور که در شکل یر مشخص می شود یک state جدید ایجاد می شود

git commit –m ‘add new features’

git remove file image

حال فایل جدیدی به نام مثلا index.html را در پروژه اضافه می کنیم و در همین شاخه جدید آنرا commit می کنیم مطابق با دستورات و شکل زیر

git add index.html
git commit –m ‘add index.html’

git remove file image

حال فرض کنید در مخزن ریموت اصلی تغییر جدیدی داشتیم مطابق شکل زیر که یک گام به آن اضافه شده است.

git remove file image

حالا دوباره به شاخه master بازگشته

git checkout master

git remove file image

و اقدام به دریافت تغییرات جدید از مخزن ریموت مطابق دستور و شکل زیر می کنیم.

git pull

git remove file image

حال دوباره به شاخه rebase-branch باز می گردیم

git checkout rebase-branch

git remove file image

حال با اجرای دستور rebase مطابق دستور زیر ما به آخرین تغییرات در شاخه اصلی می رویم و تغییرات شاخه جاری یعنی rebase-branch را بعد از آخرین تغییرات در شاخه master قرار می دهیم

git rebase master

git remove file image

حال به شاخه master باز می گردیم

git checkout master

git remove file image

حالا با اجرای مجدد دستور rebase مطابق کد زیر تغیرات شاخه rebase-branch در ادامه تغییرات ما در شاخه master قرار می گیرد.

حال اگر مشکلی در شاخه ایجاد شد آنرا رفع کرده و نسخه را به اصطلاح stable می کنیم.

git rebase rebase-branch

git remove file image

در نهایت تغییرات را در شاخه اصلی هم قرار می دهیم.

git push

git remove file image

یکسری از دستورات کاربردی در گیت

No دستور توضیحات تصویر
1 git diff

با این دستور می‌توانید همه تغییرات فایل را به صورت محلی مشاهده کنید. یک نام فایل می‌تواند به آن الحاق شود تا تغییراتی را برای یک فایل نمایش دهد.

git remove file image
2 git blame my_file

با این دستور می‌بینید که چه کسی چه چیزی را در my_file(اسم یک فایل خاص) تغییر داده است.

git remove file image
3 git reflog

سابقه‌ای از تغییراتی که در Head مخزن محلی صورت گرفته است را نمایش می‌دهد. این دستور برای یافتن موارد حذف شده مفید است.

git remove file image
4 git config --global core.editor "atom --wait"

برای این که اصلا وارد ویرایشگر Vim نشوید، می‌توانید ویرایشگر پیش‌فرض خود را در Git تغییر دهید. برای نمونه برای تغییر ویرایشگر پیش‌فرض به Atom می‌توانید از دستور زیر استفاده کنید:

5 git config --global core.editor "'C:/Program Files (x86)/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

برای تعریف notepad++ به عنوان ادیتور پیش فرض به جای vim از دستور زیر استفاده کنید

6 git diff branch1...branch2
git diff branch1:file1 branch2:file1

برای گرفتن اختلاف بین 2 شاخه مثلا master و mehrdad از کدی شبیه git diff master…mehrdad استفاده می کنیم. (بین 2 نام شاخه 3 عدد نقطه قرار می دهیم). و برای گرفتن تفاوت بین یک فایل مشخص در 2 شاخه از علامت : بین نام شاخه و نام فایل استفاده می شود (branch_name:file_name) . فرض کنید فایلی به نام main.py داریم حال برای مشاهده اختلاف از دستور git diff master:main.py mehrdad:main.py استفاده می شود.

git remove file image

rm

این دستور برای حذف فایل ها از درخت جاری (مخزن محلی و شاخه مشخص) در گیت استفاده می شود. در نمونه زیر مشاهده می شود که 3 فایل package1.py ، package2.py و package3.py به طور همزمان از مخزن محلی حذف شدند.

git rm package{2..4}.py

git remove file image

نکته

برای حذف یک پوشه نیز از سوییچ –r استفادی می گردد به عنوان مثال اگر در مخزن خود پوشه ای با نام newFolder دارید برای حذف آن از دستور زیر استفاده گردد.

git rm -r --cached newFolder

stash

در حقیقت برای برگرداندن مخزن محلی خود (و در شاخه جاری مثلا master) به آخرین commit که انجام داده ایم (حذف تغییرات خودمان) از دستور زیر استفاده می کنیم.

git stash

git stash

clean

هدف از clean حذف فایل‌های ردگیری نشده (untracked files) از مخزن محلی می باشد. به بیان واضح تر فایل های که تا به حال به stage (با دستور git add ) اضافه نشده اند و فقط در مخزن محلی ایجاد گردیده اند را فایل های ردگیری نشده گویند. به صورت پیش‌فرض فایل‌های ردگیری نشده از سوی gitignore. حذف نخواهند شد. اما این حالت را می‌توان تغییر داد!

git clone

سوییچ های مهم این دستور

No سوییچ توضیحات
1 -n

یک اجرای آزمایشی پیش از حذف کردن هر چیزی است. در حقیقت برای اینکه ببینید چه چیزی را دارید حذف می کنید از این سوییچ استفاده می گردد

2 -f

حذف واقعی فایل‌ها

3 -d

حذف دایرکتوری‌های ردگیری نشده. در حقیقت اگر در گیت از مسیر مشخصی برای حذف استفاده نشده باشد. فایل های داخل پوشه های که untracked هستند حذف نمی شوند برای این مشکل ما از این سوییچ –d استفاده می کنیم تا کلیه فایل ها و پوشه های untrack را از مخزن محلی پاک کنیم

برای توضیحات بیشترفرض کنید فایلی به نام test.py را ساخته(فایل کاملا جدید) و آنرا ویرایش کرده اید. حالا اگر از دستور زیر استفاده کنید ملاحظه می شود که این فایل به فرم کامل از مخزن محلی حذف گردیده است.(untracked file)

git clean -f

git clean untracked files

نکته

برای این که درخت کاری(مخزن و شاخه جاری) تمیز بماند، باید دستور زیر را اجرا کنید. این دستور همه فایل‌ها و پوشه های که از سوی git ردگیری نمی‌شوند را حذف می‌کند.

git clean -df

و اگر می‌خواهید پیش از حذف ببینید که کدام فایل‌های ردگیری نشده حذف خواهند شد، در این صورت می‌توانید دستور زیر را اجرا کنید.

git clean –dn

نکته

اگر بخواهیم برخی فایل‌ها را حذف کنیم، فایل‌های ردگیری‌شده را می‌توان با استفاده از این دستور حذف کرد

git rm file-path

file-path هم مسیر و نام فایل حذفی می باشد (برای حذف بیش از یک فایل با جای خالی آنها را از هم جدا کنید.

نکته

اگر فایل شما در محیط staging باشد، در این صورت باید فلگ force را نیزبه آن اضافه کنید مانند دستور زیر.

git rm file-path -f

نکته

اگر بخواهید فایل‌های خاصی را از مخزن git حذف کنید. اما روی سیستم شما(مخزن محلی) همچنان باقی بمانند ، در این صورت می‌توانید دستور زیر را اجرا کنید.

git rm --cached file-path

git clone

Conflict

برای معرفی conflict و روش برطرف کردن آن با مثالی این مورد را بررسی می کنیم. فرض کنید فایل با نام file.txt را در شاخه master ایجاد کرده اید. و در ویرایش مقدار hello world را در آن درج کرده اید.در نهایت نیز این فایل را commit می کنیم.

git remove file image

git remove file image

git add file.txt
git commit -m "create file.txt"

حال شاخه جدیدی به نام feature/mehrdad را ایجاد کرده و در آن اقدام به ویرایش فایل file.txt مطابق با شکل های زیر می کنیم.

git checkout -b  feature/mehrdad

git remove file image

git remove file image

حالا در اینجا در شاخه feature/mehrdad اقدام به commit کردن کرده و دوباره به شاخه master باز می گردیم.

git checkout master

git remove file image

و بعد از اعمال تغییرات جدید بر روی فایل file.txt می پردازیم و بعد از commit تغییرات. حال اگه اقدام به merge کردن با شاخه feature/mehrdad کنیم با conflict مواجه می شویم.

git remove file image

git remove file image

git remove file image

بعد از اجرای دستور زیر با conflict مواجه می شویم.

git merge feature/mehrdad

همونطور که مشاهده میکنید بعد از اجرا کردن این دستور،git تلاش میکنه که بصورت اتوماتیک تغییرات file.txt رو ادغام یا merge کنه. ولی بخاطر اینکه هم در شاخه master و هم در شاخه feature/mehrdad تغییراتی بر روی یک خط از یک فایل داده شده است، git نمیدونه کدوم مورد رو در نظر بگیره و به همین دلیل merge بصورت کامل انجام نمیشه.در اینجا هست که وارد حالت MERGING میشیم و به همین دلیل هم شاخه master به master|MERGING تبدیل میشه و به این معنی هست که شما باید conflictها رو برطرف کنید و مجددا commit رو اجرا کنید.مطابق شکل زیر

git remove file image

حال فایل file.txt را جهت ویرایش باز می کنیم

git remove file image

کدهایی که بین خط ```<<<<<< HEAD``` و ```=======```قرار دارند، کدهایی هستند که در شاخه فعلی یا master قرار دارند و کدهایی که بین ```=======``` و ```>>>>>>> feature/mehrdad```وجود دارد، کدهایی هستند که در شاخه feature/mehrdad قرار داشته‌اند. این دو خط همان دو خطی هستند که conflict در آنها رخ داده است.شما باید بین این دو کد یکی رو انتخاب کنید و دیگری رو بصورت دستی حذف کنید. همچنین میتونین بسته به شرایط پروژتون، هر دو مورد رو حذف یا هر دو مورد رو نگه دارید.

git remove file image

حال فایل را تغییر داده و ذخیره می کنیم مطابق شکل زیر

git remove file image

خب تا اینجا merge conflict رو برطرف کردیم و حالا اگر merge conflict دیگری هم وجود داشته باشه، باید اونا رو هم به همین صورت برطرف کنیم. زمانی که همه merge conflictها رو برطرف کردید، باید دستور git commit رو اجرا کنید تا تغییرات مورد نظر انجام بشه و merge بصورت کامل انجام بشه و از حالت MERGING خارج بشیم.و دوباره به شاخه master برگردیم مطابق با شکل زیر

git add file.txt &&  git commit -m "merge conflict"

git remove file image

با اجرای این دستور به شاخه master باز می گردیم

git remove file image

نکته

برای مشاهده لیست conflict ها (فایل های دارای تداخل) در گیت وقتی به حالت MERGING وارد می شوید از دستور زیر استفاده کنید.

git diff --name-only --diff-filter=U

git remove file image

چند خطای مهم در گیت

No خطا توضیحات
1 Please commit your changes or stash them before you switch branches. Aborting

دلیل این خطا این است که .شما نمی توانید با تغییرات محلی ادغام شویدبرای رفع این مشکل شما 3 انتخاب دارید.

  • تغییرات خود را commit کنید مطابق دستور git commit –m “my message”

  • ذخیره کردن(stash) . در حقیقت عملیات stashing مثل یک پشته عمل می کند(در بالا توضیح داده شد). و تغییرات را ماننده پشته به ترتیب معکوس در آن قرار دهید (push).برای این کار ابتدا تایپ کنید git stash و بعد برای درج (pull) در stash دستور git stash pop را تایپ کنید

  • صرفنظر از تغییرات محلی: برای اینکه تغییرات خود را لغو کنید یا دستور git reset --hard را وارد کنید و یا دستور git checkout –t –f filename برای لغو تغییرات فایل مورد نظر (filename هم نام فایل مشخص است)

git mergetool

فرض کنید که دو شاخه master و feature/mehrdad در فایلی به نام test.txt مشکل دارند.و دچار conflict شده اند. برای دیدن ای مشکل از mergetool استفاده می شود.

git remove file image

git mergetool

با تایپ این دستور در bash صفحه ای مطابق شکل زیر باز می گردد. که دارای 3 بخش است 2 بخش کنار شاخه های هستند که دچار conflict شده اند و برای همین فایل می باشند. و قسمت مرکز هم مربوط به شاخه master|MERGE که دچار تناقض شده است . این دقیقا همان ادیتور vim می باشد و شما با تایپ کلمه i می توانید اقدام به تغییر فایل مرکزی کرده و بعد از رفع مشکل آنرا ذخیره کنید (زدن دکمه esc و تایپ :wqa برای خروج)

git remove file image

نکته

در شکل می توان هر 3 بخش را تغییر داد قسمتی که در زیر آن خط نوار سفید وجود دارد فعال می باشد (پیش فرض قسمت مرکز) و برای تغییر فایل فعال باید از کلمات ترکیبی ctrl + w تا بین این 3 بخش سوییچ کرد و با زدن دکمه i وارد حالت ویرایش گردید.

ویرایشگرmergetool پیش فرض vimdiff می باشد که در صورت عدم آن با اجرای دستورات زیر به عنوان پیش فرض برای گیت شناخته می شود.

git config --global merge.tool vimdiff
git config --global merge.conflictstyle diff3
git config --global mergetool.prompt false

About

education git

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages