'স্থানীয়' এবং 'রিমোট' ট্র্যাক রেখে গিট রিবেস


174

গিট রিবেস করার সময়, দ্বন্দ্বের সমাধান করার সময় 'স্থানীয়' এবং 'রিমোট' এর সাথে কী ঘটছে তা নিয়ে কাজ করতে আমার প্রায়শই অসুবিধা হয়। আমার মাঝে মাঝে ধারণা হয় যে তারা একটি থেকে অন্যটির প্রতিশ্রুতিবদ্ধ দিকগুলি সরিয়ে নিয়ে যায়।

এটি সম্ভবত (অবশ্যই) কারণ আমি এখনও সঠিকভাবে বুঝতে পারি নি।

প্রত্যাখ্যান করার সময়, 'স্থানীয়' কে এবং 'দূরবর্তী' কে?

(আমি বিরোধগুলি সমাধানের জন্য P4Merge ব্যবহার করি)


এটা কি সম্ভব যে পড়া এই আপনি সাহায্য করবেন? টিউটোরিয়ালটির বাকি
অংশটিও

আর একটি দুর্দান্ত গিট রিসোর্স
অজানা

চান stackoverflow.com/questions/2959443/... সাহায্য করেছিল? (' git svn' অংশের জন্য নয় , কেবল ' git rebase' অংশের জন্য))
ভোনসি

@ ভনসি, হ্যাঁ, এটি ঠিক। আপনি যদি এখানে আপনার উত্তরটির প্রাসঙ্গিক
কিছুটি

ঠিক আছে ... আমি কামড় দেব;) প্রাসঙ্গিক নিষ্কাশন পোস্ট করা হয়েছে।
ভনসি

উত্তর:


244

টি এল; ডিআর;

সংক্ষেপে ( বেনুবার্ডের মতামত হিসাবে ), কখন:

git checkout A
git rebase   B    # rebase A on top of B
  • localহয় B(রি-বেসের ফলে সম্মুখের ),
  • remote হয় A

এবং:

git checkout A
git merge    B    # merge B into A
  • localহয় A(একত্রীকরণ মধ্যে ),
  • remote হয় B

একটি রিবেস স্যুইচ করে ours(রিবেস শুরুর আগে বর্তমান শাখা) এবং theirs(যে শাখার উপরে আপনি পুনঃস্থাপন করতে চান)।


কুত্স্কেম উল্লেখ করেছেন যে, জিইউআই মার্জারটুল প্রসঙ্গে :

  • স্থানীয় রেফারেন্স আংশিকভাবে রিবেসড কমিটস : " ours" (উজানের শাখা)
  • রিমোট আসন্ন পরিবর্তনগুলি বোঝায় : " theirs" - রিবেসের আগে বর্তমান শাখা।

এই উত্তরের শেষ অংশে চিত্র দেখুন।


রিবেস করার সময় বিপর্যয়

বিভ্রান্তি একটি রিবেসের বিপরীতকরণের সময় oursএবং এরtheirs সাথে সম্পর্কিত হতে পারে ।
(প্রাসঙ্গিক নিষ্কাশন)

git rebaseম্যান পৃষ্ঠা :

নোট করুন যে একটি রিবেস মার্জ শাখার উপরে কার্যকারী শাখা থেকে প্রতিটি প্রতিশ্রুতি পুনরায় খেলতে কাজ করে <upstream>

এ কারণে, যখন মার্জ সংঘাত ঘটে:

  • ' ours' হিসাবে উল্লিখিত পার্শ্বটি এতদূর প্রত্যাবর্তিত সিরিজ, যার সাথে শুরু করে <upstream>,
  • এবং ' theirs' হ'ল কার্যকারী শাখা। অন্য কথায়, পক্ষগুলি অদলবদল করা হয়।

বিপরীত চিত্রিত

সংযুক্তিতে

x--x--x--x--x(*) <- current branch B ('*'=HEAD)
    \
     \
      \--y--y--y <- other branch to merge

, আমরা বর্তমান শাখা 'বি' পরিবর্তন করি না, তাই আমাদের যা আছে তা এখনও আমরা কাজ করে যাচ্ছিলাম (এবং আমরা অন্য একটি শাখা থেকে মার্জ করি)

x--x--x--x--x---------o(*)  MERGE, still on branch B
    \       ^        /
     \     ours     /
      \            /
       --y--y--y--/  
               ^
              their

একটি রিবেস উপর:

তবে একটি রিবেসে আমরা সাইড স্যুইচ করি কারণ রিবাজে প্রথম কাজটি হ'ল উজানের শাখাটি চেকআউট করা! (এটির উপরে বর্তমান কমিটগুলি পুনরায় খেলতে)

x--x--x--x--x(*) <- current branch B
    \
     \
      \--y--y--y <- upstream branch

