অন্য কোনও কিছুর উপর কাজ করার সময় আমি কীভাবে একচেটিয়া আপত্তিহীন পরিবর্তনগুলি রাখি


98

আমার যদি একচেটিয়া অনির্ধারিত পরিবর্তন হয় এবং পরিবর্তে অন্য কোনও বিষয়ে কাজ করার সময় এটিকে আলাদা করে রাখতে চাই এবং তারপরে (বেশ কয়েকটি দিন পরে ফাই) এটিতে ফিরে এসে কাজ শুরু করে। এটি সম্পাদন করার সবচেয়ে সহজ ওয়ার্কফ্লো কী হবে? (এখনও পর্যন্ত আমার কাছে কেবল মার্চুরিয়ালের প্রাথমিক কার্যকারিতা রয়েছে)। আমার স্বাভাবিক পদ্ধতিটি ছিল ক্লোন ব্যবহার করে একটি নতুন শাখা তৈরি করা, তবে আরও ভাল উপায় থাকতে পারে।

উত্তর:


133

আপনার কাছে মুষ্টিমেয় বিকল্প রয়েছে:

  1. আইটেমগুলি শেলভ করুন। এটি পরিবর্তনগুলি সংরক্ষণ করে এবং সেগুলি ওয়ার্কিং ডিরেক্টরি থেকে সরান যাতে শাখাটি চালিয়ে যেতে পারে। এটি কোনও পরিবর্তন-সেট তৈরি করে না।

    hg shelve --all --name "UnfinishedChanges"
    
    hg unshelve --name "UnfinishedChanges"
    

    আপডেট / সম্পাদনা : মার্উরিয়ালের নতুন সংস্করণগুলি ব্যবহারের প্রয়োজন হতে পারে

    hg shelve -n "UnfinishedChanges"
    hg unshelve "UnfinishedChanges"
    

    আপনি এখনও এর --nameবিকল্প হিসাবে ব্যবহার করতে পারেন -n, তবে পার্কিয়ালটি --nameআর পছন্দ করবে বলে মনে হয় না। তদতিরিক্ত, এটি --allআর প্রয়োজন হয় না এবং জাঁকজমকপূর্ণ প্রকৃতপক্ষে এটির উপর ফ্রিক আউট হবে।

  2. আইটেমগুলি ব্যবহার করে প্যাচ সারি করুন mq। এটি কিছু ক্ষেত্রে তাক লাগানোর চেয়ে খুব আলাদা নয়, তবে অন্যভাবে আচরণ করে। শেষ ফলাফলটি একই, পরিবর্তনগুলি সরানো হয় এবং পরে বিকল্পভাবে পুনরায় প্রয়োগ করা যেতে পারে। যখন ধাক্কা দেওয়া হয়, প্যাচগুলি যৌক্তিক পরিবর্তন-সেট হয়, যখন পপ করা হয় সেগুলি অন্য কোথাও সংরক্ষণ করা হয় এবং পরিবর্তন-সেট ইতিহাসের অংশ হয় না।

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
  3. স্থানীয়ভাবে তাদের প্রতিশ্রুতিবদ্ধ করুন, পূর্ববর্তী পরিবর্তন-সেটটিতে আপডেট করুন এবং কাজ চালিয়ে যান এবং বেনামে শাখা (বা একাধিক শিরোনাম) ব্যবহার করুন। আপনি যদি তারপর পরিবর্তনগুলি চান তবে আপনি মাথাগুলি মার্জ করতে পারেন। আপনি যদি পরিবর্তনগুলি না চান তবে আপনি পরিবর্তন-সেটটি কেটে ফেলতে পারেন ।

    hg commit -m"Commiting unfinished work in-line."
    hg update -r<previous revision>
    
    hg strip -r<revision of temporary commit>
    
  4. তাদের একটি নামী শাখায় প্রতিশ্রুতিবদ্ধ। ওয়ার্কফ্লো তখন বিকল্প 3 এর মতো হয়ে যায় - আপনি প্রস্তুত হয়ে গেলে মার্জ বা স্ট্রিপ করুন।

    hg branch "NewBranch"
    hg commit -m"Commiting unfinished work to temporary named branch."
    hg update <previous branch name>
    

