গিট-এসএনএন ডিকমিট গিটে মার্জ হওয়ার পরে কি বিপজ্জনক?


133

গিট-এসএনএন চেষ্টা করে দেখার জন্য আমার প্রেরণা হ'ল অনায়াসে একত্রিত হওয়া এবং শাখা প্রশাখা করা। তখন আমি লক্ষ্য করেছি যে মানুষ গিট-এসএনএন (1) বলেছেন:

আপনি যে শাখার ডিসকমিট করার পরিকল্পনা করছেন তার গায়ে গিট-মার্জ বা গিট-পুল চালানোর পরামর্শ দেওয়া হয় না। সাবভার্সন কোনও যুক্তিসঙ্গত বা দরকারী ফ্যাশনে মার্জগুলিকে প্রতিনিধিত্ব করে না; সুতরাং সাবভারশন ব্যবহারকারী ব্যবহারকারীরা আপনার করা কোনও মার্জ দেখতে পাবে না। তদ্ব্যতীত, আপনি যদি গিট শাখা থেকে মার্জ করে বা টানেন যা একটি এসভিএন শাখার আয়না, dcommit ভুল শাখায় অঙ্গীকারবদ্ধ হতে পারে।

এর অর্থ কি এই যে আমি এসএনএন / ট্রাঙ্ক (বা একটি শাখা) থেকে স্থানীয় শাখা তৈরি করতে পারি না, হ্যাক করে ফেলে, এসএনএন / ট্রাঙ্কে আবার একত্রীভূত করতে পারি, তারপরে dcommit? আমি বুঝতে পেরেছি যে এসএনএন ব্যবহারকারীরা একই জগাখিচির্ত দেখতে পাবে যা সবসময়ই এসএনএন প্রি 1.5.x এ মিশে গেছে তবে অন্য কোনও ত্রুটি রয়েছে কি? এই শেষ বাক্যটি আমাকেও চিন্তিত করে। মানুষ কি নিয়মিত এই ধরণের কাজ করে?


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

2
@ আলেকজান্ডারকিটায়েভ: গিট- এসএনএন ডক্সের পরে পরিবর্তন হয়েছে এবং অতিরিক্তভাবে একটি --mergeinfo=<mergeinfo>বিকল্প রয়েছে যা এসভিএন-এ মার্জ করার তথ্যটি দিতে সক্ষম হতে পারে। এটি কীভাবে ব্যবহার করা উচিত তা নিশ্চিত নয়।
মিস্টার_আর_আমস_ডি

উত্তর:


174

আসলে, আমি --no-ffগিট একীভূত করার বিকল্পটির সাথে আরও একটি ভাল উপায় খুঁজে পেয়েছি । আমি আগে ব্যবহার করা এই সমস্ত স্কোয়াশ টেকনিকের আর প্রয়োজন নেই।

আমার নতুন কর্মপ্রবাহ এখন নিম্নরূপ:

  • আমি একটি "মাস্টার" শাখা শুধুমাত্র শাখা যে আমি থেকে dcommit এবং যে ক্লোন SVN ভান্ডার যে আছে ( -sঅনুমান আপনি সংগ্রহস্থলের মধ্যে একটি প্রমিত SVN লেআউট আছে trunk/, branches/এবং tags/):

    git svn clone [-s] <svn-url>
    
  • আমি একটি স্থানীয় শাখায় কাজ করি "কাজ" (শাখাটি "কাজ" -bতৈরি করে)

    git checkout -b work
    
  • স্থানীয়ভাবে "কার্য" শাখায় প্রতিশ্রুতিবদ্ধ ( -sআপনার প্রতিশ্রুতি বার্তায় সাইন-অফ করতে)। সিক্যুয়ালে, আমি ধরে নিয়েছি আপনি 3 স্থানীয় কমিট করেছেন

    ...
    (work)$> git commit -s -m "msg 1"
    ...
    (work)$> git commit -s -m "msg 2"
    ...
    (work)$> git commit -s -m "msg 3"
    

