জোর করে আপডেটের পরে গিট টান


332

আমি স্রেফ কিছু কমিটিকে স্কোয়াশ করেছিলাম git rebaseএবং একটি করেছি git push --force(যা খারাপ, আমি জানি)।

এখন অন্যান্য সফ্টওয়্যার ইঞ্জিনিয়ারদের একটি আলাদা ইতিহাস রয়েছে এবং যখন তারা এটি করেন git pull, গিট একত্রীভূত হবে। এটি না করে কি ঠিক করার কোনও উপায় আছে rm my-repo; git clone git@example.org:my-repo.git?

আমার বিপরীতে এর মতো কিছু দরকার git push --force, তবে git pull --forceউদ্দেশ্যযুক্ত ফলাফল দেয় নি।


16
তারা পুরো শাখাগুলি মুছে না ফেলে তারা তাদের শাখাটি মুছে ফেলতে এবং এটি আবারও তৈরি করতে পারে:git checkout master && git branch -D test && git checkout -b test origin/test
ফ্লোরিয়িয়ান ক্লেইন


উত্তর:


509

নতুন কমিট গ্রহণ করতে

git fetch

রিসেট

আপনি ব্যবহার করে স্থানীয় শাখার জন্য প্রতিশ্রুতি পুনরায় সেট করতে পারেন git reset

স্থানীয় শাখার অঙ্গীকার পরিবর্তন করতে:

git reset origin/master --hard

ডকুমেন্টেশন যেমনটি বলেছে তেমন সাবধান থাকুন:

সূচক এবং কার্যক্ষম গাছ পুনরায় সেট করে। কার্যনির্বাহী গাছের ট্র্যাক করা ফাইলগুলিতে যে কোনও পরিবর্তন <কমিট> বাতিল করা হয়েছে।

আপনি যদি স্থানীয়ভাবে যা কিছু পরিবর্তন করতে চান তা যদি বাস্তবে রাখতে চান - --softপরিবর্তে পুনরায় সেট করুন। যা শাখার জন্য প্রতিশ্রুতিবদ্ধ ইতিহাস আপডেট করবে, তবে কার্যনির্বাহী ডিরেক্টরিতে কোনও ফাইল পরিবর্তন করবে না (এবং তারপরে আপনি তাদের প্রতিশ্রুতিবদ্ধ করতে পারেন)।

রি-বেসের ফলে

আপনি অন্য স্থানীয় প্রতিশ্রুতি / শাখার উপরে আপনার স্থানীয় কমিটগুলি পুনরায় খেলতে পারেন git rebase:

git rebase -i origin/master

এটি ইন্টারেক্টিভ মোডে রিবেস আহ্বান করবে যেখানে আপনি প্রতিটি স্বতন্ত্র প্রতিশ্রুতি প্রয়োগ করতে পারেন যা আপনি শীর্ষে প্রত্যাবর্তন করছেন এমন ইতিহাসে নয়।

যদি আপনি মুছে ফেলা (সাথে git push -f) কমিটগুলি ইতিমধ্যে স্থানীয় ইতিহাসে টানতে থাকে তবে সেগুলি পুনরায় প্রয়োগ করা হবে এমন কমিট হিসাবে তালিকাভুক্ত হবে - তাদের পুনর্বাসনের অংশ হিসাবে মুছে ফেলা প্রয়োজন হবে বা সেগুলি কেবল ইতিহাসে পুনরায় অন্তর্ভুক্ত করা হবে would শাখার জন্য - এবং পরবর্তী ধাক্কায় দূরবর্তী ইতিহাসে আবার প্রদর্শিত হবে।

git command --helpউপরের যে কোনও (বা অন্যান্য) কমান্ডের আরও বিশদ এবং উদাহরণগুলির জন্য সহায়তা ব্যবহার করুন।


2
@ ব্লু সমস্ত পরিবর্তন হারাতে, প্রতিশ্রুতিবদ্ধ ইতিহাস মুছে ফেলার পরিবর্তে ফাইলের পরিবর্তনগুলি রক্ষা করা বা প্রতিটি অঙ্গীকারকে নতুন মাথার উপরে প্রয়োগ করার চেষ্টা করার মধ্যে নির্বাচন করুন। সহজ বিকল্পটি সম্ভবত একটি নরম রিসেট।
AD7six

