সারসংক্ষেপ
ডিফল্টরূপে, git pullমার্জ কমিটগুলি তৈরি করে যা কোড ইতিহাসে শব্দ এবং জটিলতা যুক্ত করে। তদুপরি, pullআপনার পরিবর্তনগুলি কীভাবে আগত পরিবর্তনগুলির দ্বারা প্রভাবিত হতে পারে সে সম্পর্কে ভাবা সহজ করে তোলে।
git pullকমান্ড এতক্ষণ যেমন শুধুমাত্র দ্রুত এগিয়ে মার্জ সঞ্চালিত নিরাপদ। যদি git pullকেবলমাত্র দ্রুত-ফরোয়ার্ড মার্জগুলি করার জন্য কনফিগার করা থাকে এবং যখন দ্রুত-ফরোয়ার্ড একীকরণ সম্ভব হয় না, তবে গিট একটি ত্রুটি সহ প্রস্থান করবে। এটি আপনাকে আসন্ন কমিটগুলি অধ্যয়ন করার সুযোগ দেবে, তারা কীভাবে আপনার স্থানীয় কমেটগুলিকে প্রভাবিত করতে পারে সে সম্পর্কে ভাবুন এবং সর্বোত্তম পদক্ষেপের (মার্জ, রিবেস, রিসেট ইত্যাদি) সিদ্ধান্ত নেবেন।
গিট ২.০ এবং আরও নতুন দিয়ে আপনি চালাতে পারবেন:
git config --global pull.ff only
ডিফল্ট আচরণটি কেবল দ্রুত-ফরওয়ার্ডে পরিবর্তন করতে। 1.6.6 থেকে 1.9.x এর মধ্যে গিট সংস্করণগুলির সাথে আপনাকে টাইপ করার অভ্যাসে পড়তে হবে:
git pull --ff-only
যাইহোক, গিটের সমস্ত সংস্করণ সহ, আমি git upএটির মতো একটি উপন্যাস কনফিগার করার পরামর্শ দিচ্ছি :
git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'
এবং git upপরিবর্তে ব্যবহার git pull। আমি এই উরফটিকে বেশি পছন্দ করি git pull --ff-onlyকারণ:
- এটি গিটের সমস্ত (অ-প্রাচীন) সংস্করণের সাথে কাজ করে,
- এটি সমস্ত প্রবাহ শাখা নিয়ে আসে (আপনি বর্তমানে যে শাখায় কাজ করছেন কেবল তা নয়) এবং
- এটি পুরানো
origin/*শাখাগুলি পরিষ্কার করে যা প্রবাহের আর অস্তিত্ব নেই।
সমস্যা git pull
git pullএটি সঠিকভাবে ব্যবহার করা হলে খারাপ নয়। গিটের সাম্প্রতিক কয়েকটি পরিবর্তন git pullসঠিকভাবে ব্যবহার করা সহজ করেছে , তবে দুর্ভাগ্যক্রমে একটি সমভূমির ডিফল্ট আচরণে git pullবেশ কয়েকটি সমস্যা রয়েছে:
- এটি ইতিহাসে অপ্রয়োজনীয় ননলাইনারিটির পরিচয় দেয়
- এটি দুর্ঘটনাক্রমে যে প্রবণতাগুলি ইচ্ছাকৃতভাবে প্রবাহিত হয়ে প্রবাহিত হয়েছিল তাদের পুনঃপ্রবর্তন করা সহজ করে তোলে
- এটি আপনার কর্ম ডিরেক্টরিকে অনির্দেশ্য উপায়ে পরিবর্তন করে
- অন্য কারুর কাজ পর্যালোচনা করতে আপনি যা করছেন তা বিরতি দেওয়া বিরক্তিকর
git pull
- এটি রিমোট শাখায় সঠিকভাবে রিবেস করা শক্ত করে তোলে
- এটি দূরবর্তী রেপোতে মুছে ফেলা শাখাগুলি পরিষ্কার করে না
এই সমস্যাগুলি নীচে আরও বিস্তৃতভাবে বর্ণিত হয়েছে।
ননলাইনারের ইতিহাস
ডিফল্টরূপে, git pullকমান্ডটি git fetchঅনুসরণ করার পরে চলমান সমান git merge @{u}। স্থানীয় সংগ্রহস্থলে যদি চাপবিহীন কমিট থাকে তবে এর মার্জ অংশটি git pullমার্জ কমিট তৈরি করে।
মার্জ কমিট সম্পর্কে অন্তর্নিহিত খারাপ কিছুই নেই, তবে সেগুলি বিপজ্জনক হতে পারে এবং শ্রদ্ধার সাথে তাদের আচরণ করা উচিত:
- মার্জ কমিটগুলি পরীক্ষা করা সহজাতভাবে কঠিন। মার্জ কী করছে তা বোঝার জন্য আপনাকে সমস্ত পিতামাতার মধ্যে পার্থক্য বুঝতে হবে। একটি প্রচলিত ডিফ এই বহুমাত্রিক তথ্যটি ভালভাবে প্রকাশ করে না। বিপরীতে, সাধারণ কমিটের একটি সিরিজ পর্যালোচনা করা সহজ।
- সংঘাতের সমাধানটি একত্রিত করা জটিল এবং ভুলগুলি প্রায়শই দীর্ঘ সময়ের জন্য সনাক্ত করা যায় কারণ মার্জ কমিটগুলি পর্যালোচনা করা শক্ত are
- মার্জগুলি নিয়মিত কমিটের প্রভাবকে নিঃশব্দে ফেলে দিতে পারে। কোডটি আর বর্ধিত কমিটের যোগফল নয়, যা আসলে কী পরিবর্তিত হয়েছিল সে সম্পর্কে ভুল ধারণা to
- মার্জ কমিটস কিছু অবিচ্ছিন্ন ইন্টিগ্রেশন স্কিমগুলিকে ব্যাহত করতে পারে (যেমন, দ্বিতীয় অভিভাবকরা অসম্পূর্ণ কাজগুলি অগ্রগতিতে নির্দেশ করে বলে ধারনা করা কনভেনশনের আওতায় কেবল প্রথম-পিতা-মাতার পথটি স্বয়ংক্রিয়ভাবে তৈরি করুন)।
অবশ্যই একত্রীকরণের জন্য একটি সময় এবং জায়গা রয়েছে তবে মার্জ কখন করা উচিত এবং কখন ব্যবহার করা উচিত নয় তা বোঝা আপনার ভাণ্ডারের কার্যকারিতা উন্নত করতে পারে।
নোট করুন যে গিটের উদ্দেশ্যটি কোনও কোডবেসের বিবর্তনকে ভাগ করে নেওয়া এবং গ্রাস করা সহজ করা, ইতিহাসটি যেমন প্রকাশিত হয়েছিল ঠিক তেমন রেকর্ড করা নয়। (যদি আপনি মতানৈক্য করেন তবে rebaseআদেশটি বিবেচনা করুন এবং এটি কেন তৈরি হয়েছিল)) তৈরি হওয়া মার্জ কমিটগুলি git pullঅন্যের কাছে দরকারী শব্দার্থক শব্দগুলি প্রকাশ করে না — তারা কেবল বলে যে আপনার পরিবর্তনগুলি সম্পন্ন করার আগে অন্য কেউ ভাণ্ডারটিতে ধাক্কা দিয়েছিল। এই সংযুক্তিগুলি কেন অন্যদের কাছে অর্থবহ না হলে এবং বিপজ্জনক হতে পারে যদি তা কমিট করে?
git pullমার্জ করার পরিবর্তে পুনরায় কনফিগার করা সম্ভব , তবে এতেও সমস্যা রয়েছে (পরে আলোচনা করা হয়েছে)। পরিবর্তে, git pullশুধুমাত্র দ্রুত-ফরোয়ার্ড মার্জগুলি করতে কনফিগার করা উচিত।
রিবেসড আউট কমিটগুলির পুনঃপ্রবর্তন
মনে করুন যে কেউ একটি শাখা রিবাজ করে এবং জোর করে এটি ঠেলে দেয়। এটি সাধারণত হওয়া উচিত নয়, তবে এটি কখনও কখনও প্রয়োজনীয় হয় (উদাহরণস্বরূপ, একটি 50GiB লগ ফাইল অপসারণ করা যা দুর্ঘটনাক্রমে কমিট করা এবং ধাক্কা দেওয়া হয়েছিল)। সম্পন্ন git pullমার্জটি আপস্ট্রিম শাখার নতুন সংস্করণটিকে পুরানো সংস্করণে মার্জ করবে যা এখনও আপনার স্থানীয় সংগ্রহস্থলে বিদ্যমান। আপনি যদি ফলাফলটি চাপ দেন তবে পিচ কাঁটাচামচ এবং মশালীরা আপনার পথে আসতে শুরু করবে।
কেউ কেউ তর্ক করতে পারে যে আসল সমস্যাটি ফোর্স আপডেট। হ্যাঁ, সাধারণত যখনই সম্ভব শক্তি প্রয়োগ করা এড়াতে পরামর্শ দেওয়া হয় তবে তারা কখনও কখনও অনিবার্য থাকে। বিকাশকারীদের অবশ্যই ফোর্স আপডেটগুলি মোকাবেলায় প্রস্তুত থাকতে হবে, কারণ তারা কখনও কখনও ঘটবে। এর অর্থ কোনও সাধারণের মাধ্যমে অন্ধভাবে পুরানো কমিটগুলিতে মার্জিন হওয়া নয় git pull।
সারপ্রাইজ ওয়ার্কিং ডিরেক্টরি পরিবর্তন
কাজ না git pullকরা অবধি ওয়ার্কিং ডিরেক্টরি বা সূচকটি কেমন হবে তা পূর্বাভাস দেওয়ার কোনও উপায় নেই । আপনি অন্য কিছু করার আগে সমাধান করতে হবে এমন একত্রীকরণের দ্বন্দ্ব থাকতে পারে, এটি আপনার কার্যকরী ডিরেক্টরিতে একটি 50GiB লগ ফাইলের প্রবর্তন করতে পারে কারণ কেউ দুর্ঘটনাক্রমে এটি চালিত করে, এটি যে ডিরেক্টরিতে আপনি কাজ করছেন তার নাম পরিবর্তন করতে পারে ইত্যাদি।
git remote update -p(বা git fetch --all -p) আপনি মার্জ বা রিবেস করার সিদ্ধান্ত নেওয়ার আগে আপনাকে অন্য ব্যক্তির প্রতিশ্রুতিগুলি দেখার অনুমতি দেয়, আপনাকে পদক্ষেপ নেওয়ার আগে একটি পরিকল্পনা তৈরি করতে দেয়।
অন্যান্য জনগণের কমিটগুলি পর্যালোচনা করতে অসুবিধা
ধরুন আপনি কিছু পরিবর্তন আনার মাঝে রয়েছেন এবং অন্য কেউ চান যে তারা কিছুটা চাপিয়ে দিয়েছিল তা পর্যালোচনা করতে পারে। git pullএর মার্জ (বা পুনর্বাসনা) ক্রিয়াকলাপটি কার্যকরী ডিরেক্টরি এবং সূচকে পরিবর্তন করে যার অর্থ আপনার কার্যকরী ডিরেক্টরি এবং সূচকটি অবশ্যই পরিষ্কার হতে হবে।
আপনি git stashএবং তারপর ব্যবহার করতে পারেন git pull, কিন্তু আপনি যখন পর্যালোচনা সম্পন্ন করবেন তখন কি করবেন? আপনি যেখানে ছিলেন সেখানে ফিরে পেতে আপনাকে তৈরি করা মার্জটি পূর্বাবস্থায় ফেলা git pullএবং স্ট্যাশ প্রয়োগ করতে হবে।
git remote update -p(বা git fetch --all -p) কার্যনির্বাহী ডিরেক্টরি বা সূচকটি সংশোধন করে না, তাই এটি যে কোনও সময় চালানো নিরাপদ you এমনকি আপনি পর্যায়ক্রমে এবং / অথবা অবিরত পরিবর্তনগুলি রেখেছেন। আপনি যা করছেন তা থামিয়ে দিতে এবং আপনি যে প্রতিশ্রুতি নিয়ে কাজ করছেন তা শেষ করার বিষয়ে চিন্তা না করে আপনি কারও প্রতিশ্রুতি পর্যালোচনা করতে পারেন। git pullআপনি যে নমনীয়তা দেয় না।
একটি রিমোট শাখায় মুক্তি
একটি সাধারণ গিট ব্যবহারের প্যাটার্নটি হল git pullসর্বশেষ পরিবর্তনগুলি আনার জন্য একটি অনুসরণ করা git rebase @{u}এবং তারপরে যে মার্জ কমিট git pullচালু হয়েছিল তা দূর করার জন্য । এটা সাধারণ যথেষ্ট যে গীত কিছু কনফিগারেশন অপশন কহন দ্বারা একটি একক পদক্ষেপ এইসব দুই ধাপ কমাতে গেছে git pullমার্জ পরিবর্তে একটি রি-বেসের ফলে সম্পাদন করতে (দেখুন branch.<branch>.rebase, branch.autosetuprebaseএবং pull.rebaseঅপশন)।
দুর্ভাগ্যক্রমে, যদি আপনার একটি চাপবিহীন মার্জ কমিট থাকে যা আপনি সংরক্ষণ করতে চান (যেমন, একটি প্রতিশ্রুতিবদ্ধভাবে একটি ধাক্কা দেওয়া বৈশিষ্ট্য শাখাটি মার্জ করে master), না কোনও রিবাস-পুল ( সেট git pullসহ ) বা একটি মার্জ-পুল (ডিফল্ট আচরণ) অনুসরণ করবে না রিবেস কাজ করবে। এর কারণ হ'ল বিকল্পটি ব্যতীত মার্জগুলি (এটি ডাগকে লিনিয়ারাইজ করে) বাদ দেয় । রিবাজ-পুল অপারেশনটি মার্জগুলি সংরক্ষণের জন্য কনফিগার করা যায় না, এবং একটি মার্জ-পুলের পরে মার্জ- পুলের ফলে সংযুক্তিটি মুছে ফেলা হবে না। আপডেট: গিট v1.8.5 যুক্ত এবং । এই প্রবাহটি আপস্ট্রি কমিটগুলি আনার পরে করণীয় । ( মাথা উঁচু করার জন্য ফানকাস্টারকে ধন্যবাদ !)branch.<branch>.rebasetruegit pullgit rebase--preserve-mergesgit rebase -p @{u}git pull --rebase=preservegit config pull.rebase preservegit pullgit rebase --preserve-merges
মুছে ফেলা শাখা পরিষ্কার করা
git pullদূরবর্তী সংগ্রহস্থল থেকে মুছে ফেলা শাখাগুলির সাথে সম্পর্কিত দূরবর্তী ট্র্যাকিং শাখাগুলি ছাঁটাই করে না। উদাহরণস্বরূপ, যদি কেউ fooরিমোট রেপো থেকে শাখা মুছে ফেলেন তবে আপনি এখনও দেখতে পাবেন origin/foo।
এর ফলে ব্যবহারকারীরা দুর্ঘটনাক্রমে নিহত শাখাগুলি পুনরুত্থিত করে কারণ তারা মনে করে যে তারা এখনও সক্রিয় রয়েছে।
একটি ভাল বিকল্প: git upপরিবর্তে ব্যবহার করুনgit pull
পরিবর্তে git pull, আমি নিম্নলিখিত git upউপন্যাসটি তৈরি এবং ব্যবহার করার পরামর্শ দিচ্ছি :
git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'
এই উরফটি সমস্ত প্রবাহ শাখা (মৃত শাখাগুলি ছাঁটাই করে) থেকে সর্বশেষতম কমিটগুলি ডাউনলোড করে এবং স্থানীয় শাখাটি উজানের শাখায় সর্বশেষ প্রতিশ্রুতিতে দ্রুত-ফরোয়ার্ড করার চেষ্টা করে। যদি সফল হয়, তবে কোনও স্থানীয় প্রতিশ্রুতি ছিল না, সুতরাং মার্জ সংঘাতের ঝুঁকি ছিল না। স্থানীয় (শৃঙ্খলাবদ্ধ) কমান্ট থাকলে দ্রুত অগ্রগতি ব্যর্থ হবে, আপনাকে পদক্ষেপ নেওয়ার আগে উজানের ধারাগুলি পর্যালোচনা করার সুযোগ দেয়।
এটি এখনও আপনার কার্যনির্বাহী ডিরেক্টরিটিকে অপ্রত্যাশিত উপায়ে পরিবর্তন করে তবে কেবল আপনার যদি স্থানীয় কোনও পরিবর্তন না হয়। বিপরীতে git pull, git upকখনই আপনাকে কোনও সংশ্লেষের বিরোধের সমাধানের প্রত্যাশায় কোনও প্রম্পটে ফেলবে না।
অন্য বিকল্প: git pull --ff-only --all -p
নিম্নলিখিত উপরের git upউরফটির বিকল্প রয়েছে :
git config --global alias.up 'pull --ff-only --all -p'
এই সংস্করণটির git upপূর্ববর্তী git upউরফের মতোই আচরণ রয়েছে , বাদে:
- আপনার স্থানীয় শাখা একটি উজানের শাখার সাথে কনফিগার করা না থাকলে ত্রুটি বার্তাটি আরও কিছুটা ক্রিপ্টিক is
- এটি একটি অননুমোদিত বৈশিষ্ট্য (
-pআর্গুমেন্ট, যা পাস করা হয়েছে fetch) এর উপর নির্ভর করে যা গিটের ভবিষ্যতের সংস্করণগুলিতে পরিবর্তিত হতে পারে
আপনি যদি গিট ২.০ বা আরও নতুন চালাচ্ছেন
গিট ২.০ এবং আরও নতুন দিয়ে আপনি git pullকেবলমাত্র ডিফল্টরূপে দ্রুত-ফরোয়ার্ড মার্জ করতে কনফিগার করতে পারেন :
git config --global pull.ff only
এটি এর git pullমতো আচরণের কারণ হয় git pull --ff-only, তবে এটি এখনও সমস্ত প্রবাহের কমিটগুলি আনে না বা পুরানো origin/*শাখাগুলি পরিষ্কার করে না তাই আমি এখনও পছন্দ করি git up।