বিভিন্ন শাখায় নির্দিষ্ট কমিট থেকে শাখা কীভাবে তৈরি করা যায়


107

আমি মাস্টার শাখায় বেশ কয়েকটি কমিটি করেছি এবং সেগুলি দেব শাখায় একীভূত করেছি।

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

আমি আদেশগুলি ব্যবহার করেছি:

git checkout dev
git branch  <branch name> <commit id>

যাইহোক, এটি মাস্টার শাখা থেকে শাখা তৈরি করে, দেব প্রত্যাশাটি নয়। কমিট আইডি মাস্টার শাখা এবং দেব শাখায় সমান। সুতরাং, আমি কীভাবে বিভিন্ন শাখায় একই কমিট আইডি পার্থক্য করতে পারি?

PS: আমি এখানে গিথুবে একটি উদাহরণ তৈরি করেছি https://github.com/RolandXu/test_for_branch

আমি আদেশগুলি ব্যবহার করেছি:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8

আমি যা প্রত্যাশা করি তা হ'ল পরীক্ষার শাখায় aa.txt bb.txt cc.txt রয়েছে। তবে, পরীক্ষা শাখায় কেবল aa.txt এবং cc.txt রয়েছে। এটি সম্ভবত মাস্টার শাখা থেকে শাখা তৈরি করেছে।

উত্তর:


154

আপনি যদি branchকমান্ডের এই ফর্মটি (স্টার্ট পয়েন্ট সহ) ব্যবহার করে থাকেন তবে এটি কোথায় তা আপনার বিবেচ্য নয় HEAD

তুমি কি করছ:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8
  • প্রথমে, আপনি HEADশাখায় সেট আপ করুন dev,

  • দ্বিতীয়ত, আপনি প্রতিশ্রুতিবদ্ধ উপর একটি নতুন শাখা শুরু 07aeec98। এই প্রতিশ্রুতিতে কোনও বিবি টেক্সট নেই (আপনার গিথুব রেপো অনুসারে)।

যদি আপনি একটি নতুন শাখা শুরু করতে চান তাহলে অবস্থান আপনি শুধু চেক আউট আছে এ আপনি হয় কোন শুরুর বিন্দু সঙ্গে শাখা চালাতে পারেন:

git branch test

বা অন্যরা যেমন উত্তর দিয়েছে, সেখানে একটি ক্রিয়াকলাপে সেখানে শাখা এবং চেকআউট:

git checkout -b test

আমি মনে করি যে আপনি সম্ভবত এই শাখারই 07aeec98অংশ দ্বারা বিভ্রান্ত হতে পারেন dev। সত্য যে এই প্রতিশ্রুতি পূর্বপুরুষ dev, এটির সর্বশেষ প্রতিশ্রুতিতে পৌঁছানোর জন্য এর পরিবর্তনগুলি প্রয়োজন dev। তবে, এগুলি অন্যান্য চুক্তি যা সর্বশেষতম পৌঁছানোর জন্য প্রয়োজন devএবং এগুলি ইতিহাসের ইতিহাসে অগত্যা নয় 07aeec98

8480e8ae(যেখানে আপনি bb.txt যুক্ত করেছেন) উদাহরণটি ইতিহাসের নয় 07aeec98। আপনি যদি শাখা করেন তবে আপনি 07aeec98পরিবর্তিত পরিবর্তনগুলি পাবেন না 8480e8ae

অন্য কথায়: আপনি যদি শাখা A এবং শাখা বি শাখা সিতে মার্জ করেন, তবে A এর প্রতিশ্রুতিতে একটি নতুন শাখা তৈরি করুন, আপনি বি তে প্রবর্তিত পরিবর্তনগুলি পাবেন না won't

এখানেও আপনার দুটি সমান্তরাল শাখা মাস্টার এবং দেব ছিল, যা আপনি দেবের সাথে একীভূত হয়েছিলেন। মাস্টার কমিট থেকে বের হওয়া (একীভূতের চেয়ে পুরানো) আপনাকে দেবের পরিবর্তনগুলি সরবরাহ করবে না।


আপনি যদি নিজের বৈশিষ্ট্য শাখায় মাস্টার থেকে নতুন পরিবর্তন স্থায়ীভাবে সংহত করতে চান তবে আপনার সেগুলিতে একীভূত হয়ে চলতে masterহবে। যদিও এটি আপনার বৈশিষ্ট্য শাখায় মার্জ কমিট তৈরি করবে।

