কোনওভাবেই আমার মাস্টার এবং আমার উত্স / মাস্টার শাখাটি অন্যদিকে চলে গেছে।
আমি আসলে তাদের এড়াতে চাই না।
আমি কীভাবে এই পার্থক্যগুলি দেখতে এবং সেগুলিকে 'মার্জ' করতে পারি?
কোনওভাবেই আমার মাস্টার এবং আমার উত্স / মাস্টার শাখাটি অন্যদিকে চলে গেছে।
আমি আসলে তাদের এড়াতে চাই না।
আমি কীভাবে এই পার্থক্যগুলি দেখতে এবং সেগুলিকে 'মার্জ' করতে পারি?
উত্তর:
আপনি এর সাথে পার্থক্যগুলি পর্যালোচনা করতে পারেন :
git log HEAD..origin/master
এটি টান দেওয়ার আগে (আনুন + মার্জ করুন) ( "আপনি কীভাবে সর্বদা একটি নির্দিষ্ট শাখা থেকে টানতে পারেন?" )
যখন আপনার মত বার্তা থাকে:
"আপনার শাখা এবং 'উত্স / মাস্টার' আলাদা হয়েছে, # এবং যথাক্রমে প্রত্যেকে 1 এবং 1 টি আলাদা কমিট (গুলি) রয়েছে।"
, আপনাকে আপডেট করার দরকার আছেorigin
কিনা তা পরীক্ষা করে দেখুন । যদি origin
আপ-টু-ডেট থাকে, তবে origin
আপনি স্থানীয়ভাবে নিজস্ব কমিট করার সময় কিছু কমিটিকে অন্য রেপো থেকে ঠেলে দেওয়া হয়েছিল।
... o ---- o ---- A ---- B origin/master (upstream work)
\
C master (your work)
আপনি প্রতিশ্রুতি A এর উপর ভিত্তি করে সি প্রতিশ্রুতিবদ্ধ কারণ এটি তখনকার উজান থেকে আপনি সর্বশেষতম কাজ করেছিলেন।
যাইহোক, আপনি উত্সে ফিরে ধাক্কা দেওয়ার চেষ্টা করার আগে, অন্য কেউ বি প্রতিশ্রুতিবদ্ধকে ধাক্কা দিয়েছিল
বিকাশের ইতিহাস পৃথক পথে রূপান্তরিত হয়েছে।
তারপরে আপনি মার্জ বা রিবেস করতে পারেন। প্রো গিট দেখুন : গিট ব্রাঞ্চিং - বিশদের জন্য ছাড় ।
একত্রিত করা
গিট মার্জ কমান্ডটি ব্যবহার করুন:
$ git merge origin/master
এটি গিটকে origin/master
আপনার কাজের মধ্যে থেকে পরিবর্তনগুলিকে একীভূত করতে এবং মার্জ কমিট তৈরি করতে বলে।
ইতিহাসের গ্রাফটি এখন এমন দেখাচ্ছে:
... o ---- o ---- A ---- B origin/master (upstream work)
\ \
C ---- M master (your work)
নতুন মার্জ, কমিট এম, এর দু'জন পিতা-মাতা রয়েছে, প্রত্যেকটিই সেই উন্নয়নের এক পথকে উপস্থাপন করে যা সেই প্রতিশ্রুতিতে লিখিত সামগ্রীকে সঞ্চারিত করে।
দ্রষ্টব্য যে এম এর পিছনে ইতিহাস এখন অ-রৈখিক।
রি-বেসের ফলে
গিট রিবেস কমান্ডটি ব্যবহার করুন:
$ git rebase origin/master
এটি গিটকে প্রতিশ্রুতিবদ্ধ সি (আপনার কাজ) পুনরায় খেলতে বলেছে যেন আপনি এটি সি এর পরিবর্তে কমিট
বিয়ের উপর ভিত্তি করে তৈরি করেছেন সিভিএস এবং সাবভার্সন ব্যবহারকারীরা কমিটমেন্টের পূর্বে আপডেট হওয়ার সময় নিয়মিতভাবে তাদের স্থানীয় পরিবর্তনগুলি আপস্ট্রিম কাজের শীর্ষে পুনর্বাসিত করে।
গিটটি কমিট এবং রিবেস ধাপগুলির মধ্যে কেবল স্পষ্ট বিচ্ছেদ যুক্ত করে।
ইতিহাসের গ্রাফটি এখন এমন দেখাচ্ছে:
... o ---- o ---- A ---- B origin/master (upstream work)
\
C' master (your work)
কমিট সি 'গিট রিবেস কমান্ড দ্বারা নির্মিত একটি নতুন প্রতিশ্রুতি।
এটি সি থেকে দুটি উপায়ে পৃথক:
নোট করুন যে সি এর পিছনের ইতিহাস এখনও লিনিয়ার।
কেবলমাত্র রৈখিক ইতিহাসকে অনুমতি দেওয়ার জন্য আমরা (এখনকার জন্য) নির্বাচন করেছি cmake.org/cmake.git
।
এই পদ্ধতির পূর্বে ব্যবহৃত সিভিএস-ভিত্তিক ওয়ার্কফ্লো সংরক্ষণ করে এবং সংক্রমণটি সহজ করতে পারে।
আমাদের ভান্ডারগুলিতে সি'কে ধাক্কা দেওয়ার একটি প্রচেষ্টা কাজ করবে (ধরে নিবেন যে আপনার অনুমতি আছে এবং আপনি যখন অবমাননার সময় কেউ ঠেলেনি)।
গিট টান কমান্ডটি উত্স থেকে আনতে এবং এতে স্থানীয় কাজ পুনর্বাসনের জন্য একটি ছোট্ট উপায় সরবরাহ করে:
$ git pull --rebase
এটি উপরোক্ত আনয়ন এবং পুনরায় স্থির পদক্ষেপগুলিকে এক কমান্ডের সাথে একত্রিত করে।
git reset --hard HEAD
শুধুমাত্র স্থানীয় সূচীবদ্ধ অ অঙ্গীকারবদ্ধ পরিমার্জন মুছে ফেলা হবে, এবং স্থানীয় এবং দূরবর্তী মধ্যে পার্থক্য মিটমাট করা কিছু করতে চাই করে । কেবল একত্রীকরণ বা একটি পুনর্বাসনা দুটি কমিটের (স্থানীয় এক এবং দূরবর্তী এক) একত্রিত করবে।
master
উল্লেখ করতে চাই B
।
git reset --hard origin/master
শুধু নিচের উত্তরে হিসাবে উল্লেখ করেছে: stackoverflow.com/a/8476004/6309
উপরের প্রতিক্রিয়াগুলি পড়ার পরেও আমার এটি ছিল এবং এটি কী কারণে ঘটেছে তা সম্পর্কে আমি সন্তুষ্ট। আমার সমাধান করা ছিল
git reset --hard origin/master
তারপরে এটি কেবলমাত্র মাস্টারের (স্থানীয়) অনুলিপিটি (যা আমি ধারণা করি যে এটি আঁকিয়েছে) সঠিক বিন্দুতে (রিমোট) উত্স / মাস্টার দ্বারা উপস্থাপিত হিসাবে পুনরায় সেট করে।
সতর্কতা : আপনি সমস্ত পরিবর্তন হারাবেন যা এখনও ধাক্কা দেয়নি
origin/master
।
git reflog
বা তাদের সাথে দেখতে পেতে পারেন gitk --all
। তবে তবুও, হার্ড রিসেট অবশ্যই রিবেস ছাড়া অন্য জিনিস।
git pull --rebase origin/master
হ'ল একটি একক আদেশ যা আপনাকে বেশিরভাগ সময় সাহায্য করতে পারে।
সম্পাদনা: উত্স / মাস্টার থেকে কমিটস টানুন এবং নতুন পরিবর্তন করা শাখার ইতিহাসের উপর আপনার পরিবর্তনগুলি প্রয়োগ করে।
যখন আমি করার চেষ্টা এ অবস্থায় আমি নিজেকে খুঁজে পাওয়া যায় রি-বেসের ফলে একটি শাখা যে একটি দূরবর্তী শাখা ট্র্যাকিং করা হয়েছিল, এবং আমি মাস্টার তে এটি রি-বেসের ফলে করার চেষ্টা ছিল। এই দৃশ্যকল্প আপনি রি-বেসের ফলে চেষ্টা, আপনি সম্ভবত আপনার শাখা পাবেন চলেনি এবং এটি একটি জগাখিচুড়ি যে Git nubees জন্য নয় তৈরি করতে পারেন!
ধরা যাক আপনি আমার_মোমোট_ ট্র্যাকিং_ ব্রাঞ্চে রয়েছেন, যা মাস্টারের কাছ থেকে শাখা ছিল
$ git status
# শাখায় আমার_রেমোট_ ট্র্যাকিং_ ব্রাঞ্চ
প্রতিশ্রুতিবদ্ধ কিছুই (পরিশ্রমী ডিরেক্টরি পরিষ্কার)
এবং এখন আপনি মাস্টার থেকে এইভাবে রিবেস করার চেষ্টা করছেন:
গিট রিবেস মাস্টার
এখনই থামুন এবং নিজেকে কিছুটা ঝামেলা বাঁচান! পরিবর্তে, মার্জ হিসাবে এটি ব্যবহার করুন:
গিট মার্জ মাস্টার
হ্যাঁ, আপনি আপনার শাখায় অতিরিক্ত কমিট দিয়ে শেষ করবেন। তবে আপনি যদি "আন-ডাইভার্জিং" শাখাগুলির পক্ষে না থাকেন তবে এটি রিবেসিংয়ের চেয়ে অনেক বেশি মসৃণ ওয়ার্কফ্লো হবে। আরও বিস্তারিত ব্যাখ্যা জন্য এই ব্লগ দেখুন ।
অন্যদিকে, যদি আপনার শাখাটি কেবল একটি স্থানীয় শাখা হয় (যেমন এখনও কোনও প্রত্যন্তে ধাক্কা দেওয়া হয়নি) আপনার অবশ্যই একটি রিবেস করা উচিত (এবং আপনার শাখাটি এই ক্ষেত্রে বিচ্ছিন্ন হবে না )।
এখন যদি আপনি এই পড়া হয় কারণ আপনি ইতিমধ্যে হয় একটি "চলেনি" এই ধরনের রি-বেসের ফলে কারণে দৃশ্যকল্প, আপনি শেষ ফিরে পেতে পারেন ব্যবহার করে উৎপত্তি (অর্থাত একটি অ-চলেনি রাজ্যের) থেকে সমর্পণ
গিট রিসেট - মূল উত্স / আমার_মোট_ট্র্যাকিং_ ব্রাঞ্চ
rebase
যে শাখাটি পুনর্বার করছেন সেই শাখাটি প্রকাশিত না হলে (এবং অন্যান্য লোকেরা ব্যবহার করেছেন)। অন্যথায়, ব্যবহার করুন merge
। যদি আপনি ইতিমধ্যে প্রকাশিত (এবং ব্যবহৃত) শাখাগুলি পুনরায় চালু করেন তবে আপনার শাখাটি ব্যবহার করে এমন প্রতিটি বিকাশকারীকে ইতিহাস পুনরায় লেখার জন্য ষড়যন্ত্রের সমন্বয় করতে হবে।
git rebase master
...
git reset --hard origin/my_remote_tracking_branch
সত্যই কি কাজ করেছে
আমার ক্ষেত্রে ডাইভারেজ করা বার্তাটি ঘটানোর জন্য আমি যা করেছি তা এখানে : আমি করেছি git push
তবে তারপরে git commit --amend
প্রতিশ্রুতিবদ্ধ বার্তায় কিছু যুক্ত করার চেষ্টা করেছি। তারপরে আমি আরও একটি কমিট করেছিলাম।
সুতরাং আমার ক্ষেত্রে যেটির অর্থ উত্স / মাস্টারটির অর্থ পুরানো ছিল। যেহেতু আমি জানতাম যে অন্য কেউই উত্স / মাস্টারকে স্পর্শ করছে না, তাই এই সমস্যাটি ছিল তুচ্ছ: git push -f
(যেখানে বোঝার -f
অর্থ)
git push -f
পূর্বে প্রতিশ্রুতিবদ্ধ এবং উত্সে ধাক্কা দেওয়া পরিবর্তনগুলি ওভাররাইট করতে +1 আমিও নিশ্চিত যে অন্য কেউ ভান্ডারটিকে স্পর্শ করেনি।
আমার ক্ষেত্রে আমি পরিবর্তনগুলিকে ধাক্কা দিয়েছি origin/master
এবং তখন বুঝতে পেরেছিলাম যে আমার এমনটি করা উচিত নয় :-( স্থানীয় পরিবর্তনগুলি একটি সাবট্রিতে ছিল এই কারণে এটি জটিল হয়েছিল So সুতরাং আমি "খারাপ" স্থানীয়ের আগে শেষ ভাল প্রতিশ্রুতিতে ফিরে গিয়েছিলাম পরিবর্তন (সোর্স ট্রি ব্যবহার করে) এবং তারপরে আমি "ডাইভারজেন বার্তা" পেয়েছি।
স্থানীয়ভাবে আমার জগাখিরি ঠিক করার পরে (বিশদগুলি এখানে গুরুত্বপূর্ণ নয়) আমি দূরবর্তী origin/master
শাখাটি "সময়ের সাথে পিছনে সরে যেতে" চেয়েছিলাম যাতে এটি master
আবার স্থানীয়টির সাথে সুসংগত হয়। আমার ক্ষেত্রে সমাধানটি ছিল:
git push origin master -f
-f
(বল) স্যুইচটি নোট করুন । এটি origin/master
ভুল দ্বারা প্রেরিত "খারাপ পরিবর্তনগুলি" মুছে ফেলা হয়েছে এবং এখন স্থানীয় এবং দূরবর্তী শাখাগুলি সিঙ্কে রয়েছে।
দয়া করে মনে রাখবেন যে এটি একটি সম্ভাব্য ধ্বংসাত্মক অপারেশন তাই আপনি যদি 100% নিশ্চিত হন যে দূরবর্তী মাস্টারকে সময়মতো "পিছনে সরিয়ে নেওয়া" ঠিক আছে তবেই এটি সম্পাদন করুন।
You are not allowed to force push code to a protected branch on this project.
। আমি আমার কাঁটা কাঁটাতে চেষ্টা করছি
আমি জানি এখানে প্রচুর উত্তর রয়েছে, তবে আমি মনে করি git reset --soft HEAD~1
কিছুটা মনোযোগের দাবি রাখে, কারণ এটি আপনাকে বিচ্ছিন্ন অবস্থার সমাধান করার সময় শেষ স্থানীয় (ধাক্কা দেয় না) প্রতিশ্রুতিবদ্ধতাগুলিতে পরিবর্তন করতে দেয়। আমি মনে করি এটি তুলনায় টানানোর চেয়ে আরও বহুমুখী সমাধান rebase
, কারণ স্থানীয় প্রতিশ্রুতি পর্যালোচনা করা যেতে পারে এবং এমনকি অন্য একটি শাখায় স্থানান্তরিত হতে পারে।
কীটি --soft
কঠোর পরিবর্তে ব্যবহার করছে --hard
। যদি 1 টির বেশি প্রতিশ্রুতি থাকে তবে তারতম্যের HEAD~x
কাজ করা উচিত। সুতরাং আমার পদক্ষেপগুলি সমাধান করার সমস্ত পদক্ষেপ এখানে রয়েছে (আমার কাছে 1 স্থানীয় প্রতিশ্রুতি ছিল এবং রিমোটে 8 টি কমিট ছিল):
1) git reset --soft HEAD~1
স্থানীয় প্রতিশ্রুতি পূর্বাবস্থা। পরবর্তী পদক্ষেপের জন্য, আমি সোর্সট্রি-তে ইন্টারফেসটি ব্যবহার করেছি, তবে আমি মনে করি নিম্নলিখিত কমান্ডগুলিও কাজ করা উচিত:
2) git stash
স্ট্যাশ পরিবর্তনগুলি 1 থেকে)। এখন সমস্ত পরিবর্তনগুলি নিরাপদ এবং আর কোনও বিচ্যুতি নেই।
3) git pull
দূরবর্তী পরিবর্তন পেতে।
4) git stash pop
বা git stash apply
সর্বশেষ স্ট্যাশড পরিবর্তনগুলি প্রয়োগ করতে হবে, তারপরে একটি নতুন প্রতিশ্রুতি অনুসারে, চাইলে। স্থানীয় প্রতিশ্রুতিতে পরিবর্তনগুলি ট্র্যাশ করতে চাইলে এই পদক্ষেপটি 2) সহ ) চ্ছিক। এছাড়াও, যখন অন্য কোনও শাখায় প্রতিশ্রুতিবদ্ধ হতে চান, তখন এই পদক্ষেপটি পছন্দসই শাখায় স্যুইচ করার পরে করা উচিত।
pull --rebase
যাইহোক, স্বয়ংক্রিয়ভাবে লুকিয়ে থাকবে। stackoverflow.com/a/30209750/6309
পার্থক্যগুলি দেখতে:
git difftool --dir-diff master origin/master
এটি দুটি শাখার মধ্যে পরিবর্তন বা পার্থক্য প্রদর্শন করবে। আরাক্সিসে (আমার প্রিয়) এটি এটি একটি ফোল্ডার ডিফ স্টাইলে প্রদর্শন করে। প্রতিটি পরিবর্তিত ফাইল দেখানো হচ্ছে। তারপরে ফাইলের পরিবর্তনগুলির বিশদটি দেখতে আমি একটি ফাইলে ক্লিক করতে পারি।
আমার ক্ষেত্রে এটি আমার বিরোধ নিষ্পত্তি না করার কারণে ঘটেছিল।
git pull
কমান্ডটি চালানোর ফলে সমস্যা দেখা দিয়েছে । উত্সের পরিবর্তনগুলি আমার স্থানীয় রেপোগুলির সাথে বিবাদ সৃষ্টি করেছিল, যা আমি সমাধান করেছি। যাইহোক, আমি তাদের প্রতিশ্রুতিবদ্ধ না। এই মুহুর্তে সমাধানটি পরিবর্তনগুলি করা ( git commit
সমাধান করা ফাইল)
আপনি যদি সংঘাত নিরসনের পরে কিছু ফাইলও সংশোধন করে থাকেন, git status
কমান্ডটি স্থানীয় পরিবর্তনগুলি অস্টেজিত স্থানীয় পরিবর্তন হিসাবে এবং মেশানো রেজোলিউশনকে মঞ্চস্থ স্থানীয় পরিবর্তন হিসাবে দেখায়। প্রথমে মার্জ থেকে git commit
পরিবর্তনগুলি প্রতিস্থাপনের পরে যথাযথভাবে সমাধান করা যেতে পারে , তারপরে যথারীতি স্টেস্টেড পরিবর্তনগুলি না করে এবং প্রতিশ্রুতিবদ্ধ করে (যেমন git commit -a
:)।
ইতিমধ্যে ধাক্কা দেওয়া প্রতিশ্রুতি ব্যবহার করে, সর্বশেষ প্রতিশ্রুতি বার্তাটি সম্পাদনা করার চেষ্টা করার সময় আমার একই বার্তা ছিল: git commit --amend -m "New message"
যখন আমি ব্যবহারগুলি পরিবর্তনগুলি ঠেলেছিলাম git push --force-with-lease repo_name branch_name
তখন কোনও সমস্যা ছিল না।
আমি যখন শাখার উপর ভিত্তি করে একটি শাখা তৈরি করেছি তখন এই সমস্যাটি পূরণ করেছি
git checkout -b a
এবং তারপরে আমি শাখার একটি প্রবাহটি একটি বি এর উত্সের শাখায় সেট আপ করেছি
git branch -u origin/B
তারপরে আমি উপরে ত্রুটি বার্তা পেয়েছি।
আমার কাছে এই সমস্যা সমাধানের একটি উপায় ছিল,
git checkout -b b origin/B