"আমাদের" এবং "তাদের" এর অর্থ গিট-এসএনএন দিয়ে বিপরীত কেন


91

আমি গিট-এসএনএন ব্যবহার করেছি এবং আমি লক্ষ্য করেছি যে একটি সম্পাদন করার পরে যখন আমাকে একত্রীকরণ সংঘাতের সমাধান করতে হবে git svn rebase, উদাহরণস্বরূপ বিকল্পগুলির অর্থ --oursএবং বিপরীত হয়। এটি হ'ল যদি কোনও বিরোধ হয় এবং আমি এসভিএন সার্ভার থেকে আসা সংস্করণটি রাখতে এবং স্থানীয়ভাবে আমার পরিবর্তিত পরিবর্তনগুলি ফেলে দিতে চাই, আমাকে ব্যবহার করতে হবে , যখন আমি এটির প্রত্যাশা করতাম ।--theirsgit checkoutourstheirs

তা কেন?

উদাহরণ:

mkdir test
cd test
svnadmin create svnrepo
svn co file://$PWD/svnrepo svnwc
cd svnwc
echo foo > test.txt
svn add test.txt
svn ci -m 'svn commit 1'
cd ..
git svn clone file://$PWD/svnrepo gitwc
cd svnwc
echo bar > test.txt 
svn ci -m 'svn commit 2'
cd ..
cd gitwc
echo baz > test.txt 
git commit -a -m 'git commit 1'
git svn rebase

git checkout --ours test.txt
cat test.txt 
# shows "bar" but I expect "baz"

git checkout --theirs test.txt
cat test.txt 
# shows "baz" but I expect "bar"

"আমাদের" এবং "তাদের" পক্ষগুলি আরও ভালভাবে বর্ণনা করার জন্য জুট প্রচুর চিত্র সহ আমার উত্তর আপডেট করেছেন।
ভনসি

4
আরও দেখুন github.com/git/git/commit/…
ভোনসি

উত্তর:


232

এটি রিবেস যা করে তার সাথে সামঞ্জস্যপূর্ণ বলে মনে হয়।

  • git svn rebase বর্তমান হেডের এসভিএন পিতামাতার কাছ থেকে সংশোধনী আনে এবং বর্তমানের (এসভিএনকে ছাড় দেওয়া) কাজটি এর বিরুদ্ধে ছাড় দেয়।

  • git rebaseউল্লেখ আছে:
    নোট করুন যে একটি রিবেস মার্জ শাখার উপরের কার্যকারী শাখা থেকে প্রতিটি প্রতিশ্রুতি পুনরায় খেলতে কাজ করে <upstream>
    এ কারণে, যখন মার্জ সংঘাত ঘটে:

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

গিট রিবেস ব্রাঞ্চের উপরের কার্যকারী শাখা থেকে প্রতিটি প্রতিশ্রুতি পুনরায় করে <upstream>

আপনি উভয় সংজ্ঞা মিলিয়ে যদি:

  • এসভিএন থেকে আসা কমিটগুলি হ'ল উপরে স্থানীয় গিট কমিটগুলি পুনরায় খেলানো হয়। এগুলি "এতদূর পর্যন্ত রিবেসড সিরিজের" অংশ, এবং "আমাদের" হিসাবে উল্লেখ করা হয় (আপনার ক্ষেত্রে, সামগ্রী test.txtসহ ফাইল bar)
  • কার্যকারী শাখা (গিট সমন্বিত এসভিএন-এর কাছে অজানা প্রতিশ্রুতিবদ্ধ, আপনার ক্ষেত্রে বিষয়বস্তুযুক্ত test.txtফাইলটি baz) "তাদের" এবং স্থানীয় গিট কমিটগুলির প্রত্যেকটির পুনরায় খেলানো হচ্ছে।