আপনি আপনার বৈশিষ্ট্য শাখা প্রকাশ করেন নি, তাহলে আপনি আপডেট মাস্টার তাদের রি-বেসের ফলে পারেন: git rebase master featureA। সম্ভাব্য দ্বন্দ্ব সমাধানের জন্য প্রস্তুত থাকুন।

আপনি যদি এমন একটি ওয়ার্কফ্লো চান যেখানে আপনি মার্জ কমিটস্ থেকে মুক্ত বৈশিষ্ট্য শাখায় কাজ করতে পারেন এবং এখনও মাস্টারটিতে নতুন পরিবর্তনের সাথে সংহত করতে পারেন, আমি নিম্নলিখিতটি সুপারিশ করছি:

  • মাস্টার প্রতিশ্রুতি উপর ভিত্তি করে প্রতিটি নতুন বৈশিষ্ট্য শাখা
  • devমাস্টার একটি প্রতিশ্রুতি উপর একটি শাখা তৈরি
  • যখন আপনাকে দেখতে হবে যে কীভাবে আপনার বৈশিষ্ট্য শাখাটি মাস্টারে নতুন পরিবর্তনের সাথে সংহত হয়, তখন মাস্টার এবং বৈশিষ্ট্য শাখা উভয়কেই এতে একত্রিত করে dev

devসরাসরি প্রতিশ্রুতিবদ্ধ করবেন না , এটি কেবল অন্যান্য শাখা মার্জ করার জন্য ব্যবহার করুন।

উদাহরণস্বরূপ, আপনি যদি এ এবং বি বৈশিষ্ট্যটিতে কাজ করছেন:

a---b---c---d---e---f---g -master
    \       \
     \       \-x -featureB
      \
       \-j---k -featureA

devনতুন মাস্টারের সাথে তারা ভালভাবে কাজ করে কিনা তা পরীক্ষা করতে শাখাগুলিকে একটি শাখায় মার্জ করুন :

a---b---c---d---e---f---g -master
    \       \            \
     \       \            \--x'---k' -dev
      \       \             /    /   
       \       \-x----------    /    -featureB
        \                      /
         \-j---k--------------- -featureA

আপনি আপনার বৈশিষ্ট্য শাখাগুলিতে কাজ চালিয়ে যেতে পারেন এবং devনিয়মিতভাবে মাস্টার এবং বৈশিষ্ট্য শাখা উভয় থেকে নতুন পরিবর্তনগুলিতে মার্জ করে রাখতে পারেন ।

a---b---c---d---e---f---g---h---i----- -master
    \       \            \            \
     \       \            \--x'---k'---i'---l' -dev
      \       \             /    /         /
       \       \-x----------    /         /  -featureB
        \                      /         /  
         \-j---k-----------------l------ -featureA

যখন নতুন বৈশিষ্ট্যগুলি সংহত করার সময় হয়ে যায় তখন বৈশিষ্ট্যগুলি শাখাগুলি (নয় dev!) মাস্টারে মার্জ করুন ।


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

আমি কোনও মন্তব্যে উত্তর দিতে পারিনি, তাই আমি প্রস্তাবিত কর্মপ্রবাহের সাথে আমার উত্তর আপডেট করি।
গৌথিয়ার

আরে - উজ্জ্বল এবং পুরো উত্তর জন্য ধন্যবাদ! শুধু কৌতূহলী: শেষ পর্যন্ত, কেন একটি করা উচিত merge the feature branches (not dev!) into master?
cassi.lup

devশাখায় সত্যিকারের নতুন কোনও উন্নয়ন নেই । আপনার শাখাগুলির বৈশিষ্ট্য নির্দিষ্ট রাখা উচিত। devশুধুমাত্র মার্জ কমিট রয়েছে। masterবৈশিষ্ট্যগুলিকে একত্রিত করার পরে ফলাফলটি মার্জ করার চেয়ে সমস্ত নতুন বৈশিষ্ট্যকে সরাসরি একত্রিত করা আরও বেশি অর্থবোধ করে master
গৌথির

@ গৌথির আপনি কেন এই প্রশ্নের সমাধান করেন নি। আমার কাছে এটি একটি মার্জ মত শোনাচ্ছে devঠিক বৈশিষ্ট্য সঙ্গে A Bএবং Cএটা মধ্যে মিশে গিয়ে তৈরি মধ্যে masterস্বতন্ত্রভাবে মার্জ অভিন্ন A Bএবং Cমধ্যে master। যদি তা না হয় তবে গিটটি কীভাবে কাজ করে তা সম্পর্কে আমার বোঝার বিষয়টি চ্যালেঞ্জ করে এবং কেন আমি খুব কৌতূহলী হতে পারি!
স্টিভেন লু

