বুধবার: শেষ প্রতিশ্রুতি সংশোধন কিভাবে?


211

আমি git commit --amendমার্কুরিয়ালের একটি পাল্টা অংশ খুঁজছি , অর্থাত্ আমার কার্যকরী অনুলিপিটির সাথে যুক্ত হওয়া প্রতিশ্রুতি সংশোধন করার একটি উপায়। আমি কেবল সর্বশেষ প্রতিশ্রুতিতে আগ্রহী, আগে থেকে স্বেচ্ছাকৃত কমিট না।

এই সংশোধন পদ্ধতির প্রয়োজনীয়তাগুলি হ'ল:

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

  • যদি সংশোধন করার প্রতিশ্রুতি আমার বর্তমান শাখার এক প্রধান হয় তবে নতুন কোনও মাথা তৈরি করা উচিত নয়। যদি প্রতিশ্রুতি প্রধান না হয় তবে একটি নতুন মাথা তৈরি হতে পারে।

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

আপডেট (1):

  • পদ্ধতিটি অবশ্যই স্বয়ংক্রিয়রূপে হওয়া দরকার , সুতরাং এটি কোনও জিইআইআই ক্লায়েন্ট দ্বারা প্রয়োজনীয় কোনও ব্যবহারকারীর মিথস্ক্রিয়া ছাড়াই সম্পাদন করতে পারে।

আপডেট (2):

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

উত্তর:


289

মার্চুরিয়াল ২.২ প্রকাশের --amendসাথে সাথে hg commitআপনি বর্তমান কার্যনির্বাহী ডিরেক্টরিতে সর্বশেষ প্রতিশ্রুতি আপডেট করতে বিকল্পটি ব্যবহার করতে পারেন

থেকে কমান্ড লাইন রেফারেন্স :

--Amend পতাকাটি কার্যনির্বাহী ডিরেক্টরিটির পিতামাতাকে একটি নতুন প্রতিশ্রুতি দিয়ে সংশোধন করতে ব্যবহার করা যেতে পারে যা বর্তমানে এইচজি স্থিতির দ্বারা প্রতিবেদন করা আবশ্যক ছাড়াও পিতামাতার পরিবর্তন রয়েছে। পুরানো প্রতিশ্রুতি .hg / স্ট্রিপ-ব্যাকআপে একটি ব্যাকআপ বান্ডেলে সংরক্ষণ করা হয় (কীভাবে এটি পুনরুদ্ধার করতে পারে এইচজি সহায়তা বান্ডিল এবং এইচজি সহায়তা আনবান্ডেল দেখুন)।

বার্তা, ব্যবহারকারীর এবং তারিখটি সংশোধিত প্রতিশ্রুতি থেকে নেওয়া না থাকলে নির্দিষ্ট করা আছে। কমান্ড লাইনে কোনও বার্তা নির্দিষ্ট করা না থাকলে, সম্পাদক সংশোধিত প্রতিশ্রুতিটির বার্তাটি খুলবে।

দুর্দান্ত জিনিসটি হ'ল এই প্রক্রিয়াটি "নিরাপদ", কারণ এটি ইতিমধ্যে স্থানীয় ভাণ্ডারের বাইরে উপলব্ধ করা ইতিহাসকে পরিবর্তিত করে এমন পরিবর্তনগুলি রোধ করতে তুলনামূলকভাবে নতুন "পর্যায়সমূহ" বৈশিষ্ট্যের উপর নির্ভর করে।


2
ভাল উত্তর! পরীক্ষামূলকভাবে বিবর্তিত এক্সটেনশান আপনাকে নন-হেড কমিটগুলি নিরাপদে সংশোধন করতে দেয় । পুরানো প্রতিশ্রুতি অপ্রচলিত এবং লুকানো চিহ্নিত করা হবে। প্রকাশনাবিহীন সার্ভারের সাহায্যে, আপনি চেঞ্জসেটগুলি ধাক্কা দেওয়ার পরেও আপনি এটি নিরাপদে করতে পারেন।
মার্টিন গিজার

5
কেবল শেষ প্রতিশ্রুতিতে বার্তাটি আপডেট করতে: hg কমিট --amend -m "এটি আমার নতুন বার্তা"
জে শেঠ

52