ব্যক্তিগতভাবে আমি বিকল্পটি 3 বা 4 ব্যবহার করি কারণ আমি পরিবর্তন-সেটগুলি সরিয়ে ফেলা বা আংশিক কোডটি চেক ইন করতে আপত্তি মনে করি না (যতক্ষণ না এটি শেষ পর্যন্ত চাপ না দেয়)। প্রয়োজনে অন্যান্য ব্যবহারকারীদের থেকে আপনার স্থানীয় পরিবর্তন-সেটগুলি আড়াল করতে নতুন ফেজ স্টাফের সাথে একত্রে এটি ব্যবহার করা যেতে পারে।

আমি rebaseমার্জটি কোডের ইতিহাসে কোনও সংযোজন করবে না এমন মার্জগুলি এড়ানোর জন্য পরিবর্তনগুলি সেটগুলি প্রায় সরানোর জন্য কমান্ডটিও ব্যবহার করি । আমি মার্জ করি গুরুত্বপূর্ণ শাখাগুলির মধ্যে ক্রিয়াকলাপের জন্য সঞ্চয় করার প্রবণতা (যেমন রিলিজ শাখা), বা দীর্ঘায়িত বৈশিষ্ট্য শাখা থেকে ক্রিয়াকলাপ। histeditপরিবর্তন-সেটগুলি সংকুচিত করার জন্য আমি যে কমান্ডটি ব্যবহার করি তা এখানে রয়েছে যেখানে তাদের "চ্যাটিনেস" এর মান হ্রাস করে।

প্যাচ সারিগুলি এটি করার জন্য একটি সাধারণ প্রক্রিয়া, তবে তাদের কাছে স্ট্যাক্ট শব্দার্থক শব্দ রয়েছে। আপনি প্যাচগুলি এবং পপ প্যাচগুলি, তবে স্ট্যাকের অন্য প্যাচ "নীচে" থাকা একটি প্যাচটির জন্য এটির উপরে থাকা প্যাচটিও চাপানো দরকার।

সতর্কতা , এই সমস্ত বিকল্পগুলির মতো, যদি আপনি অস্থায়ী পরিবর্তনগুলি সজ্জিত / সারিবদ্ধ / ব্রাঞ্চযুক্ত পরিবর্তনগুলির পরে ফাইলগুলির মধ্যে আরও বেশি পরিবর্তন ঘটে থাকে তবে আন-শেল্ভিং / পুশিং / মার্জ করার সময় সংযুক্তির সমাধানের প্রয়োজন হবে।


দুর্দান্ত উত্তর এবং সহায়ক উদাহরণের জন্য ধন্যবাদ। আপনি যদি hg বুকমার্ক ব্যবহার করাও একটি বিকল্প হিসাবে জানতে চান?
এরিক

@ এরিক সম্ভবত, তবে এটি ব্যবহার করার অভিজ্ঞতা আমার নেই।
অ্যাডাম হল্ডসওয়ার্থ

4
বুকমার্কগুলি বিকল্প 3-তে সহায়তা করতে ব্যবহার করা যেতে পারে - আপনি নিজের পরিবর্তনকে সংশোধন করতে যে সংশোধন করেছেন তা লেবেল করতে ব্যবহার করতে পারেন। তারা নিজেরাই এই কাজটি করতে পারে না।
স্টিভ কায়ে

বিকল্পটি --allস্বীকৃত নয়। যাইহোক যাইহোক সমস্ত পরিবর্তনগুলি তাক করার এটি একটি ডিফল্ট আচরণ।
নেক্সা

@ এনএক্সএ হাই সাথী, যদি আমার কোনও কমান্ডটি সামান্য বিস্মৃত হয় (সম্ভবত সংস্করণটি পরিবর্তিত হয়েছে), দয়া করে উত্তরটি সম্পাদন করতে নির্দ্বিধায় অনুভব করুন এবং প্রয়োজনে আমি তা অনুমোদন করব :-)
অ্যাডাম হল্ডসওয়ার্থ

23

