ব্যবহার করে gitk log
, আমি দুজনের মধ্যে কোনও পার্থক্য চিহ্নিত করতে পারি না। আমি কীভাবে পার্থক্যটি পর্যবেক্ষণ করতে পারি (গিট কমান্ড বা কোনও সরঞ্জাম দিয়ে)?
ব্যবহার করে gitk log
, আমি দুজনের মধ্যে কোনও পার্থক্য চিহ্নিত করতে পারি না। আমি কীভাবে পার্থক্যটি পর্যবেক্ষণ করতে পারি (গিট কমান্ড বা কোনও সরঞ্জাম দিয়ে)?
উত্তর:
--no-ff
পতাকা প্রতিরোধ git merge
একটি "দ্রুত-ফরোয়ার্ড" নির্বাহ যদি এটা সনাক্ত করে যে আপনার বর্তমান থেকে HEAD
কমিট আপনি একত্রীকরণ করার চেষ্টা করছেন পূর্বপুরুষ। একটি দ্রুত অগ্রসর হয় যখন, মার্জ কমিট নির্মাণের পরিবর্তে, গিটটি কেবল আপনার শাখা পয়েন্টারকে আগত কমিটের দিকে নির্দেশ করে। git pull
কোনও স্থানীয় পরিবর্তন ছাড়াই এটি করার সময় এটি সাধারণত ঘটে থাকে ।
যাইহোক, মাঝে মাঝে আপনি এই আচরণটি হতে আটকাতে চান, সাধারণত কারণ আপনি একটি নির্দিষ্ট শাখা টপোলজি বজায় রাখতে চান (উদাহরণস্বরূপ আপনি কোনও বিষয় শাখায় মার্জ করছেন এবং আপনি ইতিহাস পড়ার সময় সেভাবে দেখছেন তা নিশ্চিত করতে চান)। অর্ডার যে কি জন্য, আপনাকে প্রেরণ করতে পারেন --no-ff
পতাকা এবং git merge
হবে সবসময় ফাস্ট-ফরোয়ার্ড পরিবর্তে একটি একত্রীকরণ গঠন করা।
একইভাবে, আপনি যদি স্পষ্টভাবে দ্রুত-ফরওয়ার্ডের জন্য কোনও কার্যকর করতে চান git pull
বা ব্যবহার git merge
করতে চান এবং আপনি যদি তা দ্রুত অগ্রসর করতে না পারেন তবে আপনি জামিন দিতে চান তবে আপনি --ff-only
পতাকাটি ব্যবহার করতে পারেন । এইভাবে আপনি নিয়মিত কিছু git pull --ff-only
না ভাবার মতো কিছু করতে পারেন এবং তারপরে যদি এটির ত্রুটি থেকে যায় তবে আপনি ফিরে যেতে পারেন এবং সিদ্ধান্ত নিতে পারেন আপনি মার্জ বা পুনর্বাসিত করতে চান কিনা।
gitk
বা git log --graph
দ্রুত-ফরোয়ার্ড একীভূত হওয়ার ফলে মার্জ কমিট তৈরি হয় নি, যখন নন-ফাস্ট-ফরওয়ার্ড করেছে did
--no-ff
কোনও বৈশিষ্ট্য থেকে মাস্টার বিকাশ বা বিকাশ করা কি একটি অনুরোধ মার্জ করার অনুরূপ?
--no-ff
।
এখানে একটি স্পষ্ট ব্যাখ্যা এবং ব্যবহারের গ্রাফিকাল চিত্র সহ একটি সাইট রয়েছে git merge --no-ff
:
আমি এটি না হওয়া পর্যন্ত আমি গিট দিয়ে পুরোপুরি হারিয়ে গেলাম। ব্যবহার করে --no-ff
ইতিহাসের পর্যালোচনা করা কাউকে আপনি যে শাখায় কাজ করেছেন সেটিকে পরিষ্কারভাবে দেখতে দেয় । (সেই লিঙ্কটি গিথুবের "নেটওয়ার্ক" ভিজ্যুয়ালাইজেশন সরঞ্জামের দিকে নির্দেশ করে) এবং এখানে চিত্রের সাথে আরও একটি দুর্দান্ত রেফারেন্স দেওয়া হয়েছে। এই রেফারেন্সটি গিটের সাথে কম পরিচিত যারা তাদের উপর আরও বেশি মনোযোগ দিয়ে প্রথমটিকে সুন্দরভাবে পরিপূরক করে।
আপনি যদি আমার মতো হন এবং গিটগুরু না হয়ে থাকেন তবে আমার উত্তর এখানে গিটারের ট্র্যাকিং থেকে ফাইলগুলি স্থানীয় ফাইল সিস্টেম থেকে মুছে না ফেলে মুছে ফেলার বিষয়টি বর্ণনা করে যা নথিভুক্ত মনে হয় তবে প্রায়শই ঘটে থাকে। আর একটি নতুন পরিস্থিতি বর্তমান কোড পাচ্ছে , যা এখনও আমাকে সরিয়ে দেয়।
আমি আমার ওয়েবসাইটে একটি প্যাকেজ আপডেট করেছি এবং আমার কর্মপ্রবাহ দেখতে আমার নোটগুলিতে ফিরে যেতে হয়েছিল; আমি এই উত্তরে একটি উদাহরণ যুক্ত করা দরকারী বলে মনে করি।
গিট কমান্ডগুলির আমার কর্মপ্রবাহ:
git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master
নীচে: ব্যাখ্যা সহ প্রকৃত ব্যবহার।
দ্রষ্টব্য: নীচের আউটপুটটি কেটে গেছে; গিট বেশ ভার্জোজ।
$ git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ecc/Desktop.php
# modified: ecc/Mobile.php
# deleted: ecc/ecc-config.php
# modified: ecc/readme.txt
# modified: ecc/test.php
# deleted: passthru-adapter.igs
# deleted: shop/mickey/index.php
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# ecc/upgrade.php
# ecc/webgility-config.php
# ecc/webgility-config.php.bak
# ecc/webgility-magento.php
উপরে থেকে 3 টি বিষয় লক্ষ্য করুন:
1) আউটপুটটিতে আপনি নতুন ফাইল সংযোজন সহ ইসিসি প্যাকেজের আপগ্রেড থেকে পরিবর্তনগুলি দেখতে পাবেন।
2) এছাড়াও লক্ষ্য করুন যে দুটি ফাইল রয়েছে ( /ecc
ফোল্ডারে নেই) আমি এই পরিবর্তনটি থেকে আলাদা করে মুছে ফেলেছি। এই ফাইলগুলি মুছে ফেলার সাথে বিভ্রান্ত করার পরিবর্তে, এই ফাইলগুলির মোছা প্রতিবিম্বিত ecc
করতে আমি cleanup
পরে একটি আলাদা শাখা তৈরি করব ।
৩) আমি আমার ওয়ার্কফ্লো অনুসরণ করিনি! আমি ইসি আবার কাজ করার চেষ্টা করার সময় গিট সম্পর্কে ভুলে গিয়েছিলাম।
নীচে: git commit -am "updated ecc package"
আমি সাধারণত সমস্ত অন্তর্ভুক্ত করার চেয়ে আমি কেবল /ecc
ফোল্ডারে ফাইলগুলি যুক্ত করতে চেয়েছিলাম । মুছে ফেলা ফাইলগুলি বিশেষত আমার অংশ ছিল না git add
, তবে সেগুলি ইতিমধ্যে গিটের উপর নজর রাখা হয়েছিল, তাই আমাকে এই শাখার প্রতিশ্রুতি থেকে অপসারণ করতে হবে:
$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M passthru-adapter.igs
M shop/mickey/index.php
$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"
$ git checkout master
D passthru-adapter.igs
D shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
8a0d9ec..333eff5 master -> master
এই প্রক্রিয়াটি দিনে 10+ বার ব্যবহার করে, আমি কমান্ডগুলি কার্যকর করতে ব্যাচ স্ক্রিপ্টগুলি লেখার চেষ্টা করেছি, সুতরাং git_update.sh <branch> <"commit message">
উপরের পদক্ষেপগুলি করার জন্য আমি একটি প্রায় যথাযথ স্ক্রিপ্ট তৈরি করেছি । এখানে সেই লিপির জন্য গিস্ট উত্স source
পরিবর্তে git commit -am
আমি উত্পাদিত "পরিবর্তিত" তালিকা থেকে ফাইলগুলি নির্বাচন করছি git status
এবং তারপরে এই স্ক্রিপ্টের মধ্যে আটকানো past এটি প্রায়শই ঘটেছিল কারণ আমি কয়েক ডজন সম্পাদনা করেছি তবে পরিবর্তিত গোষ্ঠীগুলির জন্য বিভিন্ন শাখার নাম চেয়েছি।
--no-ff
বিকল্পের সাথে একত্রীকরণের পরেও আপনি কী নিরাপদে কোনও শাখা মুছে ফেলতে পারবেন ?
সুস্পষ্ট মার্জ : একটি নতুন মার্জ কমিট তৈরি করে। (আপনি যদি ব্যবহার করেন তবে এটিই পাবেন --no-ff
))
দ্রুত ফরোয়ার্ড মার্জ: নতুন প্রতিশ্রুতি না তৈরি করে দ্রুত ফরওয়ার্ড করুন:
রিবেস : একটি নতুন বেস স্তর স্থাপন করুন:
স্কোয়াশ: জোর দিয়ে এমন কিছু পিষে বা কষান (এমন কিছু) যাতে এটি সমতল হয়:
--no-ff
বিকল্প নিশ্চিত একটি দ্রুত অগ্রসর একত্রীকরণ ঘটতে করবে না, এবং যে একটি নতুন কমিট বস্তুর সবসময় তৈরি করা হবে । বৈশিষ্ট্যযুক্ত শাখার ইতিহাস বজায় রাখতে গিটটি চাইলে এটি আকাঙ্ক্ষিত হতে পারে।
উপরের চিত্রটিতে, বাম দিকটি ব্যবহারের পরে গিট ইতিহাসের একটি উদাহরণ git merge --no-ff
এবং ডান দিকটি git merge
যেখানে ff মার্জ সম্ভব হয়েছিল তা ব্যবহারের একটি উদাহরণ ।
সম্পাদনা : এই চিত্রের পূর্ববর্তী সংস্করণটি মার্জ কমিটের জন্য কেবলমাত্র একক পিতামাতাকে নির্দেশ করেছে। মার্জ কমিটের একাধিক পিতামাতার কমিট রয়েছে যা গিটটি "বৈশিষ্ট্য শাখা" এবং মূল শাখার ইতিহাস বজায় রাখতে ব্যবহার করে । একাধিক প্যারেন্ট লিঙ্কগুলি সবুজতে হাইলাইট করা হয়েছে।
এটি একটি পুরানো প্রশ্ন, এবং এটি অন্যান্য পোস্টে কিছুটা সূক্ষ্মভাবে উল্লেখ করা হয়েছে, তবে আমার জন্য এই ক্লিকটি যে ব্যাখ্যাটি করেছে তা হ'ল দ্রুত ফরোয়ার্ড মার্জগুলির জন্য পৃথক প্রতিশ্রুতি প্রয়োজন ।
git merge --no-ff ecc
আপনার git log
শাখা মাস্টারের জন্য একটি অতিরিক্ত মার্জ কমিট থাকবে । এটি মাসিক কমিটের সরাসরি পূর্বপুরুষের দিকে ইঙ্গিত করার ক্ষেত্রে প্রযুক্তিগতভাবে প্রয়োজন হয় না - তবে --no-ff বিকল্পটি উল্লেখ করে আপনি সেই সংহত প্রতিশ্রুতি তৈরি করতে বাধ্য করছেন। এটির শিরোনাম থাকবে:Merge branch 'ecc'