এখন আপনি এসভিএন সার্ভারে প্রতিশ্রুতিবদ্ধ করতে চান

  • [অবশেষে] আপনি যে পরিবর্তনগুলি এসভিএন সার্ভারে প্রতিশ্রুতিবদ্ধ দেখতে চান না তা স্ট্যাশ করুন (প্রায়শই আপনি মূল ফাইলটিতে কিছু কোড মন্তব্য করেছিলেন কেবল কারণ আপনি সংকলনটি ত্বরান্বিত করতে চান এবং প্রদত্ত বৈশিষ্ট্যে ফোকাস করতে চান)

    (work)$> git stash
    
  • এসভিএন সংগ্রহস্থল (এসভিএন সার্ভার থেকে আপডেট করতে) দিয়ে মাস্টার শাখাটি পুনরায় চালু করুন

    (work)$> git checkout master
    (master)$> git svn rebase
    
  • কাজের শাখায় ফিরে যান এবং মাস্টারের সাথে পুনর্বাসনা করুন

    (master)$> git checkout work
    (work)$> git rebase master
    
  • নিশ্চিত করে ব্যবহার করে সবকিছু ঠিক আছে:

    (work)$> git log --graph --oneline --decorate
    
  • এখন এই দুর্দান্ত --no-ffঅপশনটি ব্যবহার করে "কার্য" শাখা থেকে তিনটি কমিটকে "মাস্টার" তে মার্জ করার সময় এসেছে

    (work)$> git checkout master
    (master)$> git merge --no-ff work
    
  • আপনি লগগুলির স্থিতিটি লক্ষ্য করতে পারেন:

    (master)$> git log --graph --oneline --decorate
    * 56a779b (work, master) Merge branch 'work'
    |\  
    | * af6f7ae msg 3
    | * 8750643 msg 2
    | * 08464ae msg 1
    |/  
    * 21e20fa (git-svn) last svn commit
    
  • এখন আপনি সম্ভবত amendআপনার এসভিএন ডিউডের জন্য শেষ প্রতিশ্রুতি সম্পাদনা করতে ( ) সম্পাদনা করতে চান (অন্যথায় তারা কেবল "মার্চ শাখাটির কাজ" বার্তাটি দিয়ে একটি একক প্রতিশ্রুতি দেখতে পাবে

    (master)$> git commit --amend
    
  • অবশেষে এসভিএন সার্ভারে প্রতিশ্রুতিবদ্ধ

    (master)$> git svn dcommit
    
  • কাজে ফিরে যান এবং অবশেষে আপনার স্ট্যাশ করা ফাইলগুলি পুনরুদ্ধার করুন:

    (master)$> git checkout work
    (work)$> git stash pop
    

4
এই গিট n00b যে কাজের স্রোতটি খুঁজছিল তা ঠিক এটি। একটি বাগ সংশোধন করার জন্য একটি স্থানীয় শাখা তৈরি করুন, যা কিছু করুন, তারপরে এটিকে একটি সিঙ্গেল কমিট দিয়ে প্রেরণ করুন। এখানে সর্বাধিক রেট দেওয়া উত্তরটি ব্যবহার করে আমি কী করছি তা জবাবদিহি করে - ত্রুটি ছাড়াই এসএনএন রিবাজে গিট করতে পারি না।
জোয়াও Bragança এর

19
অপ্টে উদ্ধৃত গিট-এসএনএন ডকসটি কি ঠিক এর বিরুদ্ধে নয়? এর সাথে মার্জ চালিয়ে running--no-ffবিকল্পটির আপনি স্পষ্টভাবে একটি দ্রুত-ফরওয়ার্ডের পরিবর্তে মার্জ কমিট (দুটি পিতা-মাতার সাথে প্রতিশ্রুতি) তৈরি করছেন। এসএনএন-ট্র্যাকিং শাখায় সমস্ত কমিটগুলি একক পিতামাতার কমিটগুলি নিশ্চিত করার জন্য, সমস্ত মার্জগুলি অবশ্যই ফাস্ট-ফরোয়ার্ড হওয়া উচিত ( --ff-onlyএটির সাথে সহায়তা করতে পারে) অথবা, যদি ট্রাঙ্কটি আপনার পিছনে পিছনে পরিবর্তিত হয়েছে --squash, ঠিক আছে?
জেমনস

4
এটি এমন এক-অফ শাখার পক্ষে কাজ করে যা আপনি অবিলম্বে মুছুন, তবে git svn dcommitআপনি যে গিট প্রতিশ্রুতি দিয়েছিলেন তা আবার লিখে দেয়। এর অর্থ হ'ল আপনি এর অন্যান্য পিতামাতাকে হারিয়েছেন এবং এখন আপনার গিট রেপোর কোনও রেকর্ড নেই যে আপনি কখনই সেই শাখাকে একীভূত করেছিলেনmaster । এটি আপনার ওয়ার্কিং ডিরেক্টরিটিকে একটি অসামঞ্জস্য অবস্থায় ছেড়ে দিতে পারে।
রিডিস্ক

9
git merge --no-ff work -m "commit message"অতিরিক্ত git commit --amendপদক্ষেপ না রেখে ব্যবহার করুন
টেকুমার

3
আমার জন্য আমি "Git একত্রীকরণ --ff শুধুমাত্র কাজ" ব্যবহার করতে যেহেতু আমি আমার সব করে এবং শুধু গত এক সংরক্ষণ করতে ইচ্ছুক পছন্দ
Moataz Elmasry

49

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

আমার একটি "মাস্টার" শাখা রয়েছে যা আমি এসএনএন সার্ভারটি ট্র্যাক করতে ব্যবহার করি। এটিই আমি একমাত্র শাখা d যদি আমি কিছু কাজ করে চলেছি তবে আমি একটি বিষয় শাখা তৈরি করব এবং এটিতে কাজ করব। আমি যখন এটি প্রতিশ্রুতিবদ্ধ করতে চাই তখন আমি নিম্নলিখিতগুলি করি:

  1. বিষয় শাখায় প্রতিশ্রুতিবদ্ধ
  2. গিট এসএনএন রিবেস (আপনার কাজ এবং এসএনএন-এর মধ্যে যে কোনও বিরোধের সমাধান করুন)
  3. গিট চেকআউট মাস্টার
  4. গিট এসএনএন রিবেস (এটি পরবর্তী ধাপটিকে দ্রুত-এগিয়ে নিয়ে যাওয়া সংযুক্ত করে তোলে, নীচে হারুনের মন্তব্য দেখুন)
  5. গিট একত্রিত করার বিষয়_ব্রাঞ্চ
  6. যে কোনও মার্জ বিরোধগুলি সমাধান করুন (এই মুহুর্তে হওয়া উচিত নয়)
  7. git svn dcommit

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

git svn dcommit -nআপনি যে প্রতিশ্রুতিবদ্ধ হতে চান ঠিক তেমন প্রতিশ্রুতি দিচ্ছেন তা নিশ্চিত করার জন্য এটি প্রথমে সার্থক । গিটের বিপরীতে, এসএনএন-তে ইতিহাসের পুনর্লিখন করা শক্ত!

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


আমি যদি এটি সঠিকভাবে বুঝতে পারি, গিটের মধ্যে, এসএনএন দিয়ে গিট মার্জ করা ঠিক আছে, তবে এসএনএন দিয়ে এসএনএন নয়? সুতরাং আমি আমার এসএনএন / শাখাটিকে গিটে এসএনএন / ট্রাঙ্কের সাথে একীভূত করতে পারি না?
নট এল্ডুয়েসট

1
আপনি যদি তুচ্ছ কিছু করতে চান তবে এসভিএন-এ পুনর্লিখনের ইতিহাসটি শক্ত। তুচ্ছ মামলায় এটি কার্যত অসম্ভব।
অ্যারিস্টটল পাগাল্টজিস

19
গ্রেগ হিউগিলের উত্তরে প্রচুর ভোট রয়েছে, তবে আমি বিশ্বাস করি এটি ভুল। টপিক_ ব্রাঞ্চ থেকে মাস্টারে মার্জ করা কেবলমাত্র নিরাপদ যদি এটি কেবল দ্রুত-ফরওয়ার্ড একীভূত হয়। যদি এটি একটি মার্জ কমিটের প্রয়োজন হয় এমন সত্যিকারের মার্জ হয়, তবে ডিকমিট করার পরে মার্জ কমিট নষ্ট হয়ে যাবে। পরের বার আপনি টপিক_ ব্রাঙ্ককে মাস্টারে মার্জ করার চেষ্টা করার পরে গিট মনে করে যে প্রথম সংশ্লেষটি কখনই ঘটেনি এবং সমস্ত নরক ভেঙে যায়। প্রশ্নটি দেখুন কেন গিট এসভিএন ডিসকমিট স্থানীয় শাখাগুলির জন্য মার্জ কমিটের ইতিহাস হারিয়ে ফেলবে?
হারুন

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

1
@ অ্যারন: হ্যাঁ আমি জানি না আমি সেখানে কী ভাবছিলাম। আমি আবার এটি স্থির করেছি, আশা করি এটি কার্যকর হবে। ঝামেলার মধ্যে একটি হ'ল গিতে কাজ করার অনেক উপায় আছে যা ক্রিয়াকলাপের একটি নির্দিষ্ট ক্রম বর্ণনা করতে বেশ কিছুটা ব্যাখ্যা লাগে ।
গ্রেগ হিউগিল

33

সহজ সমাধান: মার্জ হওয়ার পরে 'কার্য' শাখা সরান

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

পটভূমির ব্যাখ্যা: মার্জ / ডিকমিট সমস্যাটি হ'ল যখনই আপনি একটি শাখা 'গিট এসএনএন ডিকমিট' করেন তখন 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 একত্রীকরণ সঙ্গে সাহায্য কিভাবে? )


এটিকে অযথা জটিল মনে হচ্ছে। আমি লোকদের করতে শুনেছি git merge --squash work, কেন এটি করবেন না? আপনি যদি একাধিক 'বাছাই' তৈরি করে থাকেন তবে মার্চে যাওয়ার আগে শাখায় স্কোয়াশ কমিটগুলি দেখতে পাচ্ছি (বলুন যে আপনার 8 টি কমিট রয়েছে এবং আপনি 4 টি কমিটের প্রতিটিকে 1 তে পরিণত করছেন এবং 2 টি কমিটকে মাস্টার হিসাবে মার্জ করছেন)। আমার 'কাজ' শাখাকে আপডেট করার সময়, আমি করি rebase, এটি আমার শাখার জন্য আরও একটি শাখা তৈরি করা এবং
সংযুক্তি

8

উপরে গ্রেগ হিউগিল উত্তর নিরাপদ নয়! দুটি "গিট এসএনএন রিবেস" এর মধ্যে যদি কোনও নতুন কমিট ট্রাঙ্কে উপস্থিত হয় তবে মার্জটি দ্রুত এগিয়ে যাবে না।

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


6

গিটে এসএনএন শাখাগুলি মার্জ করার একটি নিরাপদ উপায় হ'ল গিট মার্জ - স্কোয়াশ ব্যবহার করা। এটি একটি একক প্রতিশ্রুতি তৈরি করবে এবং আপনার বার্তা যুক্ত করার জন্য থামবে।

ধরা যাক আপনার একটি বিষয় এসএনএন শাখা রয়েছে, যাকে বলা হয় এসএনএন-ব্রাঞ্চ।

git svn fetch
git checkout remotes/trunk -b big-merge
git merge --squash svn-branch

এই মুহুর্তে আপনার এসভিএন-শাখা থেকে সমস্ত পরিবর্তন সূচকে অপেক্ষা করে এক প্রতিশ্রুতিতে স্কোয়াশড

git commit

অন্যরা যেমন উল্লেখ করেছে, যদিও এটি কমিটগুলির গ্রানুলারিটি হারাবে না।
Kzqai

@ চালচালক: কখনও কখনও আপনি ঠিক এটি চান। আমি প্রায়শই একটি বৈশিষ্ট্য শাখার আলায় "পূর্ববর্তী প্রতিশ্রুতি থেকে স্থির নোংরামি" তে প্রতিশ্রুতিবদ্ধ এবং এই মৃত প্রান্তগুলি আমি একটি ভাল খ্যাতির কারণে আড়াল করতে পছন্দ করি :-)
schoetbi

1
হ্যাঁ, যদিও আমি এটিকে একটি আঁটসাঁট হাঁটা হিসাবে বিবেচনা করি, যেহেতু আপনি যখনই স্কোয়াশ করেন, আপনি পৃথক প্রতিশ্রুতিগুলি পরে আলাদা করার ক্ষমতাও হারাবেন। প্রতিশ্রুতিবদ্ধ মানদণ্ডের বিভিন্ন পছন্দের বিষয়।
Kzqai

1
@ এসকোয়েতবি হ্যাঁ, আপনাকে প্রকাশের আগে কখনও কখনও অগোছালো ইতিহাস পরিষ্কার করতে হবে। এইখানেই 'গিট রিবেস -i <ট্রাঙ্ক>' হ'ল একটি দুর্দান্ত সহায়তা: আপনি যোগদান / পুনরায় অর্ডার / অপসারণ এবং এমনকি বিভক্ত (!) করতে পারেন, ঠিকঠাকভাবেই ঠিক করতে পারেন *।
inger

5

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

git rebase master topic

যা তারপরে মাস্টার শাখার উপর আপনার কমিটগুলি খেলবে যা আপনাকে ডিসকমিট করার জন্য প্রস্তুত

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