কোন ক্ষেত্রে `গিট টান` ক্ষতিকারক হতে পারে?


409

আমার এক সহকর্মী আছে যে দাবি করে যে git pullএটি ক্ষতিকারক, এবং যখনই কেউ এটি ব্যবহার করে তখন বিচলিত হয়।

git pullকমান্ড আপনার স্থানীয় সংগ্রহস্থলের আপডেট করার জন্য ক্যানোনিকাল উপায় বলে মনে হয়। ব্যবহার করে কি git pullসমস্যা তৈরি হয়? এটি কোন সমস্যা তৈরি করে? গিট সংগ্রহস্থল আপডেট করার জন্য আরও ভাল উপায় আছে কি?


53
@ জে.ক্লারসন: মেটা.স্ট্যাকেক্সেঞ্জিং.কমিশন / ১636363৩/২
রিচার্ড হ্যানসেন

8
অথবা আপনি git pull --rebaseএই কৌশলটি নতুন শাখার জন্য ডিফল্ট হিসাবে সেট করতে পারেনgit config branch.autosetuprebase
নুপ্স

4
নুপক্সের ডানদিকে রয়েছে, দূরবর্তী সাথে স্থানীয় সিঙ্ক্রোনাইজে --rebaseফ্ল্যাগ যুক্ত git pullকরে আপডেট হওয়া স্থানীয়ের উপরে আপনার স্থানীয় পরিবর্তনগুলি পুনরায় প্রদর্শন করে। তারপরে আপনি যখন যা করছেন তার সব ধাক্কা দিলে আপনার নতুন কমিটগুলি রিমোটের শেষে যুক্ত করা হয়। বেশ সহজ.
লিলি 12'14

4
ধন্যবাদ @ বেনএমসিকমারিক। আমি ইতিমধ্যে এটি সম্পন্ন করেছি, তবে প্রশ্নের বৈধতা সম্পর্কিত আলোচনাটি প্রশ্নের নীচে এই মন্তব্যগুলিতে চলছে বলে মনে হচ্ছে। এবং আমি মনে করি আপনার ব্যক্তিগত মতামতটি সত্য হিসাবে উপস্থাপনের জন্য একটি প্ল্যাটফর্ম তৈরি করতে একটি প্রশ্ন জিজ্ঞাসা করা এসও'র প্রশ্নোত্তর কাঠামোর পক্ষে সত্য নয়।
এমসিভি

4
@ রিচার্ডহানসেন, এটি কেবল পয়েন্ট সিস্টেমটিকে প্রতারণা করার মতো মনে হচ্ছে, বিশেষত আপনার উত্তরটির সাথে স্বর ও এত স্বল্প সময়ের ব্যবধান রয়েছে। আপনার প্রশ্নোত্তরের মডেলটি ব্যবহার করে, আমরা সকলেই কেবল আমাদের পূর্ববর্তী জ্ঞান ব্যবহার করে প্রশ্ন জিজ্ঞাসা করতে এবং সেগুলির উত্তর দিতে পারি। সেই সময়ে, আপনার কেবল একটি ব্লগ পোস্ট লেখার বিষয়টি বিবেচনা করা উচিত কারণ এটি অনেক গুণ বেশি উপযুক্ত। একটি প্রশ্নোত্তর বিশেষত অন্য লোকের জ্ঞান চায়। একটি ব্লগ পোস্ট আপনার নিজস্ব প্রদর্শন করে।
জোশ ব্রাউন

উত্তর:


546

সারসংক্ষেপ

ডিফল্টরূপে, 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


6
@ ব্রায়ানজ: git remote update -pসমান git fetch --all -p। আমি টাইপ করার অভ্যাস করছি git remote update -pকারণ একসময় বিকল্প fetchছিল না -p। নেতৃস্থানীয় সংক্রান্ত !, বিবরণ দেখুন alias.*মধ্যে git help config। এতে বলা হয়েছে, "যদি ওরফে প্রসারণটি একটি বিস্মৃতবোধের সাথে উপসর্গ করা হয়, তবে এটি শেল কমান্ড হিসাবে বিবেচিত হবে।"
রিচার্ড হ্যানসেন

13
গিট ২.০ একটি pull.ffকনফিগারেশন যুক্ত করেছে যা উপকরণ ছাড়াই একই জিনিস অর্জন করতে উপস্থিত হয়।
ড্যানি টমাস

