প্রতিশ্রুতিবদ্ধ চলমান (কিন্তু ধাক্কা দেওয়া হয় না) টানার পরে একটি নতুন শাখায় পরিবর্তন হয়


459

আমি মোটামুটি কাজ করেছি ("37 টি কমিট দ্বারা আপনার শাখা 'উত্স / মাস্টার' এর চেয়ে এগিয়ে" ") যা সত্যিকার অর্থে তার নিজস্ব শাখায় প্রবেশ করা উচিত ছিল master। এই প্রতিশ্রুতিগুলি কেবলমাত্র আমার স্থানীয় মেশিনে বিদ্যমান এবং এগুলিতে কোনও চাপ দেওয়া হয়নি origin, তবে পরিস্থিতি কিছুটা জটিল যে অন্য দেবগণ এতে চাপ দিচ্ছেন origin/masterএবং আমি এই পরিবর্তনগুলি টানলাম।

আমি কীভাবে আমার 37 টি স্থানীয় কমিটকে নতুন শাখায় স্থানান্তর করতে পারি? দস্তাবেজের উপর ভিত্তি করে, এটি প্রদর্শিত হয় git rebase --onto my-new-branch masterবা এটি করা ...origin/masterউচিত বলে মনে হয় তবে উভয়ই আমাকে "মারাত্মক: একটি একক সংশোধন প্রয়োজন" ত্রুটিটি দেয়। এটিকে man git-rebaseসংশোধন সরবরাহ সম্পর্কে কিছুই বলে না rebaseএবং এর উদাহরণগুলি এটি করে না, সুতরাং এই ত্রুটিটি কীভাবে সমাধান করা যায় সে সম্পর্কে আমার কোনও ধারণা নেই।

(দ্রষ্টব্য, এটি গিটের নতুন শাখায় বিদ্যমান, নিঃশব্দ কাজ বা অন্য স্থানীয় গিটার শাখায় কীভাবে আমার স্থানীয় অনির্ধারিত পরিবর্তনগুলিকে একীভূত করতে হবে তার নকল নয়) কারণ এই প্রশ্নগুলি স্থানীয় কার্যনির্বাহী গাছের অনিবার্য পরিবর্তনের সাথে সম্পর্কিত, পরিবর্তিত পরিবর্তনের সাথে নয় স্থানীয়ভাবে প্রতিশ্রুতিবদ্ধ।)


এই সমাধানটি দেখুন । সহজ এবং পরিষ্কার বলে মনে হচ্ছে।
টনি

এই সমাধানটি দেখুন । সহজ এবং পরিষ্কার বলে মনে হচ্ছে।
টনি

উত্তর:


517

এটি ভাল হওয়া উচিত, যেহেতু আপনি এখনও পর্যন্ত আপনার প্রতিশ্রুতিগুলি অন্য কোথাও ঠেলেছেন না এবং আপনি আপনার শাখার ইতিহাস পুনরায় লেখার জন্য মুক্ত origin/mastergit fetch originযেটি origin/masterআপ টু ডেট তা নিশ্চিত করার জন্য প্রথমে আমি একটি চালাব । ধরে নিচ্ছেন যে আপনি বর্তমানে চালু আছেন master, আপনার এটি করা উচিত:

git rebase origin/master

... যা আপনার করে যে হয় না সব রিপ্লে হবে origin/masterসম্মুখের origin/master। রিবাজের ডিফল্ট ক্রিয়া হ'ল মার্জ কমিটগুলি উপেক্ষা করা (উদাহরণস্বরূপ যেগুলি git pullসম্ভবত আপনার দ্বারা পরিচিত হয়েছে) এবং এটি কেবল আপনার প্রতিটি কমিট দ্বারা প্রবর্তিত প্যাচটি প্রয়োগ করার চেষ্টা করবে origin/master। (আপনাকে পথে কিছু বিবাদ সমাধান করতে হতে পারে)) তারপরে আপনি ফলাফলের ভিত্তিতে আপনার নতুন শাখা তৈরি করতে পারেন:

git branch new-work

... এবং তারপরে আপনার masterপিছনে পুনরায় সেট করুন origin/master:

# Use with care - make sure "git status" is clean and you're still on master:
git reset --hard origin/master

যখন সঙ্গে সাধিত শাখা এই ধরনের করছেন git branch, git resetইত্যাদি আমি এটা দরকারী ঘন ঘন দেখুন সঙ্গে গ্রাফ কমিট খুঁজতে gitk --allবা অনুরূপ সরঞ্জাম শুধু চেক করার জন্য যে আমি বুঝতে যেখানে সব বিভিন্ন refs প্রতি নির্দেশ করা হয়।