মার্চুরিয়ালে কমিট সম্পাদনা করার জন্য আপনার কাছে 3 টি বিকল্প রয়েছে:

  1. hg strip --keep --rev -1সর্বশেষ (1) কমিট (গুলি) পূর্বাবস্থায় ফেরান, যাতে আপনি এটি আবার করতে পারেন ( আরও তথ্যের জন্য এই উত্তরটি দেখুন)।

  2. এমকিউ এক্সটেনশন ব্যবহার করে , যা মার্চুরিয়াল দিয়ে প্রেরণ করা হয়

  3. এমনকি এটি মার্চুরিয়াল দিয়ে না পাঠানো হলেও হিস্টেডিট এক্সটেনশনটি উল্লেখযোগ্য

আপনি মার্চুরিয়াল উইকের সম্পাদনা ইতিহাসের পৃষ্ঠাতেও একবার দেখতে পারেন ।

সংক্ষেপে, ইতিহাস সম্পাদনা করা সত্যিই কঠোর এবং নিরুৎসাহিত । এবং যদি আপনি ইতিমধ্যে আপনার পরিবর্তনগুলিকে ধাক্কা দিয়ে থাকেন তবে অন্য সমস্ত ক্লোনগুলির সম্পূর্ণ নিয়ন্ত্রণ যদি আপনার হয় তবে ব্যতীত আপনি কিছুই করতে পারবেন না।

আমি git commit --amendকমান্ডটির সাথে সত্যই পরিচিত নই , তবে আফাইক, হিস্টেডিট হ'ল এটিই নিকটতম পদ্ধতির বলে মনে হচ্ছে, তবে দুঃখের বিষয় এটি মার্চুরিয়াল দিয়ে পাঠানো হয়নি। এমকিউ ব্যবহার করা সত্যিই জটিল, তবে আপনি এটি দিয়ে প্রায় কিছু করতে পারেন।


1
আমি কেন রোলব্যাক মিস করেছি তা নিশ্চিত নই, তবে মনে হয় আমি যা করতে চাই তা প্রায় (প্রায়) করা যায়। একমাত্র সমস্যাটি হ'ল, যখন আমার আসল প্রতিশ্রুতিবদ্ধতার জন্য কোনও ফাইল সরিয়ে ফেলা হয়েছে এবং এটি আমার সংশোধিত প্রতিশ্রুতির জন্য পুনরুত্থিত হয়েছে: রোলব্যাকের আগে এটি রূপান্তরিত হবে, রোলব্যাকের পরে, এটি অপসারণের জন্য নির্ধারিত হবে (তবে ফাইলটি এখনও বিদ্যমান রয়েছে ওয়ার্কিং ডিরেক্টরি)
'14 এ 14

@ মার্ক আমি নিশ্চিত না যে আমি আপনার সমস্যাটি বুঝতে পেরেছি, তবে ভুলে যাওয়া কমান্ডটি একবার দেখুন, আমি মনে করি এটি আপনি যা খুঁজছেন তা।
krtek

আমি মনে করি না "ভুলে যাওয়া" এখানে সহায়ক হবে। এখানে আরও বিশদে সমস্যাটি রয়েছে: (1) আমি পুনর্বিবেচনা 2 (2) "ফাইল" সরান এবং আরও কিছু পরিবর্তন আনতে পারি (3) পরিবর্তনের প্রতিশ্রুতি দেয়, ফলস্বরূপ 3 (4) এখন আমি আমার মন পরিবর্তন করব এবং সিদ্ধান্ত নেব "ফাইল" প্রতিশ্রুতি থেকে অপসারণ করা উচিত নয়, তাই আমি পুনর্বিবেচনা 3 সংশোধন করতে চাই Hence সুতরাং, আমি "ফাইল" পুনরায় যুক্ত করব যা এখন রূপান্তরিত নয় (5) এখন আমি রোলব্যাক সম্পাদন করব: এটি ডারস্টেটটি পুনরায় সেট করবে এবং চিহ্নিত করবে " ফাইল "সরানো হিসাবে। ()) এখন "hg কমিট" সম্পাদন করার সময়, "ফাইল" অপসারণ হিসাবে থাকবে, যদিও এটি আর হওয়া উচিত নয়। এর মতো দেখতে কীভাবে একটি স্বয়ংক্রিয় ফিক্স হতে পারে?
mstrap