51
"অন্যরা ক্রেজি স্টাফ করার সময়" টানা সমস্যার কারণ হতে পারে বলে কিছু কারণ মনে হচ্ছে। না, এটি একটি উত্সাহিত রেপো থেকে প্রতিশ্রুতি ছাড় দেওয়ার মতো পাগল জিনিস যা সমস্যার সৃষ্টি করে। আইএমও রিবেস কেবল তখনই নিরাপদ যখন আপনি স্থানীয়ভাবে এটি একটি প্রতিশ্রুতিতে করেন যা এখনও ঠেলা যায়নি pushed যেমন, উদাহরণস্বরূপ, আপনি যখন চাপ দেওয়ার আগে টানেন, স্থানীয় কমিটগুলি রিবাট করা আপনার ইতিহাসকে রৈখিক রাখতে সহায়তা করে (যদিও লিনিয়ার ইতিহাস কোনও চুক্তির চেয়ে বড় নয়)। তবুও, git upআকর্ষণীয় বিকল্পের মতো শোনাচ্ছে।
এমসিভি

16
আপনার বেশিরভাগ পয়েন্টগুলি হ'ল কারণ আপনি কিছু ভুল করছেন: আপনি নিজের কার্যকারী শাখায় কোডটি পর্যালোচনা করার চেষ্টা করছেন । এটি ভাল ধারণা নয়, কেবল একটি নতুন শাখা তৈরি করুন, --rebase = সংরক্ষণ করুন এবং তারপরে সেই শাখাটি টস করুন (বা আপনি চাইলে এটি মার্জ করুন)।
ফানকাস্টার

5
@ ফানকাস্টারের বক্তব্যটি প্রচুর অর্থবোধ করে, বিশেষত: "অন্যান্য জনগণের কমিটির পর্যালোচনা করা সমস্যা"। এটি বেশিরভাগ গিট ব্যবহারকারীরা যে পর্যালোচনা প্রবাহটি ব্যবহার করেন এটি নয়, এটি এমন কোনও জিনিস যা আমি কখনও কোথাও সুপারিশ করি নি এবং এটি শিরোনামের নীচে বর্ণিত সমস্ত অপ্রয়োজনীয় অতিরিক্ত কাজের কারণ, এটি নয় git pull
বেন রেজেনস্পান

195

আমার উত্তর, আলোচনা থেকে টানা উঠে HackerNews করুন:

আমি শিরোনামের বেটারিজ ল আইনটি ব্যবহার করে কেবল প্রশ্নের উত্তর দিতে প্রলোভিত বোধ করি: কেন git pullক্ষতিকারক হিসাবে বিবেচিত হয়? এটা না।

  • অরৈখিকতা অভ্যন্তরীণভাবে খারাপ নয়। যদি তারা প্রকৃত ইতিহাস উপস্থাপন করে তবে তারা ঠিক আছে।
  • করে আপতিক পুনঃপ্রবর্তন রি-বেস মূল প্রজেক্টের ভুলভাবে ইতিহাস মূল প্রজেক্টের rewriting ফলাফল। ইতিহাস পুনরায় রাইটিং করতে পারবেন না যখন ইতিহাস বেশ কয়েকটি ভান্ডারে বরাবর প্রতিলিপি করা হয়।
  • কাজের ডিরেক্টরিটি পরিবর্তন করা একটি প্রত্যাশিত ফলাফল; বিতর্কযোগ্য উপযোগিতা, যেমন এইচজি / মনোোটোন / ডার্কস / অন্যান্য_ডিভিসিএস_প্রিডেটিং_গিটের আচরণের মুখে, তবে আবার অভ্যন্তরীণভাবে খারাপ হয় না।
  • একত্রিত হওয়ার জন্য অন্যের কাজ পর্যালোচনা করার জন্য বিরতি দেওয়া দরকার এবং এটি আবার গিট টানে একটি প্রত্যাশিত আচরণ। আপনি যদি মার্জ করতে না চান তবে আপনার গিট আনতে হবে। আবার এটি পূর্ববর্তী জনপ্রিয় ডিভিসিএসের সাথে তুলনায় গিটের একটি আইডিয়াসনক্রসি, তবে এটি প্রত্যাশিত আচরণ এবং অভ্যন্তরীণভাবে খারাপ নয় not
  • রিমোট শাখার বিরুদ্ধে পুনরায় পঠন করা শক্ত করা ভাল। আপনার একেবারে প্রয়োজন না হলে ইতিহাস পুনর্লিখন করবেন না। আমার জীবনের জন্য আমি (জাল) রৈখিক ইতিহাসের এই অনুধাবনটি বুঝতে পারি না
  • শাখা পরিষ্কার না করা ভাল Not প্রতিটি রেপো জানে যে এটি কী ধরে রাখতে চায়। গিটারের মাস্টার-স্লেভ সম্পর্কের কোনও ধারণা নেই।

13
আমি রাজী. সেখানে মজ্জাগতভাবে সম্পর্কে ক্ষতিকর কিছুই নেই git pull। তবে এটি কিছু ক্ষতিকারক অনুশীলনের সাথে দ্বন্দ্ব হতে পারে, যেমন ইতিহাসের চেয়ে আরও বেশি নতুন করে লেখার ইচ্ছা করা প্রয়োজন। তবে গিটটি নমনীয়, সুতরাং আপনি যদি এটি অন্য কোনও উপায়ে ব্যবহার করতে চান তবে সর্বদা এটি করুন। তবে এটি কারণ আপনি (ভাল, @ রিচার্ড হ্যানসেন) গিটে অস্বাভাবিক কিছু করতে চান, এবং git pullক্ষতিকারক নয়।
এমসিভি