1
@ ব্লু যখন আপনার সহকর্মী `গিট রিবেস আদি / মাস্টার 'ব্যবহার করে এবং এর অর্থ তারা ইতিমধ্যে কিছু প্রতিশ্রুতিবদ্ধ ছিল, তখন গিট তাদের প্রতিশ্রুতিটির পিছনে আপনার প্রতিশ্রুতি লিখবে।
টিম

6
এটি উল্লেখ করার মতো হতে পারে যে এটি যদি অন্য কোনও শাখার জন্য হয়:git reset origin/otherbranch --hard
বমুপিন

সুতরাং, নির্মল, এই হয় : অপশন 1: reset --hard, বা অপশন 2: reset --soft+ + rebase, ডান?
প্লাজমাবিন্টুরং

2
প্লাজমাবিন্টুরং নং git reset --soft origin/masterরিমোট এবং স্টেজ পার্থক্যের সাথে মিল রেখে ইতিহাসের প্রতিশ্রুতি পরিবর্তন করবে যা তখন প্রতিশ্রুতিবদ্ধ হবে । সেই দৃশ্যে রিবেস করার দরকার হবে না (এবং আপত্তিজনক পরিবর্তনের কারণে আপনাকে এটি করা থেকে বিরত রাখা হবে) কারণ ইতিহাসের প্রতিশ্রুতিবদ্ধতার কোনও পার্থক্য নেই। দুটি বিকল্প রিসেট বা রিবেস - উভয়ের সংমিশ্রণ নয়। আপনার পরিস্থিতি আমি এখানে উত্তর দিয়েছি তার চেয়ে আলাদা কিনা দয়া করে একটি প্রশ্ন জিজ্ঞাসা করুন।
AD7six

16

এটি এমন শাখাগুলি ঠিক করবে না যেগুলির মধ্যে ইতিমধ্যে আপনি যে কোডটি চান না তাদের কোড রয়েছে (এটি কীভাবে করবেন তার জন্য নীচে দেখুন), তবে তারা যদি কিছু শাখা টানত এবং এখন এটি পরিষ্কার হতে চায় (এবং "এর আগে" নয়) উত্স / কিছু শাখা) তারপরে আপনি কেবল:

git checkout some-branch   # where some-branch can be replaced by any other branch
git branch base-branch -D  # where base-branch is the one with the squashed commits
git checkout -b base-branch origin/base-branch  # recreating branch with correct commits

দ্রষ্টব্য: আপনি এগুলির মধ্যে && রেখে এগুলি একত্রিত করতে পারেন

দ্রষ্টব্য 2: ফ্লোরিয়ান একটি মন্তব্যে এটি উল্লেখ করেছেন, তবে উত্তরগুলি অনুসন্ধানের সময় মন্তব্যগুলি কে পড়েন?

দ্রষ্টব্য 3: আপনার যদি দূষিত শাখা থাকে তবে আপনি নতুন "বোবা শাখা" থেকে আলাদা করে নতুন তৈরি করতে পারেন এবং কেবল চেরি-পিক কমিট করবেন।

উদা:

git checkout feature-old  # some branch with the extra commits
git log                   # gives commits (write down the id of the ones you want)
git checkout base-branch  # after you have already cleaned your local copy of it as above
git checkout -b feature-new # make a new branch for your feature
git cherry-pick asdfasd   # where asdfasd is one of the commit ids you want
# repeat previous step for each commit id
git branch feature-old -D # delete the old branch

অতিরিক্ত (সম্ভবত খারাপ) কমিট না করে এখন নতুন বৈশিষ্ট্যটি আপনার শাখা!


আমি সত্যই এটি চেয়েছিলাম কেউ মাস্টার শাখাটি প্রত্যাখ্যান করেছিলেন (কারণ কী কারণে godশ্বর জানেন) তবে আমার তাতে কোনও স্থানীয় পরিবর্তন হয়নি যা আমি বা কিছু করতে চাইছিলাম। সুতরাং আমাকে যা করতে হয়েছিল তা হ'ল আমার লোকাল মাস্টার শাখাটি (যা সত্যই অদ্ভুত বলে মনে হয়েছিল) মুছে ফেলা এবং আবার একটি চেকআউট করা। ধন্যবাদ!
ড্যানিলো কারভালহো

@ পিটার-মর্টেনসেন সম্পাদনা সারগর্ভ অনুযায়ী হতে হবে stackoverflow.com/help/editing
টম Prats

শেষ ধাপে জন্য, আপনি ব্যবহার করতে পারেন git checkout -b base-branch origin/base-branchসঙ্গেgit checkout --track origin/base-branch
bluesmonk

1

রিবেস দিয়ে টানুন

একটি নিয়মিত টান আনতে হবে + মার্জ করা, তবে আপনি যা চান তা আনতে হবে + পুনরায় সেট করা। pullকমান্ডটি সহ এটি একটি বিকল্প :

git pull --rebase

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