অন্য কথায়, এসভিএন বা না:

  • " <upstream>" শাখা (যার উপরে কোনও কিছু পুনরায় চালিত করা হয়, এবং যা এখন পর্যন্ত প্রত্যাবর্তনের প্রতিশ্রুতি "এর অংশ)" আমাদের "।
  • যা পুনরায় খেলানো হচ্ছে (কার্যকারী শাখা) " তাদের "।

কমাটোস্টের দ্বারা শুভ স্মৃতিসংক্রান্ত টিপ :

প্রধান যা কিছু নির্দেশ করে তা হ'ল "আমাদের"

(এবং প্রথমটি যা আপনি git rebase upstreamযে upstreamশাখাটি পুনরায় শোধ করতে চান তার শাখাগুলি চেকআউট করার জন্য এটি একটি করে : হ্যাড উল্লেখ করে upstream- oursএখন))


বিভ্রান্তি সম্ভবত ক্লাসিকের ওয়ার্কিং শাখার ভূমিকা থেকে আসছে git merge
আপনি যখন মার্জ করছেন:

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

git rebaseম্যান পেজের হিসাবে উল্লেখ করা হয়েছে, একটি রিবেসের সময় সংযুক্তির অর্থ পার্শ্বটি অদলবদল করা হয়।


একই কথা বলার আর একটি উপায় তা বিবেচনা করা:

  • আমাদের যাচাই করা শাখায় যা আছে তা হ'ল ' আমাদের ',
  • আমাদের যা ছিল (এবং মার্জ করা বা পুনরায় খেলানো হচ্ছে) তা তাদের ''

সংযুক্তিতে :

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

কেবলমাত্র অতিরিক্ত পদক্ষেপটি git svn rebaseহ'ল এসভিএন কমিটির প্রতিনিধিত্বকারী গিট রিমোট শাখায় প্রথমে একটি এসএনএন "ফেচ" করা হয়।
আপনার প্রাথমিকভাবে:

x--x--x--x--x(*) <- current branch B, "ours" for now.
    \                                   
     \
      \--y--y--y <- SVN tracking branch, "theirs for now"

, আপনি প্রথমে এসভিএন থেকে আগত নতুন কমিটের সাথে এসভিএন ট্র্যাকিং শাখা আপডেট করবেন

x--x--x--x--x(*) <- current branch B, still "ours", not for long
    \                                   
     \
      \--y--y--y--y'--y' <- SVN tracking branch updated

, তারপরে আপনি বর্তমান শাখাটি এসভিএন দিকে স্যুইচ করুন (যা "আমাদের" হয়ে যায়)

x--x--x--x--x <- for "B", now "their" during the rebase
    \                                   
     \
      \--y--y--y--y'--y'(*) <- SVN tracking branch updated, and branch B: 
                               now "ours" (this is "what we now have")

, যে কমিটস আপনি কাজ করছেন তা পুনরায় প্লে করার আগে (তবে সেই রিবেসের সময় যা এখন "তাদের")

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

9
বাহ, কি দুর্দান্ত উত্তর, ধন্যবাদ! git rebaseম্যান পেজে আমি অবশ্যই এই মন্তব্যটি পুরোপুরি মিস করেছি ...
মার্ক লিয়্যানেজ

@ অ্যাপলজি: আপনাকে স্বাগতম! আপনি কেবল গিট ব্যবহার করার সময়, রিবাজ বনাম একটি মার্জ চলাকালীন কী চলছে তা বোঝার জন্য এটিও কার্যকর। : আর মূল প্রজেক্টের সংজ্ঞা যোগ stackoverflow.com/questions/2739376/...
VonC

4
আমার আল্লাহ !!! টরভাল্ডস কোন ধরণের ওষুধ সেবন করছিল? এই উপায় খুব জটিল! গিট একটি খুব বিপজ্জনক সরঞ্জাম। আপনি যদি বাইরের জ্ঞান বা আপনার অন্তর্দৃষ্টি ব্যবহার করার চেষ্টা করেন তবে আপনি সহজেই আপনার সমস্ত কাজ ধ্বংস করতে পারেন। সফটওয়্যার ডেভলপমেন্ট কৃমির গর্তে চলে গেছে!
এটিএল_ডিইভি

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