ব্যক্তিগতভাবে, আমি এখন পর্যন্ত পোস্ট করা উত্তরগুলির কোনও পছন্দ করি না:

  1. আমি ক্লোন কারণ আমি প্রতিটি প্রকল্প মত শাখাবিন্যাস মত শুধুমাত্র আছে না এক ডিরেক্টরি রাখতে পছন্দ করি। একই সাথে বিভিন্ন ডিরেক্টরিতে কাজ করা আমার সম্পাদকদের সাম্প্রতিক ফাইলগুলির ইতিহাসকে পুরোপুরি মিস করে। আমি সবসময় ভুল ফাইল পরিবর্তন করে শেষ করি। সুতরাং আমি আর এটি না।
  2. আমি shelveদ্রুত সমাধানের জন্য ব্যবহার করি (কেবলমাত্র আমার আপত্তিজনক পরিবর্তনগুলি অন্য একটি শাখায় স্থানান্তরিত করতে, যদি আমি বুঝতে পারি যে আমি ভুলের মধ্যে আছি)। আপনি দিনের কথা বলছেন, কোনওভাবেই আমি কিছু দিনের জন্য তাক লাগিয়ে দেব না।
  3. আমি মনে করি mqএ জাতীয় সাধারণ অধিবেশনটির জন্য খুব জটিল

আমি মনে করি সবচেয়ে ভাল উপায় হ'ল আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করা, আপনি এই পরিবর্তনগুলি শুরু করার আগে এবং সেখান থেকে কাজ করার আগে আপনি পরিবর্তনে ফিরে যান। কিছু ছোটখাটো সমস্যা আছে, আমি উদাহরণ দিয়ে বলি:

ধরা যাক আপনার পরিবর্তন এ। আপনার পরিবর্তনগুলি শুরু করার চেয়ে। এই মুহুর্তে আপনি এটি কিছু সময়ের জন্য আলাদা রাখতে চান। প্রথমত, আপনার কাজটি কমিট করুন:

hg ci -m "Working on new stuff"

আপনি যদি চান, আপনি পরে ফিরে আসা আরও সহজ করতে আপনি একটি বুকমার্ক যুক্ত করতে পারেন। আমি সবসময় আমার বেনামে শাখাগুলিতে বুকমার্ক তৈরি করি।

hg bookmark new-stuff

এই পরিবর্তনগুলির আগে চেঞ্জসেটে ফিরে যান

hg update A

এখান থেকে, আপনি কাজ করেন এবং চেঞ্জসেট সি তৈরি করেন এখন আপনার 2 টি মাথা (বি এবং সি) রয়েছে, আপনি যখন চাপ দেওয়ার চেষ্টা করবেন তখন আপনাকে সতর্ক করা হবে। আপনি branch শাখার প্রধান নির্দিষ্ট করে একটি মাত্র শাখা চাপতে পারেন:

hg push -r C

অথবা আপনি new-stuffশাখার পর্বটি গোপনে পরিবর্তন করতে পারেন । গোপন পরিবর্তনগুলি ধাক্কা দেওয়া হবে না।

hg phase -r new-stuff --secret --force

বিস্তারিত উত্তর করার জন্য ধন্যবাদ! আমি তাদের (সাধারণ?) সমস্যার জন্য মানুষের কর্মপ্রবাহগুলি সত্যিই পড়তে পছন্দ করি।
এরিক

আমি মনে করি যে এই পরিস্থিতিটির mqজন্য এটি কিছুটা জটিল , তবে এটির সাথে রয়েছে যথেষ্ট পরিমাণে ব্যবহার, এটির সাথে সাবলীল হওয়ার জন্য সময় বিনিয়োগ করার পক্ষে এটি মূল্যবান worth
নরম্যান গ্রে

12

স্থানীয় আপত্তিজনক পরিবর্তনগুলি রাখতে, আমার পক্ষে সহজতম উপায় হ'ল প্যাচ ফাইল হিসাবে তাদের সংরক্ষণ করা।

hg diff > /tmp/`hg id -i`.patch

এবং যখন আপনাকে আগের অবস্থায় ফিরে যেতে হবে:

hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch

আমি স্ট্রিপ চাই /tmpএবং hg id -iতা Windoze খুব কাজ করবে।
অ্যানাটোলি টেকটোনিক

এবং hg upসেখানে প্রয়োজন হয় না।
অ্যানাটোলি টেকটোনিক

4
@ টেকটোনিক আমি যদি প্যাচটি অন্য সংশোধনীতে প্রয়োগ করি তবে কী হবে? বিশেষত যদি প্যাচযুক্ত ফাইলগুলি সংশোধন করা হয়।
ম্যাপকুক

মার্চুরিয়াল এটি মার্জ করার চেষ্টা করবে এবং আপনাকে যে কোনওভাবেই দ্বন্দ্ব মোকাবেলা করতে হবে।
অ্যানাটোলি টেকটোনিক

6