A git rebase upstreamপ্রথমে HEADবি এর প্রবাহিত শাখায় পরিবর্তিত হবে HEAD(অতএব পূর্ববর্তী "বর্তমান" কার্যকারী শাখার তুলনায় 'আমাদের' এবং 'তাদের' স্যুইচ করা হবে।)

x--x--x--x--x <- former "current" branch, new "theirs"
    \
     \
      \--y--y--y(*) <- upstream branch with B reset on it,  
                       new "ours", to replay x's on it

, এবং তারপরে রিবেস নতুন 'আমাদের' বি শাখায় 'তাদের' প্রতিশ্রুতিগুলি পুনরায় খেলবে:

x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
    \
     \
      \--y--y--y--x'--x'--x'(*) <-  branch B with HEAD updated ("ours")
               ^
               |
        upstream branch

দ্রষ্টব্য: "আপস্ট্রিম" ধারণাটি ডেটাগুলির রেফারেনটিভ সেট (একটি সমস্ত রেপো বা এখানে যেমন একটি শাখা, যা একটি স্থানীয় শাখা হতে পারে ) যা থেকে ডেটা পড়া হয় বা কোন নতুন ডেটা যুক্ত করা / তৈরি করা হয়।


' local' এবং ' remote' বনাম ' mine' এবং ' theirs'

Pandawood মধ্যে যোগ করা মন্তব্য :

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

জিইউআই গিট মার্জারটুল

কুত্স্কেম যোগ করে, এবং ঠিক তাই:

বিরোধগুলি সমাধান করার সময়, গিট এই জাতীয় কিছু বলবে:

local: modified file and remote: modified file. 

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

  • স্থানীয় রেফারেন্স আংশিকভাবে রিবেসড কমিটস : " ours" (উজানের শাখা)
  • রিমোট আসন্ন পরিবর্তনগুলি বোঝায় : " theirs" - রিবেসের আগে বর্তমান শাখা।

git mergetoolপ্রকৃতপক্ষে 'স্থানীয়' এবং 'রিমোট' উল্লেখ করেছে :

Merging:
f.txt

Normal merge conflict for 'f.txt':
  {local}: modified file
  {remote}: modified file
Hit return to start merge resolution tool (kdiff3):

উদাহরণস্বরূপ, KDiff3 হবে তাই মত একত্রীকরণ রেজল্যুশন প্রদর্শন :

kdiff3

এবং meld এটি প্রদর্শন করবে :

মাঠের পার্থক্য

ভিমডিফের জন্য একই , যা প্রদর্শিত হয় :

ভিটমিডকে গিট মার্জেটুল-ট জিভিমডিফ দিয়ে মার্জারুল হিসাবে ডাকা। গিটের সাম্প্রতিক সংস্করণগুলি নিম্নলিখিত উইন্ডো বিন্যাসের সাথে ভিমডিফকে ডাকে:

+--------------------------------+
| LOCAL  |     BASE     | REMOTE |
+--------------------------------+
|             MERGED             |
+--------------------------------+
  • LOCAL:
    বর্তমান শাখায় ফাইলের বিষয়বস্তু সমেত একটি অস্থায়ী ফাইল।
  • BASE:
    একত্রীকরণের জন্য সাধারণ ভিত্তিযুক্ত ফাইল।
  • REMOTE:
    এক অস্থায়ী ফাইল যা ফাইলের বিষয়বস্তুগুলিকে একীভূত করতে হবে।
  • MERGED:
    সংঘাতের চিহ্নিতকারীদের সমন্বিত ফাইল।

গিট যথাসম্ভব স্বয়ংক্রিয় দ্বন্দ্বের সমাধান করেছে এবং এই ফাইলটির অবস্থা উভয়ের সংমিশ্রণ LOCALএবং REMOTEদ্বন্দ্ব চিহ্নিতকারীদের এমন কোনও কিছুকে ঘিরে রয়েছে যা গিট নিজেই সমাধান করতে পারেনি। এই ফাইলে রেজল্যুশন ফল লিখতে হবে।
mergetool


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

@ পান্ডাওড: "স্থানীয়" হ'ল "বর্তমান শাখা" (যা "তাদের" হয়), "রিমোট" হ'ল "উজানের শাখা" (যা "আমাদের" হয়ে যায়)।
ভোনসি

3
সুতরাং, সংক্ষেপে বলা যায়: আপনি git checkout A; git rebase Bস্থানীয় যখন বি, দূরবর্তীটি এ। আমার সমস্ত জানা দরকার ...
বেনুবার্ড

