সহজ সমাধান: মার্জ হওয়ার পরে 'কার্য' শাখা সরান
সংক্ষিপ্ত উত্তর: আপনি গিটটি আপনার পছন্দ মতো ব্যবহার করতে পারেন (একত্রে একটি সাধারণ কর্মপ্রবাহের জন্য নীচে দেখুন), মার্জ সহ। অস্থায়ী কাজের শাখাটি মুছতে কেবল ' গিট ব্রাঞ্চ-ডি ওয়ার্ক ' দিয়ে প্রতিটি ' গিট মার্জ ওয়ার্ক ' অনুসরণ করুন তা নিশ্চিত করুন ।
পটভূমির ব্যাখ্যা:
মার্জ / ডিকমিট সমস্যাটি হ'ল যখনই আপনি একটি শাখা 'গিট এসএনএন ডিকমিট' করেন তখন branch শাখার মার্জ ইতিহাসটি 'সমতল' হয়: এই শাখায় যে সমস্ত মার্জ অপারেশন রয়েছে তা গিট ভুলে যায়: কেবল ফাইলের বিষয়বস্তু সংরক্ষণ করা হয়েছে, তবে এই বিষয়বস্তুটি (আংশিকভাবে) একটি নির্দিষ্ট অন্যান্য শাখা থেকে এসেছে তা হারিয়ে গেছে। দেখুন: গিট এসএনএন ডিসকমিট কেন স্থানীয় শাখাগুলির জন্য মার্জ কমিটের ইতিহাস হারিয়ে ফেলবে?
(দ্রষ্টব্য: গিট-এসএনএন এটি সম্পর্কে তেমন কিছু করতে পারে নি: এসএনএন কেবল আরও শক্তিশালী গিট মার্জগুলি বুঝতে পারে না So সুতরাং, এসএনএন সংগ্রহস্থলের অভ্যন্তরে এই মার্জ তথ্যটি কোনও উপায়ে উপস্থাপন করা যায় না))
তবে এটিই পুরো সমস্যা। যদি আপনি 'ওয়ার্ক' শাখাটি 'মাস্টার ব্রাঞ্চ'তে একীভূত হওয়ার পরে মুছে ফেলে থাকেন তবে আপনার গিট সংগ্রহস্থলটি 100% পরিষ্কার এবং আপনার এসএনএন সংগ্রহস্থলের মতো দেখায়।
আমার কর্মপ্রবাহ:
অবশ্যই আমি প্রথম স্থানীয় গিট সংগ্রহস্থলের মধ্যে রিমোট এসএনএন সংগ্রহস্থলটিকে ক্লোন করেছি (এটি কিছুটা সময় নিতে পারে):
$> git svn clone <svn-repository-url> <local-directory>
তারপরে সমস্ত কাজ "স্থানীয়-ডিরেক্টরি" এর ভিতরে ঘটে। যখনই সার্ভার থেকে আপডেট পাওয়ার দরকার হবে ('এসএনএন আপডেট' এর মতো), আমি তা করি:
$> git checkout master
$> git svn rebase
আমি আমার সমস্ত উন্নয়ন কাজ এইভাবে তৈরি করা একটি পৃথক শাখার 'কাজ' তে করি:
$> git checkout -b work
অবশ্যই আপনি নিজের কাজের জন্য যতগুলি শাখাগুলি তৈরি করতে পারেন এবং নিজের পছন্দ মতো তাদের মধ্যে মার্জ এবং রিবেস করতে পারেন (কেবল যখন আপনি তাদের সাথে কাজ শেষ করবেন তখন মুছুন --- নীচে আলোচিত হিসাবে)। আমার সাধারণ কাজে আমি খুব ঘন ঘন প্রতিশ্রুতিবদ্ধ:
$> git commit -am '-- finished a little piece of work'
পরবর্তী পদক্ষেপ (গিট রিবেস -i) alচ্ছিক --- এটি কেবল এসএনএন-তে সংরক্ষণাগার দেওয়ার আগে ইতিহাসটি পরিষ্কার করছে: আমি যখন একটি স্থিতিশীল মাইল পাথরটি পৌঁছে যাই যা আমি অন্যদের সাথে ভাগ করতে চাই, আমি এই 'কাজের' ইতিহাস আবার লিখব প্রতিশ্রুতিবদ্ধ বার্তাগুলি শাখা এবং সাফ করুন (অন্যান্য বিকাশকারীদের পথে চলার সমস্ত ছোট পদক্ষেপ এবং ভুলগুলি দেখার দরকার নেই --- কেবল ফলাফল)। এই জন্য, আমি না
$> git log
এবং এসএনএন সংগ্রহস্থলে লাইভ থাকা শেষ প্রতিশ্রুতির শা -১ হ্যাশ অনুলিপি করুন (গিট-এসএনএন-আইডি দ্বারা নির্দেশিত) as তারপরে আমি ফোন করি
$> git rebase -i 74e4068360e34b2ccf0c5869703af458cde0cdcb
আমার পরিবর্তে কেবল আমাদের শেষ এসএনএন কমিটের শা -১ হ্যাশটি পেস্ট করুন। আপনি বিশদটির জন্য ডকুমেন্টেশনটি 'গিট হেল্প রিবেস' দিয়ে পড়তে চাইতে পারেন। সংক্ষেপে: এই কমান্ডটি প্রথমে আপনার সম্পাদনাগুলি উপস্থাপনকারী একটি সম্পাদক খোলে ---- আপনি পূর্ববর্তী কমিটগুলি দিয়ে স্কোয়াশ করতে চান এমন সমস্ত কমিটের জন্য কেবল 'পিক' পরিবর্তন করে 'স্কোয়াশ' এ পরিবর্তন করুন। অবশ্যই, প্রথম লাইনে 'বাছাই' হিসাবে থাকা উচিত। এইভাবে, আপনি আপনার অনেকগুলি ছোট্ট অঙ্গীকারকে এক বা একাধিক অর্থবহ ইউনিটে পরিণত করতে পারেন। সম্পাদকটি সংরক্ষণ করুন এবং প্রস্থান করুন। আপনি আরও একটি সম্পাদক পাবেন যাতে আপনাকে কমিট লগ বার্তাগুলি পুনরায় লিখতে বলবে।
সংক্ষেপে: আমি 'কোড হ্যাকিং' শেষ করার পরে, আমি আমার 'ওয়ার্ক' শাখায় ম্যাসেজ করি যতক্ষণ না দেখায় আমি অন্যান্য প্রোগ্রামারদের কাছে কীভাবে এটি উপস্থাপন করতে চাই (বা আমি ইতিহাস ব্রাউজ করার সময় কয়েক সপ্তাহের মধ্যে আমি কীভাবে কাজটি দেখতে চাই) ।
এসএনএন সংগ্রহস্থলের পরিবর্তনের জন্য, আমি এটি করি:
$> git checkout master
$> git svn rebase
এখন আমরা ফিরে এসেছি পুরানো 'মাস্টার' শাখায় আপডেট হওয়া এসএনএন সংগ্রহস্থলের মধ্যবর্তী সময়ে ঘটে যাওয়া সমস্ত পরিবর্তনগুলি (আপনার নতুন পরিবর্তনগুলি 'কার্য' শাখায় লুকিয়ে রয়েছে)।
যদি আপনার নতুন 'কাজের' পরিবর্তনের সাথে সংঘর্ষ ঘটতে পারে এমন পরিবর্তনগুলি থেকে থাকে, আপনি নিজের নতুন কাজের চাপ দেওয়ার আগে স্থানীয়ভাবে সেগুলি সমাধান করতে হবে (আরও বিশদ বিবরণ দেখুন)। তারপরে, আমরা আমাদের পরিবর্তনগুলিকে এসএনএন-তে চাপ দিতে পারি:
$> git checkout master
$> git merge work # (1) merge your 'work' into 'master'
$> git branch -d work # (2) remove the work branch immediately after merging
$> git svn dcommit # (3) push your changes to the svn repository
দ্রষ্টব্য 1: 'গিট ব্রাঞ্চ-ডি ওয়ার্ক' কমান্ডটি বেশ নিরাপদ: এটি কেবল আপনাকে যে শাখাগুলির আর প্রয়োজন হয় না তা মুছতে দেয় (কারণ সেগুলি ইতিমধ্যে আপনার বর্তমান শাখায় মার্জ করা হয়েছে)। আপনি যদি এই আদেশটি 'মাস্টার' শাখায় মার্জ করার আগে ভুল করে এই আদেশটি কার্যকর করেন তবে আপনি একটি ত্রুটি বার্তা পাবেন।
দ্রষ্টব্য 2: মার্জ এবং ডিকমিটের মধ্যে 'গিট ব্রাঞ্চ- ডি ওয়ার্ক' দিয়ে আপনার শাখাটি মুছে ফেলার বিষয়টি নিশ্চিত করুন : আপনি ডকমিট পরে শাখাটি মুছে ফেলার চেষ্টা করেন, আপনি একটি ত্রুটি বার্তা পাবেন: যখন আপনি 'গিট এসএনএন ডকমিট' করেন, গিট তা ভুলে যায় আপনার শাখাটি 'মাস্টার' এর সাথে একীভূত হয়েছে। আপনাকে এটি 'গিট ব্রাঞ্চ-ডি ওয়ার্ক' দিয়ে সরিয়ে ফেলতে হবে যা সুরক্ষা চেক করে না।
এখন, 'মাস্টার' শাখায় দুর্ঘটনাক্রমে হ্যাকিং এড়াতে আমি তত্ক্ষণাত্ একটি নতুন 'ওয়ার্ক' শাখা তৈরি করেছি:
$> git checkout -b work
$> git branch # show my branches:
master
* work
আপনার 'কাজ' কে এসএনএন-র পরিবর্তনের সাথে সংহত করে:
'গিট এসএনএন রিবায়েস' যখন আমার 'কাজ' শাখায় কাজ করছিল তখন অন্যরা এসএনএন সংগ্রহস্থলটি বদলে যখন আমি তা করি তা এখানে:
$> git checkout master
$> git svn rebase # 'svn pull' changes
$> git checkout work # go to my work
$> git checkout -b integration # make a copy of the branch
$> git merge master # integrate my changes with theirs
$> ... check/fix/debug ...
$> ... rewrite history with rebase -i if needed
$> git checkout master # try again to push my changes
$> git svn rebase # hopefully no further changes to merge
$> git merge integration # (1) merge your work with theirs
$> git branch -d work # (2) remove branches that are merged
$> git branch -d integration # (2) remove branches that are merged
$> git svn dcommit # (3) push your changes to the svn repository
আরও শক্তিশালী সমাধান বিদ্যমান:
উপস্থাপিত কর্মপ্রবাহ সরল: এটি কেবল 'আপডেট / হ্যাক / ডিকমিট' এর প্রতিটি রাউন্ডের মধ্যে গিটের শক্তিগুলি ব্যবহার করে --- তবে দীর্ঘমেয়াদী প্রকল্পের ইতিহাসকে এসএনএন সংগ্রহস্থলের মতো লিনিয়ার হিসাবে ছেড়ে দেয়। যদি আপনি কেবল কোনও উত্তরাধিকারী এসএনএন প্রকল্পের ছোট প্রথম ধাপে গিট মার্জগুলি ব্যবহার শুরু করতে চান তবে এটি ঠিক আছে।
আপনি যখন Git মার্জ সঙ্গে আরো পরিচিত হয়ে, অন্যান্য কর্মপ্রবাহ অনুসন্ধান করুন মুক্ত মনে: আপনি জানেন আপনি কি করছেন, তাহলে আপনি পারবেন না SVN মার্জ সঙ্গে Git মার্জ মিশ্রণ ( (অথবা অনুরূপ) Git-SVN ব্যবহার করে শুধু SVN একত্রীকরণ সঙ্গে সাহায্য কিভাবে? )