আপনি একাধিকবার আপনার রেপো ক্লোন করতে পারেন। আমার কাছে একটি রুট ক্লোন আছে, তারপরে সেখান থেকে একাধিক শিশু রয়েছে। উদাহরণ:

  • মাইপ্রজেক্ট। রুট
  • মাইপ্রজেক্ট.বাগফিক্স ১
  • মাইপ্রজেক্ট.বাগফিক্স ২
  • মাইপ্রজেক্ট.ফিচারচেন্জ 1
  • মাইপ্রজেক্ট.ফিচারচেনজ 2 2

4 টি বাচ্চা সমস্তই মূল থেকে ক্লোন করা হয় এবং মূল থেকে / টিপুন / টানুন। এরপরে রুটটি কোথাও কোথাও নেটওয়ার্ক / ইন্টারনেটের মাস্টার রেপো থেকে ধাক্কা / টান দেয়। মূলটি আপনার ব্যক্তিগত মঞ্চের ক্ষেত্রের হিসাবে কাজ করে।

সুতরাং আপনার ক্ষেত্রে, আপনি কেবল একটি নতুন রেপো ক্লোন করে কাজ শুরু করবেন। অন্যান্য রেপোতে আপনার 'তাক করা' কাজটি ছেড়ে দিন। এটা খুব সহজ।

একমাত্র নেতিবাচকতা হ'ল ডিস্ক স্পেস ব্যবহার, তবে এটি যদি উদ্বেগের বিষয় হয়ে থাকে তবে আপনি কোনওভাবেই ডিভিসিএস ব্যবহার করবেন না;) ওহ এবং এটি আপনার ভিজ্যুয়াল স্টুডিও "সাম্প্রতিক প্রকল্পগুলি" তালিকাটিকে দূষিত করে, তবে আরে কী।

[নিম্নলিখিত মন্তব্যগুলি সম্পাদনা করুন]: -

তাহলে উপসংহারে ... আপনি যা করছেন তা সম্পূর্ণ সূক্ষ্ম এবং স্বাভাবিক। নিম্নলিখিত যুক্তিগুলি সত্য হলে এটি কাজ করার সর্বোত্তম সম্ভাব্য উপায় হ'ল আমি তর্ক করব: 1) এটি স্বল্পস্থায়ী 2) আপনার অন্যান্য বিকাশকারীদের সাথে সহযোগিতা করার দরকার নেই 3) প্রতিশ্রুতি না দেওয়া পর্যন্ত পরিবর্তনগুলি আপনার পিসি ছাড়ার দরকার নেই / সময় ধাক্কা।


শাখা ব্যবহার না করার কোনও কারণ? এটি তাদের জন্য এবং রেপো-ক্লোনিংয়ের তুলনায় যথেষ্ট দ্রুত are
অ্যাডাম হল্ডসওয়ার্থ

আমার প্রশ্নে আমি নিম্নলিখিতটি জানিয়েছি: আমার স্বাভাবিক পদ্ধতিটি ছিল ক্লোন ব্যবহার করে একটি নতুন শাখা তৈরি করা, তবে এর থেকে আরও ভাল উপায় থাকতে পারে।
এরিক

4
@ অ্যাডামহোল্ডসওয়ার্থ, প্রযুক্তিগতভাবে এগুলি শাখা ... কেবল স্বল্পজীবী। স্বল্পস্থায়ী কাজের জন্য একটি নামকরণ করা শাখা তৈরি করা সম্পূর্ণ নির্বোধ। এটি দীর্ঘকালীন কাজের গল্পের জন্য যে শাখাগুলি নামের উদ্দেশ্যে তা লঙ্ঘন করে।
nbevans

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

@ নাথান এগুলি "কাজের দীর্ঘকালীন গল্প" এর জন্যও একচেটিয়া নয়, এটি যদি আপনি একটানা সংহতিকে অনুসরণ করেন তবে তারা এতে ভাল। ডক্স থেকে সোজা : "শাখাগুলি যদি উন্নয়নের লাইনগুলি ডাইভার্জ করে তবেই ঘটে", আপনি যদি অন্য কোনও কাজ করার জন্য কোনও আইটেমটি তাক করে রাখছেন তবে এটি আমার পক্ষে কতটা দীর্ঘকাল বেঁচে থাকুক না কেন তা বিচ্যুত হওয়ার মতো শোনাচ্ছে।
অ্যাডাম হল্ডসওয়ার্থ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.