1
স্বয়ংক্রিয় অংশের জন্য আমি জানি না, তবে আপনি hg revert myfileমোছাটি পূর্বাবস্থায় ফেরাতে পারেন । আবার কাজ করার hg addপরেও ফাইলটি পুনরায় যুক্ত করা যেতে পারে rollback
krtek

3
আমি সম্মত যে প্রকাশিত পরিবর্তনের ইতিহাস সম্পাদনা এড়ানো উচিত, তবে আমার স্থানীয় ইতিহাসের সম্পাদনা কোনও ডিভিসিএসের অন্যতম প্রধান বিষয়। এর কিম্পোর্ট সহ এমকিউ হ'ল খাঁটি ইতিহাস-সম্পাদনা, এএএএফসিটি।
mstrap

38

জিইউআই সমতুল্য hg commit --amend:

এটি টরটোইজএইচজির জিইউআই থেকেও কাজ করে (আমি v2.5 ব্যবহার করছি):

'কমিট' ভিউতে স্যুইচ করুন বা, ওয়ার্কব্যাঞ্চ ভিউতে, 'ওয়ার্কিং ডিরেক্টরি' এন্ট্রি নির্বাচন করুন। 'কমিট' বোতামটির 'অপরিবর্তিত বর্তমান সংশোধন' নামে একটি বিকল্প রয়েছে (এটি খুঁজতে বোতামের ড্রপ-ডাউন তীরটি ক্লিক করুন)।

এখানে চিত্র বর্ণনা লিখুন

          ||
          ||
          \/

এখানে চিত্র বর্ণনা লিখুন

গুহাত সম্রাট :

এই অতিরিক্ত বিকল্পটি কেবল তখনই সক্ষম করা হবে যদি পার্শ্বীয় সংস্করণটি কমপক্ষে ২.২.০ হয় এবং যদি বর্তমান সংশোধনটি সর্বজনীন না হয়, প্যাচ না হয় এবং কোনও সন্তান না থাকে। [...]

বোতামটি ক্লিক করলে সংশোধনটিকে 'সংশোধন' করতে 'কমিট - এ্যামেন্ড' বলবে।

এইচএইচজি দেব চ্যানেলে এটি সম্পর্কে আরও তথ্য


অনেক সহায়ক, ধন্যবাদ পূর্বের প্রতিশ্রুতি থেকে বার্তাটিতে কমিট (সংশোধন) বার্তাটি ডিফল্ট করতে টিএইচজি যথেষ্ট স্মার্ট - ঠিক আমি যা চেয়েছিলাম।
ইউইউডিডিএলআরএলআরএস

7

আমি ক্রিটেক যা লিখেছেন তা নিয়ে সুর করছি। আরও নির্দিষ্টভাবে সমাধান 1:

অনুমিতি:

  • আপনি একটি (!) পরিবর্তনটি প্রতিশ্রুতিবদ্ধ করেছেন কিন্তু এখনও তা ঠেকেননি
  • আপনি এই পরিবর্তনটি সংশোধন করতে চান (উদাহরণস্বরূপ ফাইল যুক্ত এবং মুছে ফেলা এবং / অথবা প্রতিশ্রুতি বার্তা)

সমাধান:

  • hg rollbackশেষ প্রতিশ্রুতি পূর্বাবস্থায় ফেলার জন্য ব্যবহার করুন
  • জায়গায় নতুন পরিবর্তন সঙ্গে আবার প্রতিশ্রুতিবদ্ধ

রোলব্যাকটি সত্যিই শেষ অপারেশনটিকে পূর্বাবস্থায় ফেলেছে। এটির কাজ করার পদ্ধতিটি বেশ সহজ: এইচজির স্বাভাবিক ক্রিয়াকলাপগুলি কেবলমাত্র ফাইলগুলিতে সংযোজন করবে; এটি একটি অঙ্গীকার অন্তর্ভুক্ত। মার্চুরিয়াল সর্বশেষ লেনদেনের ফাইলের দৈর্ঘ্যের উপর নজর রাখে এবং অতএব ফাইলগুলি তাদের পুরানো দৈর্ঘ্যে ছিন্ন করে এক ধাপকে পুরোপুরি পূর্বাবস্থায় ফিরিয়ে আনতে পারে।


