আমি কীভাবে একটি দূরবর্তী ট্র্যাকিং শাখা ('গিট টান' এর মতো) থেকে 'গিট ফেচ' এবং 'গিট মার্জ' করব?


111

আমি গিটে কিছু দূরবর্তী ট্র্যাকিং শাখা স্থাপন করেছি, তবে আমি 'গিট ফেচ' দিয়ে আপডেট করার পরে আমি কখনই সেগুলি স্থানীয় শাখায় মার্জ করতে সক্ষম হতে পারব না।

উদাহরণস্বরূপ, ধরুন আমার কাছে 'আন-অন্যান্য-শাখা' নামে প্রত্যন্ত শাখা রয়েছে। আমি স্থানীয়ভাবে এটি ট্র্যাকিং শাখা হিসাবে সেট আপ করেছি

git branch --track an-other-branch origin/an-other-branch

এ পর্যন্ত সব ঠিকই. তবে যদি সেই শাখাটি আপডেট হয়ে যায় (সাধারণত আমার দ্বারা মেশিনটি সরানো হয় এবং সেই মেশিনটি থেকে বেরিয়ে আসা হয়), এবং আমি এটি মূল মেশিনে আপডেট করতে চাই, আমি আনতে / একীভূত হয়ে সমস্যায় পড়ছি:

git fetch origin an-other-branch
git merge origin/an-other-branch

আমি যখনই এটি করি, আমি একটি 'ইতিমধ্যে আপ টু ডেট' বার্তা পাই এবং কিছুই মার্জ করে না।

তবে, ক

git pull origin an-other-branch

আপনি যেমন প্রত্যাশা করবেন তা সর্বদা এটি আপডেট করুন।

এছাড়াও, গিট ডিফ চলমান

git diff origin/an-other-branch

দেখায় যে পার্থক্য রয়েছে, তাই আমার মনে হয় আমার সিনট্যাক্সটি ভুল।

আমি কি ভুল করছি?

সম্পাদনা [2010-04-09]: আমি কয়েকবার পরীক্ষা করে দেখেছি এবং আমি অবশ্যই অন্য কোনও শাখায় আছি না। আমার 'গিট ফ্যাচ' এর পরে 'গিট গিফট' করা উচিত (উপরে দেখানো হয়েছে) গিট টানার মতো একই জিনিস করা উচিত? আমি গিটের স্থিতি ইত্যাদির ফলাফলগুলি দেখিয়ে কিছু কর্মপ্রবাহ পাব

উত্তর:


170

আপনি একটি শাখা আনেন না, আপনি একটি সম্পূর্ণ রিমোট আনুন:

git fetch origin
git merge origin/an-other-branch

8
আরও বিশদ: git fetch origin an-other-branchআনীত টিপটি সংরক্ষণ করে FETCH_HEAD, তবে origin/an-other-branch(যেমন স্বাভাবিক 'দূরবর্তী ট্র্যাকিং শাখা' নয়)। সুতরাং, কেউ করতে পারে git fetch origin an-other-branch && git merge FETCH_HEADতবে @ গ্যারেথের মতো এটি করা ভাল (বা কেবল গিট টান ব্যবহার করুন )।
ক্রিস জনসন

সুতরাং যদি মূলটির 1000 টি শাখা থাকে তবে আপনি কি তাদের সকলের জন্য একটি দূরবর্তী শাখা রাখবেন?
গৌথির

4
অবশ্যই। আমি আমার 1000 শাখার সঙ্গে একটি দূরবর্তী সংগ্রহস্থল জুড়েছেন, এবং আমি জিজ্ঞাসা শাখা দূরবর্তী থাকে, তবে তাতে অভিশাপ ভাল ভাল আমাকে সমস্ত 1000 দিতে
গ্যারেথ

হবে git merge origin/an-other-branchএকত্রীকরণ origin/an-other-branchসকল স্থানীয় শাখা এটি ট্র্যাক করতে নির্ধারণ করা হয় মধ্যে? আমি কীভাবে কেবল একটি স্থানীয় শাখায় একীভূত হতে পারি?
উভচর

1
সুতরাং git pull(কোনও যুক্তি ছাড়াই) কী করবে - কোন শাখায় এটি মার্জ হবে? এটি কি বর্তমান শাখার সাথে সম্পর্কিত রিমোট ট্র্যাকিং শাখাটি মার্জ করে ?
লাল মটর

69

কেবল একটি শাখা নির্বাচন করা: fetch/ merge বনাম pull

লোকেরা প্রায়শই আপনাকে "মার্জিং" থেকে "আনতে" আলাদা করার পরামর্শ দেয়। তারা এর পরিবর্তে বলে:

    git pull remoteR branchB

এটা কর:

    git fetch remoteR
    git merge remoteR branchB

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

    git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
    git branch -a  # to verify
    git branch -t branchB remoteR/branchB

অবশ্যই, এটি .git/configহাস্যকররূপে মনে রাখা শক্ত, সুতরাং আপনি যদি সত্যই সমস্ত শাখা আনতে চান তবে প্রোজিট-এ বর্ণিত হিসাবে আপনার পরিবর্তন করা ভাল ।

তাই না?