বিকল্পভাবে, আপনি সেক্ষেত্রে আপনার মাস্টার যেখানে প্রথম স্থানে আছেন তার উপর ভিত্তি করে আপনি কেবল একটি টপিক শাখা তৈরি করতে পারতেন ( git branch new-work-including-merges) এবং তারপরে masterউপরের মত পুনরায় সেট করুন । তবে, যেহেতু আপনার টপিক শাখায় মার্জগুলি অন্তর্ভুক্ত থাকবে origin/masterএবং আপনি এখনও আপনার পরিবর্তনগুলি ঠেকেননি, তাই আমি একটি রিবেস করার পরামর্শ দিচ্ছি যাতে ইতিহাসটি পরিপাটি হয়। (এছাড়াও, যখন আপনি শেষ পর্যন্ত আপনার বিষয় শাখাকে আবার মাস্টার হিসাবে মার্জ করবেন, পরিবর্তনগুলি আরও সুস্পষ্ট হবে))


8
@ অলি: না, প্রশ্নের অনুমান এবং উত্তরটির উপরে আমি যেগুলি রেখেছি সেগুলির নীচে উত্তরটি সঠিক। পৃথক নতুন শাখায় হওয়া কমিটগুলি ইতিমধ্যে রয়েছে master; রি-বেসের ফলে নতুন করে লেখা হয় masterশাখা যাতে নতুন করে উপরে সুসংগত হয় origin/master, তারপর git branch new-workএকটি সৃষ্টি new-workডগা এ শাখা ইশারা master(বর্তমান শাখা) ছাড়া বর্তমান শাখা সুইচিং new-work। সুতরাং এখন new-workসমস্ত নতুন কমিট রয়েছে। তারপরে পুনরায় সেট করা বর্তমান শাখাটিকে (এখনও master) আবার সরিয়ে দেয় origin/master
লংগায়ার

1
@ কুইন্টেস: আপনি যদি কাজটি হারিয়ে ফেলেন তবে আমি খুব দুঃখিত, তবে আমি নিশ্চিত যে এই উত্তরটি মূল প্রশ্নকারী দ্বারা বর্ণিত পরিস্থিতির জন্য সঠিক। (আমি আশাবাদীভাবে স্পষ্ট করেই অলির মন্তব্যের জবাব দিয়েছি।) যাইহোক, ঠিক যদি এটি আপনার কাজটি ফিরে পেতে সহায়তা করে তবে আমার উচিত বলা উচিত যে যদি আপনার কাজটি শেষ কয়েক দিনের মধ্যে প্রতিশ্রুতিবদ্ধ হয় (এই প্রশ্নোত্তরগুলির একটি ধারণা) ) গিট রিফ্লগের মাধ্যমে আপনার এটিকে সহজেই পুনরুদ্ধার করতে সক্ষম হওয়া উচিত।
লংগায়ার

5
@ অলি: সম্ভবত ব্যাখ্যা করার আরও ভাল উপায়: গিটের শাখাগুলি কেবল একটি নির্দিষ্ট প্রতিশ্রুতিতে চিহ্নিত লেবেলের মতো; আপনি যদি সেই শাখায় থাকাকালীন তৈরি করেন বা এর সাথে git resetএবং অন্যান্য বিভিন্ন উপায়ে সরানো যেতে পারে তবে সেগুলি স্বয়ংক্রিয়ভাবে নতুন কমিটে সরানো হবে । কেবল git branch new-workএটিই বলছে "আমি আমার বর্তমান শাখায় থাকাকালীন এই প্রতিশ্রুতিটির দিকে ইঙ্গিত করে একটি শাখা তৈরি করুন (যা এই ক্ষেত্রে মাস্টার)"। সুতরাং কমান্ডের দরকার নেই যা কমিটিকে মাস্টার থেকে নতুন শাখায় স্থানান্তরিত করে - আপনি কেবল সেখানে একটি নতুন শাখা তৈরি করেন এবং যখন আপনি পুনরায় সেট করেন তখন নতুন শাখাটি যেখানে মাস্টার ছিল সেখানে রেখে যান
মার্ক লংগায়ার