1
টিউনিং সমাধানের জন্য ধন্যবাদ (1); রোলব্যাকের সাথে কেবল একটি ছোট্ট সমস্যা বাকি আছে, দয়া করে ক্র্টেকের সমাধানটিতে আমার মন্তব্য দেখুন।
mstrap

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

7

ধরে নিই যে আপনি এখনও আপনার পরিবর্তনগুলি প্রচার করেন নি, আপনি যা করতে পারেন তা এখানে।

  • আপনার .hgrc এ যুক্ত করুন:

    [extensions]
    mq =
    
  • আপনার ভাণ্ডারে:

    hg qimport -r0:tip
    hg qpop -a
    

    অবশ্যই আপনাকে পুনর্বিবেচনা শূন্য দিয়ে শুরু করতে হবে না বা সমস্ত প্যাচগুলি পপ করার দরকার নেই, শেষ মাত্র একটি পপ ( hg qpop) পর্যাপ্ততার জন্য (নীচে দেখুন)।

  • .hg/patches/seriesফাইলের শেষ এন্ট্রি , বা আপনার পছন্দ নয় এমন প্যাচগুলি সরিয়ে ফেলুন । পুনরায় অর্ডারিংও সম্ভব।

  • hg qpush -a; hg qfinish -a
  • .diffএখনও .hg / প্যাচগুলিতে থাকা ফাইলগুলি (প্রয়োগ না করা প্যাচগুলি) সরিয়ে ফেলুন (আপনার ক্ষেত্রে এটি হওয়া উচিত)।

আপনি যদি না চান করতে সব ফেরত নিতে আপনার প্যাচ, আপনি এটি ব্যবহার করে সম্পাদনা করতে পারেন hg qimport -r0:tip(বা অনুরূপ), তারপর সম্পাদনা কাপড় এবং ব্যবহার hg qrefreshআপনার স্ট্যাক আগ প্যাচ মধ্যে পরিবর্তনগুলি মার্জ করতে। পড়ুন hg help qrefresh

সম্পাদনা করে .hg/patches/series, আপনি এমনকি কয়েকটি প্যাচ সরিয়ে ফেলতে পারেন বা কিছুটিকে পুনরায় অর্ডার করতে পারেন। যদি আপনার শেষ পুনর্বিবেচনা 99 হয়, আপনি কেবল ব্যবহার করতে পারেন hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a

অবশ্যই, এই পদ্ধতিটি অত্যন্ত নিরুৎসাহিত এবং ঝুঁকিপূর্ণআপনি এটি করার আগে সমস্ত কিছুর ব্যাকআপ নিন !

একটি সাইডনোট হিসাবে, আমি এটি ব্যক্তিগত-কেবল সংগ্রহস্থলগুলিতে কয়েক মিলিয়ন বার করেছি।


আমি এমকিউ-এক্সটেনশন ব্যবহার করার বিষয়টিও বিবেচনা করেছি, তবে এর জন্য বেশ কয়েকটি অপারেশন প্রয়োজন যার জন্য তাদের কিছু ব্যর্থ হতে পারে (যেমন বাইনারি ফাইলগুলি জড়িত থাকলে)। অধিকন্তু, .hg / প্যাচ / সিরিজটি সম্পাদনা করা গ্রহণযোগ্য হবে না, কারণ এই পদ্ধতিটি জিইউআই ক্লায়েন্টের মধ্যে ব্যবহার করা উচিত (আমি উপরে প্রয়োজনীয়তা আপডেট করেছি)
mstrap

হুঁ, দুঃখিত যে এটি আপনার পক্ষে হবে না, একটি ব্যক্তিগত ভাণ্ডারে এটি সত্যিই গাধাটিকে কিক্স করে (ব্যাকআপ সহ - আমি ইতিমধ্যে এর সাথে একটি রেপ ফ্যাটফিংগার-নষ্ট করেছি ^^) এটা বেশ ব্যবহার স্থানীয় পরিবর্তনগুলি ঠেলাঠেলি আগে এক বা প্যাচ একত্রিত শীতল hg qfoldBTW,
hochl

