গিট রিবেস পরামিতিগুলি বোঝা এবং মুখস্থ করা


12

এখন পর্যন্ত গিটের সবচেয়ে বিভ্রান্তিকর অংশটি অন্য একটি শাখায় প্রত্যাবর্তন করছে। বিশেষত, এটি হ'ল কমান্ড লাইন যুক্তিগুলি যা বিভ্রান্তিকর।

প্রতিবার আমি যখন একটি শাখার ছোট্ট টুকরোটিকে অন্যটির ডগায় রিবেস করতে চাই, আমাকে গিট রিবেস ডকুমেন্টেশনটি পর্যালোচনা করতে হবে এবং 3 টি মূল আর্গুমেন্টের প্রতিটি কী হওয়া উচিত তা বুঝতে আমার 5-10 মিনিট সময় নেয়।

git rebase <upstream> <branch> --onto <newbase>

এই শাখার 3 টি প্যারামিটারের প্রতিটিটিতে অন্য কোনও শাখায় পুনরায় বাসস্থান দেওয়া উচিত তা কি মুখস্থ করতে আমাকে সাহায্য করার জন্য থাম্বের একটি ভাল নিয়ম কী?

মনে রাখবেন আমি গিট-রিবেস ডকুমেন্টেশনটি আবারও এবং আবারও এবং আবার এবং আবারও (এবং আবারও) চলে এসেছি, তবে এটি বোঝা সর্বদা কঠিন (একঘেয়ে বৈজ্ঞানিক সাদা কাগজ বা কোনও কিছুর মতো)। সুতরাং এই মুহুর্তে আমি অনুভব করি যে আমাকে এটি উপলব্ধি করতে আমার অন্যান্য লোকদের জড়িত হওয়া দরকার।

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


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

4
আহ, এই গিট কমান্ড অপশনগুলির খাঁটি কমনীয়তা। স্বজ্ঞাতভাবে ব্যবহার করতে। সর্বদা একটি সত্য পরিতোষ।
জেনসজি

উত্তর:


10

--ontoমুহুর্তের জন্য এড়ানো যাক । upstreamএবং branchবেশ বেসিক, এবং প্রকৃতপক্ষে নকল করা checkoutএবং branch- দ্বিতীয় যুক্তি alচ্ছিক :

git branch <newbranch>
git branch <newbranch> <base>
git checkout -b <newbranch>
git checkout -b <newbranch> <base>
git rebase <upstream>
git rebase <upstream> <branch>

(পাশাপাশি, rebase"আপ স্ট্রিম" এবং "ব্রাঞ্চ" এ এই যুক্তিগুলির নামগুলি খুব বর্ণনামূলক আইএমও নয় I আমি সাধারণত এগুলিকে পীচফ্ট্রির মতোই মনে করি <start>এবং <end>আমি কীভাবে এগুলি ব্যবহার করব git rebase <start> <end>:)

দ্বিতীয় শাখাটি বাদ দেওয়া হলে ফলাফলটি প্রথম সেই শাখাটি পরীক্ষা করে দেখার পরে প্রায় একই রকম হয় যেন আপনি সেই শাখাটি নির্দিষ্ট করেন নি। ব্যতিক্রম হ'ল branchযা আপনার বর্তমান শাখা পরিবর্তন করে না:

git checkout <base> && git branch <newbranch> && git checkout <previous_branch>
git checkout <base> && git checkout -b <newbranch>
git checkout <end>  && git rebase <start>

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

A--B--F--G master
    \
     C--D--E feature

এর git merge masterফলাফল:

A--B--F-----G master
    \        \
     C--D--E--H feature

যখন একটি git rebase master(শাখায় থাকাকালীন feature) এর ফলাফল এর মধ্যে রয়েছে:

A--B--F--G master
          \
           C'--D'--E' feature

উভয় ক্ষেত্রেই featureএখন উভয় masterএবং এর কোড রয়েছে feature। আপনি যদি চালু না থাকেন featureতবে দ্বিতীয় যুক্তিটি এটিতে একটি শর্টকাট হিসাবে স্যুইচ করতে ব্যবহার করা যেতে পারে: git rebase master featureউপরের মত একই কাজ করবে।


এখন, বিশেষ জন্য --onto। এটির সাথে মনে রাখার জন্য গুরুত্বপূর্ণ অংশটি এটি <start>নির্দিষ্ট না করা হলে ডিফল্ট হয় । সুতরাং উপরে, আমি যদি নির্দিষ্টভাবে --ontoনির্দিষ্ট করে রাখি তবে এর ফলাফলটি একই হবে:

git rebase --onto master master
git rebase --onto master master feature

( মানসিকভাবে পার্স করা সহজ, কারণ আমি --ontoউল্লেখ না করেই ব্যবহার করি না <end>, এমনকি ভেবেছিলাম যে দু'টি ইতিমধ্যে চালু থাকলে একই feature।)

কেন কার্যকর তা দেখার --ontoজন্য এখানে একটি আলাদা উদাহরণ। ধরা যাক আমি চালু ছিলাম featureএবং একটি বাগ লক্ষ্য করলাম, যা আমি তখনই ঠিক করতে শুরু করেছিলাম - তবে ভুলের featureপরিবর্তে ব্রাঞ্চ বন্ধ masterকরে দিয়েছিলাম:

A--B--F--G master
    \
     C--D--E feature
            \
             H--I bugfix

আমি যা চাই তা হল এই প্রতিশ্রুতিগুলি "সরানো" bugfixযাতে তারা আর নির্ভর করে না feature। যেমনটি হ'ল, এই উত্তরে উপরে প্রদর্শিত যেকোন ধরণের মার্জ বা রিবেস featureদুটি চুক্তি সহ তিনটি কমিট গ্রহণ করবে bugfix

উদাহরণস্বরূপ, git rebase master bugfixভুল। এর থেকে সমস্ত কমিটগুলি অন্তর্ভুক্ত করার <start>জন্য পরিসীমা , যা এর উপরে পুনরায় খেলানো হয় :<end>featuremaster

A--B--F--G master
    \     \
     \     C'--D'--E'--H'--I' bugfix
      \
       C--D--E feature

আমরা আসলে কী চান থেকে করে পরিসীমা হয় featureথেকে bugfixউপরে গুলোতে করা master। এটাই হচ্ছে --onto- "স্টার্ট" শাখার চেয়ে আলাদা "রিপ্লে" লক্ষ্য নির্দিষ্ট করে:

git rebase --onto master feature bugfix

A--B--F--G master
    \     \
     \     H'--I' bugfix
      \
       C--D--E feature

1

কেবলমাত্র একটি রিফ্রেশার, রিবাইজিং মূলত যখন আপনি চান যে আপনার প্রতিশ্রুতিবদ্ধ ইতিহাসটি লিনিয়ার প্রদর্শিত হয় যদি দুটি শাখা একে অপরের থেকে স্বতন্ত্রভাবে বিকশিত হয়, মূলত এটি ইতিহাস লেখার পুনর্লিখন করে।

আমি যেভাবে এটি করতে পছন্দ করি তা হ'ল git rebase --onto <target branch> <start branch> <end branch>

যেখানে <target branch>শাখা আপনি সম্মুখের rebasing হয়, <start branch>স্বাভাবিকভাবে যা থেকে শাখা <end branch>বিভক্ত এবং <end branch>শাখা আপনি rebasing হয়।

আপনি যদি দিয়ে শুরু

A--B--F--G master
    \
     C--D--E feature

এবং কর

git rebase --onto master master feature

তুমি পাবে

A--B--F--G master
          \
           C'--D'--E' feature

আরও একটি ভাল জিনিস জানতে হবে যে <target branch>ডিফল্ট <start branch>হিসাবে আপনি একই একই রিবেস করতে পারেন

git rebase --onto master feature

আপনার যদি আরও সহায়তার প্রয়োজন হয় তবে অশ্রু গাইড ছাড়া রিবেসটি দেখুন


আপনার ফলাফল বিভ্রান্তিকর দেখাচ্ছে। রিবাজে masterশাখাটি নিজেই অপরিবর্তিত থাকা উচিত । আপনি থামার G--C'--D'--E'সময় কেবল শাখাগুলিতে 'ফিচার' পাবেন । masterG
ফ্রাঙ্ক

@ ফ্র্যাঙ্ক, আমি পুরো লিনিয়ার ইতিহাসের বিষয়টির উপর জোর দেওয়ার জন্য এটি করেছি তবে এখন আমি মনে করি আপনি ভাল আছেন। স্থির করেছি।
পীচফ্রি

1
পাঠকদের সর্বাধিক সাধারণ ক্ষেত্রে বুঝতে সাহায্য করার জন্য আপনি কোথায় <target branch>এবং <start branch>পৃথকভাবে একটি উদাহরণ প্রদর্শন করতে পারেন?
রাফলউইন্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.