1
পার্টিতে কিছুটা দেরি হলেও @ অলি, কেবলমাত্র নতুন শাখায় যখন মাস্টারের সামনে কমিটগুলি দেখায় না তখন গিট স্ট্যাটাসের অর্থ এই না যে তারা আসলে সেখানে নেই (ধরে নিই যে আপনি চিন্তিত হয়েছিলেন)। নতুন শাখাটিকে উত্সাহিত করার চেষ্টা করুন: আপনি কমিটগুলি দেখতে পাবেন
ফলিক্স গাগনন-গ্রেনিয়ার

2
@ ফ্যালিক্সগ্যাগন-গ্রেনিয়ার, "দেরী" সম্পর্কে চিন্তা করবেন না - এমন লোকেরা সবসময়ই পুরানো প্রশ্ন খোঁজেন এবং প্রতিটি ব্যাখ্যা সাহায্য করে। ধন্যবাদ! :)
অলি

147

যদি আপনার কম সংখ্যক কমিট থাকে এবং এগুলি যদি একটি মেগা-কমিটের সাথে সংযুক্ত করা হয় তবে আপনার কোনও যত্ন নেই, এটি ভাল কাজ করে এবং করার মতো ভীতিজনক নয় git rebase:

ফাইলগুলি আনস্টেজ করুন (1 টি কমিটের সাথে প্রতিস্থাপন করুন)

git reset --soft HEAD~1

একটি নতুন শাখা তৈরি করুন

git checkout -b NewBranchName

পরিবর্তনগুলি যুক্ত করুন

git add -A

প্রতিশ্রুতিবদ্ধ

git commit -m "Whatever"

5
সহজে বোঝার জন্য গ্রাফটি দেখানোর জন্য দয়া করে ব্যবহার করুন git log --all --decorate --oneline --graph
এলিয়াক্স

আরে @ এলিউএক্স - আমি এখানে প্রাসঙ্গিকতা মিস করছি। আপনি কি প্রসারিত করতে পারেন?
স্টাচু

আপনি যা করেছেন তার ফলস্বরূপ ফলাফল পেয়েছি কিনা তা যাচাই করার জন্য এটি দরকারী দরকারী
এলিয়াক্স

4
ধন্যবাদ!! এটি একটি খুব সহজ সমাধান এবং এটি নিখুঁতভাবে কাজ করেছে !!
ক্রিস সিম

90

আমি একই ইস্যু নিয়ে আটকেছি। আমি সবচেয়ে সহজ সমাধানটি পেয়েছি যা আমি ভাগ করে নিতে চাই।

1) আপনার পরিবর্তনগুলি সহ নতুন শাখা তৈরি করুন।

git checkout -b mybranch

2) (ptionচ্ছিক) রিমোট সার্ভারে নতুন শাখা কোডটি চাপ দিন।

git push origin mybranch

3) মাস্টার শাখায় ফিরে চেকআউট।

git checkout master

4) রিমোট সার্ভারের সাথে মাস্টার ব্রাঞ্চ কোডটি রিসেট করুন এবং স্থানীয় কমিট সরিয়ে দিন।

git reset --hard origin/master

10
এটি সত্যই সহজতম উপায়
ধ্রুব

4
আপনি দ্বিতীয় পদক্ষেপটি ছেড়ে দিতে পারেন I আমি ধরে নিয়েছি যে শীর্ষ উত্তর থেকে সেই সময়ের মধ্যে গিটটি পরিবর্তিত হয়েছে এবং এই পূর্ববর্তীটির আগে অনুমতি দেওয়া হয়নি।
সেবাস্তিয়ান

এটি আমার মতে সেরা উত্তর।
ম্যাকিন্ডস

1
এই উত্তরটির শীর্ষে যেতে হবে। ধন্যবাদ.
amit

27

আরও একটি উপায়ে ব্রাঞ্চ 1 অনুমান করুন - প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি শাখা 2 - এটি শাখা প্রশাখাযোগ্য

git fetch && git checkout branch1
git log

কমিট আইডির নির্বাচন করুন যা আপনার স্থানান্তরিত করতে হবে

git fetch && git checkout branch2
git cherry-pick commit_id_first..commit_id_last
git push

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

git fetch && git checkout branch1
git reset --soft HEAD~1

5
চেরি-পিক হ'ল সত্যই সেরা "কপি / মুভমেন্ট সিঙ্গল কমিট" কমান্ড, এসএসপি। যখন ইতিহাস আপনার প্রয়োজনের জন্য লাগেজ হয়।
জন নিউহাউস

এটি এখন পর্যন্ত প্রশ্নের সর্বাধিক সুবিধাজনক উত্তর। কমান্ডের জন্য আপনাকে ধন্যবাদ!
ফারাহ