28
আরও একমত হতে পারে না। লোকেদের পক্ষে পরামর্শ দিচ্ছেন git rebaseএবং git pullক্ষতিকারক বিবেচনা করছেন ? সত্যি?
ভিক্টর মোরোজ

10
আপনার অক্ষ হিসাবে নৈতিকতা সহকারে কোনও গ্রাফ তৈরি করা এবং গিট কমান্ডগুলিকে ভাল, খারাপ, বা কোথাও কোথাও হিসাবে শ্রেণিবদ্ধকরণ করতে দেখে ভাল লাগবে। এই চার্টটি বিকাশকারীদের মধ্যে পৃথক হবে, যদিও এটি গিট ব্যবহার সম্পর্কে অনেক কিছু বলবে।
মিচেল্ট

5
git pullছাড়া আমার সমস্যা--rebaseবিকল্প হ'ল এটির সংশ্লেষের দিক। আপনি যখন ভিন্নতার দিকে তাকান, তখন সেই সংশ্লেষের সমস্ত পরিবর্তনগুলি পরিবর্তনকারী ব্যক্তির পরিবর্তে টানানো ব্যক্তির অন্তর্ভুক্ত। আমি এমন একটি ওয়ার্কফ্লো পছন্দ করি যেখানে মার্জিং দুটি পৃথক শাখার (এ -> বি) জন্য সংরক্ষিত থাকে তাই একীভূত অঙ্গীকারটি কী স্পষ্ট হয়েছে তা স্পষ্ট এবং পুনর্বাসনা একই শাখায় আপ টু ডেট থাকার জন্য সংরক্ষিত (দূরবর্তী এ -> স্থানীয় এ) )
ক্রেগ কোচিস

4
সুতরাং কেউ যদি অন্য কেউ বা অন্য পথে just আমি মনে করি এটি কেবল গোলমাল এবং সত্যই প্রাসঙ্গিক ইতিহাসকে অবহেলা করছে। এটি এমনকি ইতিহাসের মূল্যকে হ্রাস করে। একটি ভাল ইতিহাসের হওয়া উচিত ক) পরিষ্কার এবং খ) আসলে গুরুত্বপূর্ণ ইতিহাস থাকে।
ডেভিড ওঙ্গারো

26

আপনি গিটকে সঠিকভাবে ব্যবহার করতে পারলে এটি ক্ষতিকারক হিসাবে বিবেচিত হবে না। আমি দেখছি এটি কীভাবে আপনার ব্যবহারের ক্ষেত্রে নেতিবাচকভাবে প্রভাবিত করে, তবে আপনি ভাগ করা ইতিহাস পরিবর্তন না করে সমস্যাগুলি এড়াতে পারেন।


10
এর বিশদটি জানাতে: যদি প্রত্যেকে তাদের নিজস্ব শাখায় কাজ করে (যা আমার মতে গিট ব্যবহারের সঠিক উপায়) git pullতবে কোনও ধরণের সমস্যা নয়। গিট মধ্যে ব্রাঞ্চিং সস্তা।
অ্যালেক্সকিউ

18

গৃহীত উত্তর দাবি

মার্জগুলি সংরক্ষণের জন্য রিবাজ-পুল অপারেশনটি কনফিগার করা যায় না

কিন্তু গিট 1.8.5 হিসাবে , যা উত্তরটি পোস্ট করে, আপনি এটি করতে পারেন

git pull --rebase=preserve

অথবা

git config --global pull.rebase preserve

অথবা

git config branch.<name>.rebase preserve

ডক্স বলে

যখন preserve,এছাড়াও পাস --preserve-merges'Git রি-বেসের ফলে' তাই বরাবর যে স্থানীয়ভাবে অঙ্গীকারবদ্ধ একত্রীকরণ করে 'Git টান' চালিয়ে চ্যাপ্টা করা হবে না।

এই পূর্বের আলোচনায় আরও বিস্তারিত তথ্য এবং চিত্র রয়েছে: গিট টান --rebase --প্রেসারভ - মার্জ । এটি কেন git pull --rebase=preserveএকইরকম নয় তাও ব্যাখ্যা করেgit pull --rebase --preserve-merges , যা সঠিক কাজ করে না।

পূর্ববর্তী এই অন্যান্য আলোচনায় রিবেসের সংরক্ষণ-একত্রিতকরণের বৈকল্পিকটি আসলে কীভাবে ব্যাখ্যা করে এবং এটি কীভাবে নিয়মিত রিবাজের চেয়ে অনেক বেশি জটিল: গিটের "রিবাজে - প্রিভিজার-মার্জ" ঠিক কী করে (এবং কেন?)


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.