54

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

git branch <branch-name> <commit>

এবং তার জন্য, এটি কী শাখা চেক আউট করা যায় তা বিবেচনা করে না; আপনি যা বলবেন তা তা করবে। (যদি আপনি প্রতিশ্রুতি যুক্তি বাদ দেন তবে এটি বর্তমানের মতো একই স্থানে একটি শাখা তৈরি করা ডিফল্ট)

আপনি নতুন শাখাটি তৈরি করার সাথে সাথে যদি এটি দেখতে চান তবে:

git checkout -b <branch> <commit>

একই আচরণের সাথে যদি আপনি প্রতিশ্রুতি যুক্তি বাদ দেন।


22

প্রত্যেকে ব্যবহার করে উল্লিখিত হিসাবে আপনি স্থানীয়ভাবে এটি করতে পারেন

git checkout -b <branch-name> <sha1-of-commit>

বিকল্পভাবে, আপনি গিথুব নিজেই এটি করতে পারেন, পদক্ষেপগুলি অনুসরণ করুন:

1- সংগ্রহস্থলে, ক্লিক করুন Commits

2- আপনি যে শাখাটি থেকে শাখা করতে চান <>সেই প্রতিবেদনে ইতিহাসের এই মুহুর্তে সংগ্রহস্থল ব্রাউজ করতে ক্লিক করুন ।

ইতিহাস প্রতিশ্রুতিবদ্ধ

3- tree: xxxxxxউপরের বাম দিকে ক্লিক করুন । Create branch xxxনীচে প্রদর্শিত হিসাবে কেবল সেখানে একটি নতুন শাখার নাম টাইপ করুন ।

নতুন শাখা তৈরি করুন

এখন আপনি স্থানীয়ভাবে সেই শাখা থেকে পরিবর্তনগুলি আনতে এবং সেখান থেকে চালিয়ে যেতে পারেন।


এটি আমার প্রয়োজন ছিল .. ওয়েব সাইটে এটি কীভাবে করবেন
eharo2

আমি এটা কখনই জানতাম না। এই হল. জিইউআই জিনিসটি দুর্দান্ত এবং আমি সি এল এল থেকে দূরে থাকতে চেয়েছিলাম।
রোহিত গুপ্ত

এটি উত্তর হিসাবে চিহ্নিত করা উচিত ¡
সন্দীপ আনন্দ

11

চেষ্টা করুন

git checkout <commit hash>
git checkout -b new_branch

প্রতিশ্রুতিটি কেবল একবার আপনার গাছে থাকা উচিত, দুটি পৃথক শাখায় নয়।

এটি আপনাকে সেই সুনির্দিষ্ট প্রতিশ্রুতি পরীক্ষা করতে এবং আপনার নামটি কী তা নামকরণ করার অনুমতি দেয়।


হাই আমি গিট লগ ডেভ এবং গিট লগ মাস্টার চেষ্টা করে দেখলাম কমিট হ্যাশ আইডি
কমিটের

এটি gitkআপনার লগটি ভিজ্যুয়ালাইজ করার মতো কিছু ব্যবহার করতে সহায়তা করতে পারে
জেডমোরেক

আমি নতুনভাবে গিথুবে একটি উদাহরণ যুক্ত করছি। এবং গৌথির ইতিমধ্যে আমার প্রশ্নের উত্তর দিয়েছেন যে আমি গিট শাখা মোডকে ভুল বুঝি। আপনাকে ধন্যবাদ :)
RolandXu

এটি আমার মনে হয় একারণে উত্তর। ধন্যবাদ
ভাইরাস

9

তোমাকে করতে হবে:

git branch <branch_name> <commit>

(আপনি শাখার নাম এবং প্রতিশ্রুতি বিনিময় করেছিলেন)

অথবা আপনি এটি করতে পারেন:

git checkout -b <branch_name> <commit>

আপনার জায়গায় যদি শাখার নাম ব্যবহার করা হয় তবে আপনি শাখার ডগায় একটি শাখা পেয়ে যাবেন।


এর HEADঅর্থ কী নয় । আপনি "শাখার অগ্রভাগ" বলতে পারেন বা তার পরিবর্তে "শাখাটির প্রতিশ্রুতিবদ্ধ করুন" বলতে পারেন।
ক্যাস্যাবেল

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