এগুলির সর্বোত্তম ব্যাখ্যা হ'ল প্রোজিট, গিট ইন্টারনালস - দ্য রেফস্পেক ( বা গিথাবের মাধ্যমে ) এর 9-5 অধ্যায় । গুগলের মাধ্যমে এটি আশ্চর্যজনকভাবে খুঁজে পাওয়া শক্ত।

প্রথমত, আমাদের কিছু পরিভাষা পরিষ্কার করতে হবে। রিমোট-ব্রাঞ্চ-ট্র্যাকিংয়ের জন্য সচেতন হওয়ার জন্য সাধারণত 3 টি আলাদা শাখা রয়েছে:

  1. রিমোট রেপোতে শাখা: refs/heads/branchBঅন্য রেপোর ভিতরে
  2. তোমার দূরবর্তী-ট্র্যাকিং শাখা : refs/remotes/remoteR/branchBআপনার রেপো
  3. আপনার নিজস্ব শাখা: আপনার রেপুর refs/heads/branchBভিতরে

রিমোট-ট্র্যাকিং শাখাগুলি (ইন refs/remotes) কেবল পঠনযোগ্য। আপনি সরাসরি এগুলি সংশোধন করবেন না। আপনি নিজের শাখাটি পরিবর্তন করুন এবং তারপরে আপনি রিমোট রেপোতে সংশ্লিষ্ট শাখায় চাপ দিন। refs/remotesউপযুক্ত টান বা আনার পরে ফলাফলটি আপনার প্রতিফলিত হয় না । এই পার্থক্যটি আমার পক্ষে গিট ম্যান-পৃষ্ঠাগুলি থেকে বোঝা মুশকিল ছিল, মূলত কারণ স্থানীয় শাখা ( refs/heads/branchB) যখন .git/configসংজ্ঞায়িত করা হয় তখন দূরবর্তী ট্র্যাকিং শাখাটি "ট্র্যাক" করে branch.branchB.remote = remoteR

সি ++ পয়েন্টার হিসাবে 'রেফ' ভাবেন। শারীরিকভাবে, এগুলি হ'ল SHA- হজমযুক্ত ফাইলগুলি, তবে মূলত তারা কেবল প্রতিশ্রুতিবদ্ধ গাছের মধ্যে পয়েন্টার। git fetchআপনার প্রতিশ্রুতিযুক্ত গাছগুলিতে অনেকগুলি নোড যুক্ত করবে, তবে কীভাবে গিট কী সিদ্ধান্ত নেয় কী কী পয়েন্টারগুলি সরানো হবে তা কিছুটা জটিল।

অন্য উত্তরে যেমন উল্লেখ করা হয়েছে , তেমনও নয়

    git pull remoteR branchB

না

    git fetch remoteR branchB

সরানো হবে refs/remotes/branches/branchB, এবং পরবর্তীকালে অবশ্যই সরানো যাবে না refs/heads/branchB। যাইহোক, উভয় পদক্ষেপ FETCH_HEAD। (আপনি পারেন catএই ফাইল ভিতরে কোন .git/যখন তারা পরিবর্তন দেখতে।) এবং git mergeপড়ুন হবে FETCH_HEAD, যখন সেটিং MERGE_ORIG, ইত্যাদি


1
আপনি কি জানেন যে গিট ইন্টারনালসের সাথে আপনার লিঙ্কটি এই একই প্রশ্নের লিঙ্ক?
শাহবাজ

9

আপনি an-other-branchমার্জ হওয়ার সময় আপনি কি স্থানীয় লোকের বিষয়ে নিশ্চিত ?

git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch

অন্যান্য ব্যাখ্যা :

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

যদি আপনি একটি প্রতিশ্রুতি দিয়ে রিমোট রেপো থেকে এগিয়ে থাকেন তবে এটি রিমোট রেপোর পুরানো, আপনি নয়।

তবে আপনার ক্ষেত্রে, যদি git pullকাজ করে তবে এর অর্থ কেবল আপনি সঠিক শাখায় নেই।


3

গিট টান আসলে একটি কম্বো সরঞ্জাম: এটি গিট আনতে (পরিবর্তনগুলি গ্রহণ করে) এবং গিট মার্জ চালায় (আপনার বর্তমান অনুলিপিটির সাথে মার্জ করে)

আপনি কি নিশ্চিত যে আপনি সঠিক শাখায় আছেন?


আমি মনে করি ওপি বিভিন্নভাবে রয়েছে। শাখা, আমার সাথে ঘটে।
চাকলাদার আসফাক আরেফে

1

এগুলি হ'ল আদেশগুলি:

git fetch origin
git merge origin/somebranch somebranch

আপনি যদি দ্বিতীয় লাইনে এটি করেন:

git merge origin somebranch

এটি স্থানীয় মাস্টারটিকে আপনার বর্তমান শাখায় মার্জ করার চেষ্টা করবে।

প্রশ্নটি আমি যেমন বুঝতে পেরেছি, আপনি কি ইতিমধ্যে স্থানীয়ভাবে নিয়ে এসেছেন এবং এখন আপনার শাখাটি একই শাখার সর্বশেষে একীভূত করতে চান ?

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