1
গিট হ'ল ব্যবহারযোগ্যতার একটি ক্লাস্টারফেক। এটি কোনও তাত্পর্যপূর্ণ নয়: আপনি যখন git checkout A; git rebase Bস্থানীয় হন বি, দূরবর্তীটি হয় এ । আমি যদি checkout Aতখন বর্তমানে ফাইলগুলিতে উপস্থিত থাকি ততক্ষণ তাকিয়ে থাকি তবে Aএটি কোনও উপায়ে দূরবর্তী কীভাবে? (আমি বেনুবার্ডকে ভুল বলছি না; বলছি গিটের বোকা ইউএক্স রয়েছে)
রাফা

1
@ ভনসি নিশ্চিত; আমার (রেটিং) পয়েন্টটি হ'ল এটি ডকুমেন্টেশনগুলি পড়া, ডায়াগ্রামগুলি দেখে এবং স্ট্যাকওভারফ্লো ব্রাউজ করা উচিত নয়। যদি কেবল আদেশটি পরিষ্কার, দ্ব্যর্থহীন প্রতিক্রিয়া জানায়। উদাহরণস্বরূপ, স্থানীয় / দূরবর্তী / তাদের / আমাদের / আমার / আপনার পরিবর্তে, কেবল দেখান {branch A}এবং {branch B}বা অনুরূপ।
রাফা

45

তলদেশের সরুরেখা

গিট রিবেস

  • স্থানীয় = বেস আপনি rebasing করছি সম্মুখের
  • রিমোট = কমিটগুলি আপনি উপরে যাচ্ছেন

গিট মার্জ

  • স্থানীয় = আপনি যে মূল শাখায় মার্জ হয়ে যাচ্ছেন
  • রিমোট = অন্যান্য শাখা যার সাথে আপনি যুক্ত হয়ে চলেছেন in

অন্য কথায়, স্থানীয় সবসময় মূল, এবং দূরবর্তী সবসময় লোক যার করে সেখানে নেই পূর্ববর্তীরা কারণ তারা হচ্ছে একীভূত বা উপরে রি-বেস

প্রমান কর!

অবশ্যই. আমার কথাটি এর জন্য গ্রহণ করবেন না! এখানে নিজের জন্য দেখার জন্য আপনি করতে পারেন এমন একটি সহজ পরীক্ষা।

প্রথমে নিশ্চিত করুন যে আপনার গিট মার্জারটুলটি সঠিকভাবে কনফিগার হয়েছে। (যদি আপনি না করেন তবে সম্ভবত আপনি এই প্রশ্নটি পড়বেন না)) তারপরে কাজ করার জন্য একটি ডিরেক্টরি সন্ধান করুন।

আপনার সংগ্রহস্থল সেট আপ করুন:

md LocalRemoteTest
cd LocalRemoteTest

একটি প্রাথমিক প্রতিশ্রুতি তৈরি করুন (একটি খালি ফাইল সহ):

git init
notepad file.txt  (use the text editor of your choice)
  (save the file as an empty file)
git add -A
git commit -m "Initial commit."

একটি শাখায় একটি অঙ্গীকার তৈরি করুন যা মাস্টার নয়:

git checkout -b notmaster
notepad file.txt
  (add the text: notmaster)
  (save and exit)
git commit -a -m "Add notmaster text."

মাস্টার শাখায় একটি প্রতিশ্রুতি তৈরি করুন:

git checkout master
notepad file.txt
  (add the text: master)
  (save and exit)
git commit -a -m "Add master text."

gitk --all

এই মুহুর্তে আপনার সংগ্রহস্থলটি দেখতে এমন হওয়া উচিত:

বেস কমিট এবং দুটি ওয়ান-কমিট শাখা সহ সংগ্রহস্থল

এখন রিবেস পরীক্ষার জন্য:

git checkout notmaster
git rebase master
  (you'll get a conflict message)
git mergetool
  LOCAL: master
  REMOTE: notmaster

এখন মার্জ পরীক্ষা। কোনও পরিবর্তন না সঞ্চয় করেই আপনার মার্জারুল বন্ধ করুন এবং তারপরে রিবেসটি বাতিল করুন:

git rebase --abort

তারপর:

git checkout master
git merge notmaster
git mergetool
  LOCAL: master
  REMOTE: notmaster
git reset --hard  (cancels the merge)

আপনার ফলাফলগুলি উপরে প্রদর্শিত হিসাবে একই হওয়া উচিত।


1
+1 টি। যে সুস্পষ্ট local/ remoteদিক আমি উপরের আমার নিজের উত্তরে সঙ্গে লড়াই (যার বিপর্যয় সম্পর্কে আরো oursবনাম theirsযাহাই হউক না কেন)
VonC

3

আমি আপনার সমস্যাটি ঠিক পাইনি তবে আমি মনে করি নিম্নলিখিত চিত্রটি আপনার সমস্যাটির সমাধান করে। (রিবেস: রিমোট রিপোজিটরি ---> ওয়ার্কস্পেস)

http://assets.osteele.com/images/2008/git-transport.png

সূত্র: আমার গিট ওয়ার্কফ্লো

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