এমকিউ ব্যবহারের জন্য +1, তবে আমি মনে করি আপনি ওভারবোর্ডে গেছেন। তিনি কেবল শেষ প্রতিশ্রুতি সংশোধন করার বিষয়ে জিজ্ঞাসা করছেন। এছাড়াও যে আমদানি হ'ল এটি একীভূত হওয়ার সাথে সাথেই তত্পর হয়ে উঠবে। 'কিমম্পোর্ট-টি টিপ; <স্টাফ সম্পাদনা করুন; ক্রেফ্রেশ -e; কিফিন -এ 'কাজটি করবে (-টি কমিট বার্তাটি সম্পাদনা করার জন্য)
পল এস

সত্য, মার্জগুলি একটি সমস্যা, আমি সাধারণত কেবল একটি প্যাচ পপ করি এবং ব্যবহার করি hg import -r<prev>:tip। পূর্ববর্তী সংস্করণটির মতো সাবভার্শন-এর মতো কোনও শর্টকাট নেই pit
হচল

2

মার্চুরিয়াল এর সাম্প্রতিক সংস্করণগুলিতে evolveএক্সটেনশন অন্তর্ভুক্ত রয়েছে যা hg amendকমান্ড সরবরাহ করে । এটি আপনার সংস্করণ নিয়ন্ত্রণে প্রাক-সংশোধন ইতিহাস না হারিয়ে একটি প্রতিশ্রুতি সংশোধন করার অনুমতি দেয়।

এইচজি সংশোধন [অপশন] ... [ফাইল] ...

নতুন নাম: রিফ্রেশ

আপডেটের সাথে একটি চেঞ্জসেট একত্রিত করুন এবং এটিকে একটি নতুন দিয়ে প্রতিস্থাপন করুন

Commits a new changeset incorporating both the changes to the given files
and all the changes from the current parent changeset into the repository.

See 'hg commit' for details about committing changes.

If you don't specify -m, the parent's message will be reused.

Behind the scenes, Mercurial first commits the update as a regular child
of the current parent. Then it creates a new commit on the parent's
parents with the updated contents. Then it changes the working copy parent
to this new combined changeset. Finally, the old changeset and its update
are hidden from 'hg log' (unless you use --hidden with log).

এক্সটেনশনের সম্পূর্ণ বিবরণের জন্য https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-volve দেখুন evolve


একই প্রতিশ্রুতি বার্তা পুনরায় ব্যবহার করা একটি দুর্দান্ত বৈশিষ্ট্য!
এমপেন

1

মূল প্রশ্নের সমস্ত সমস্যার সমাধান নাও হতে পারে, তবে যেহেতু এটি পূর্বের প্রতিশ্রুতিতে পারদর্শীতা কীভাবে সংশোধন করতে পারে সে বিষয়ে ডি ফ্যাক্ট পোস্ট বলে মনে হচ্ছে, আমি আমার 2 সেন্ট মূল্য মূল্যবান তথ্য যুক্ত করব।

আপনি যদি আমার মতো হন এবং কোনও ফাইল না যুক্ত করে কেবল পূর্বের প্রতিশ্রুতি বার্তাটি (কোনও টাইপো ঠিক করুন) পরিবর্তন করতে চান তবে এটি কাজ করবে

hg commit -X 'glob:**' --amend

বিন্যাস ব্যতীত বা বাদ না hg commitদিয়ে ডিফল্টরূপে সমস্ত ফাইলকে কার্যক্ষম ডিরেক্টরিতে অন্তর্ভুক্ত করা হবে। প্যাটার্ন প্রয়োগ করা -X 'glob:**'সমস্ত সম্ভাব্য ফাইলগুলি বাদ দেয়, কেবল প্রতিশ্রুতি বার্তাটি সংশোধন করার অনুমতি দেয়।

কার্যকরীভাবে এটি একই রকম git commit --amendযখন সূচী / পর্যায়ে কোনও ফাইল নেই।


0

আর একটি সমাধান uncommitহ'ল বর্তমান কমিট থেকে নির্দিষ্ট ফাইল বাদ দিতে কমান্ডটি ব্যবহার করা যেতে পারে ।

hg uncommit [file/directory]

আপনি যখন বর্তমান প্রতিশ্রুতি রাখতে চান এবং প্রতিশ্রুতি থেকে কিছু ফাইল নির্বাচন না করা চান ( files/directoriesএটি মুছে ফেলা হয়েছে তার জন্য বিশেষত সহায়ক ) যখন এটি খুব সহায়ক ।

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