আপনি কি আপনার সর্বশেষ মন্তব্য আপডেট করতে পারবেন যেখানে 1 বা n টি চাপ দেওয়া কমিটের সংখ্যা? এটি এখনও এই প্রশ্নের সত্যিই একটি ভাল সমাধান।
chAlexey

9

বিকল্পভাবে, আপনি ভুল শাখায় প্রতিশ্রুতি দেওয়ার ঠিক পরে, এই পদক্ষেপগুলি সম্পাদন করুন:

  1. git log
  2. git diff {previous to last commit} {latest commit} > your_changes.patch
  3. git reset --hard origin/{your current branch}
  4. git checkout -b {new branch}
  5. git apply your_changes.patch

আমি কল্পনা করতে পারি যে এক এবং দুটি পদক্ষেপের জন্য একটি সহজ পদ্ধতির রয়েছে।


6

কি সম্পর্কে:

  1. বর্তমান হেড থেকে শাখা।
  2. আপনার নতুন শাখায় নয়, আপনি মাস্টার রয়েছেন তা নিশ্চিত করুন ।
  3. git reset আপনি পরিবর্তনগুলি শুরু করার আগে শেষ প্রতিশ্রুতিতে ফিরে যান।
  4. git pull রিসেটটি দিয়ে দূরে ফেলে দেওয়া কেবলমাত্র দূরবর্তী পরিবর্তনগুলি পুনরায় টানতে।

অথবা আপনি যখন শাখাটি পুনরায় মার্জ করার চেষ্টা করবেন তখন কি এটি বিস্ফোরিত হবে?


2
আহ, এটি মূলত বিকল্পটি উপরে বর্ণিত @ মার্ক-লংএয়ার দ্বারা বর্ণিত
টিম কেটিং

2

এখানে একটি আরও সহজ উপায়:

  1. একটি নতুন শাখা তৈরি করুন

  2. আপনার নতুন শাখায় একটি করুন git merge master- এটি আপনার প্রতিশ্রুতিবদ্ধ (ধাক্কা দেয় না) আপনার নতুন শাখায় পরিবর্তিত হবে

  3. আপনি স্থানীয় মাস্টার শাখা মুছুন পরিবর্তে আপনি শাখাটি মোছার জন্য চাপ দিতে চান তা git branch -D masterব্যবহার করুন ।-D-d

  4. শুধু একটি না git fetchআপনার মাস্টার শাখা এবং একটি কি git pullতা নিশ্চিত করতে আপনার দলগুলির সর্বশেষ কোড আছে আপনার মাস্টার ডালে।


1

একটি সহজ পদ্ধতির, যা আমি ব্যবহার করছি (ধরে নিলাম আপনি 4 টি কমিট সরিয়ে নিতে চান):

git format-patch HEAD~4

(যে ডিরেক্টরিটি থেকে আপনি 4 টি .patchফাইলের জন্য শেষ কমান্ডটি কার্যকর করেছিলেন সেটি দেখুন )

git reset HEAD~4 --hard

git checkout -b tmp/my-new-branch

তারপর:

git apply /path/to/patch.patch

যেই আদেশে আপনি চেয়েছিলেন


0
  1. আপনার উত্সগুলির নতুন কপি চেকআউট করুন

    git clone ........

  2. কাঙ্ক্ষিত অবস্থান থেকে শাখা তৈরি করুন

    git checkout {position} git checkout -b {branch-name}

  3. দূরবর্তী সংগ্রহস্থল যোগ করুন

    git remote add shared ../{original sources location}.git

  4. দূরবর্তী উত্স পান

    git fetch shared

  5. চেকআউট কাঙ্ক্ষিত শাখা

    git checkout {branch-name}

  6. উত্সগুলি মার্জ করুন

    git merge shared/{original branch from shared repository}


0

আমার জন্য এটি সর্বোত্তম উপায় ছিল:

  1. পরিবর্তনগুলি এবং মার্জ দ্বন্দ্বগুলি পরীক্ষা করুন git fetch
  2. একটি নতুন শাখা তৈরি করুন git branch my-changesএবং রিমোটে এগিয়ে যান
  3. নতুন তৈরি শাখায় আপস্ট্রিম পরিবর্তন করুন git master -u upstream-branch remotes/origin/my-changes
  4. আপনার প্রতিশ্রুতিগুলি নতুন প্রবাহ শাখায় ঠেলাঠেলি করুন।
  5. পূর্ববর্তী প্রবাহে ফিরে যান git branch master --set-upstream-to remotes/origin/master
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.