গিট: "বর্তমানে কোনও শাখায় নেই” " পরিবর্তনগুলি বজায় রেখে কোনও শাখায় ফিরে আসার কী সহজ উপায় আছে?


201

তাই আমি সংগ্রহশালায় কিছু কাজ করেছি এবং যখন আমি প্রতিশ্রুতিবদ্ধ হতে চলেছি তখন বুঝতে পারি যে আমি বর্তমানে কোনও শাখায় নেই।

সাবমডিউলগুলির সাথে কাজ করার সময় এটি অনেক ঘটে এবং আমি এটি সমাধান করতে সক্ষম হয়েছি, তবে প্রক্রিয়াটি ক্লান্তিকর এবং আমি ভাবছিলাম যে এটি করার সহজ উপায় থাকতে হবে।

পরিবর্তনগুলি বজায় রেখে কোনও শাখায় ফিরে আসার কী সহজ উপায় আছে?

উত্তর:


213

যদি আপনি প্রতিশ্রুতিবদ্ধ না হন:

git stash
git checkout some-branch
git stash pop

আপনি যদি প্রতিশ্রুতিবদ্ধ থাকেন এবং যেহেতু কিছু পরিবর্তন করেন না:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

আপনি যদি প্রতিশ্রুতিবদ্ধ থাকেন এবং তারপরে অতিরিক্ত কাজ করেছেন:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop

16
যদি আপনি ইতিমধ্যে প্রতিশ্রুতিবদ্ধ থাকেন তবে এটি কোনওরকম সহায়তা করে না। কোনও ডাউনভোট যদিও প্রশ্নের ক্ষেত্রে নির্দিষ্ট করা হয়নি।
ডিন

24
যদি আপনি ইতিমধ্যে প্রতিশ্রুতিবদ্ধ হন: আপনি যে প্রতিশ্রুতিবদ্ধ ( হবেন git showবা ব্যবহার করেছেন git rev-parse HEAD) এর হ্যাশটি নোট করুন , শাখায় স্যুইচ করুন এবং তারপরে git cherry-pickকমিট হ্যাশ অনুসরণ করুন।
আরাকনিদ

7
যদি প্রতিশ্রুতিবদ্ধ হয় তবে শেষ প্রতিশ্রুতি দেওয়ার হ্যাশ পান। আপনি যে শাখায় থাকতে চান তা চেকআউট করুন এবংgit merge _hash_
ড্যানিয়েল

সত্যিই যত্নবান হন। যদি আপনি পরিবর্তনের বিষয়ে কমিটিকেটেড করেন এবং আপনি এই পদক্ষেপগুলি অনুসরণ করেন ... আপনি বার্তাটি দেখতে পাবেন ... "আপনার শাখা এবং উত্স / মাস্টারটি অন্যদিকে চলে গেছে"।
থিঙ্কানোথেরন

1
@ থিংকনোথেরন যদি আপনি ইতিমধ্যে আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ থাকেন তবে স্ট্যাশ করার মতো কোনও কিছুই থাকবে না এবং একটি আলাদা শাখা পরীক্ষা করা বিশ্বের শেষ নয়। আপনি সবেমাত্র প্রতিশ্রুতিবদ্ধ এখনও রয়েছেন এবং আপনি এটি ব্যবহার করে branch শাখায় মার্জ করতে পারেন git merge <hash-of-the-commit-you-just-made>
এরিক বি

160

এটি আমাকে সাহায্য করেছে

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch

25
আপনি যদি ইতিমধ্যে একাধিক কমিট করে থাকেন তবে আপনার যা করা দরকার তা এটি।
ওকেস

এটি চেষ্টা করে দেখেনি, তবে দেখে মনে হচ্ছে এটি কার্যকর হবে। তবে আমি মনে করি এটি একটি সম্ভাবনাময় দৃশ্য। আমি বিশ্বাস করি যে বেশিরভাগ লোকেরা বুঝতে পারবে যে তারা কোন শাখায় নেই, তারা অঙ্গীকার করার আগে এবং এটি ঠিক করার জন্য গৃহীত উত্তরটি ব্যবহার করে use
এরিক বি

49
আপনি অবাক হবে।
এরিক

@ এরিকবি আমি জানতাম না যে শাখায় না থাকার মতো জিনিস রয়েছে। এই উত্তরটি আমার পক্ষে খুব সহায়ক ছিল।
কনস্ট্যান্টিন শোবার্ট

2
সুন্দর উত্তর, আসলে এটি টাইপ করেছেন এবং কাজ করেছেন, জিআইটি শিক্ষানবিশ হিসাবে উপস্থিত সমস্ত কিছুর বিপরীতে - আপনি উল্লেখ করতে পছন্দ করতে পারেন যে নিউব্র্যাঞ্চ একটি আরব্রিটারি নাম এবং প্রতিশ্রুতিবদ্ধ হ্যাশ দিয়ে প্রতিস্থাপনের উদ্দেশ্যে নয়
টনি লে

22
git checkout master

ফলাফলটি এরকম কিছু:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

তাহলে চলো এটা করি:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

আমি চেষ্টা করে দেখিনি, তবে মনে হচ্ছে এটি ঠিকঠাক কাজ করবে। আমার ধারণা আপনি যদি git gcএই দুটি কমান্ড চালানোর মধ্যে দৌড়ে থাকেন তবে আপনি সেই কমিটগুলি হারাবেন, তবে আপনি git gcস্বয়ংক্রিয়ভাবে চালা না করলে এটি মোটামুটি ঝুঁকিমুক্ত পদ্ধতির হওয়া উচিত। আমি তখনও বাবার উত্তর নিয়ে যাব, তবে আপনি যদি দুটি অতিরিক্ত কমান্ড লেখার হাত থেকে নিজেকে বাঁচাতে চান তবে আমার মনে হয় এটিই এই পথ।
এরিক বি

আমি এক পর্যায়ে মাস্টার শাখা ছেড়ে দিয়েছিলাম যে আমি পুরোপুরি নিশ্চিত নই। আমি আমার পরিবর্তনগুলি কমিট করেছিলাম, মাস্টারের কোনও পরিবর্তন হয়নি। এই নির্দেশাবলী আমার পরিবর্তনগুলি মাস্টার শাখায় নিয়ে এসেছিল এবং সমস্ত কিছু ভাল।
মট্টি জোকিপি

+1 পিছনে কমিট ছেড়ে যাওয়ার সময় আমি অন্য একটি শাখা পরীক্ষা করে দেখে নার্ভাস হয়ে গিয়েছিলাম, এই বার্তাটি দেখে তাতে আত্মবিশ্বাস যুক্ত হয়েছিল।
জে-ডিজল

11

এখানে অন্য একটি উপায় ছেড়ে

git branch newbranch
git checkout master 
git merge newbranch 

3
@ এরিকবি তিনি একাধিক কমিটি করেছেন। সেক্ষেত্রে বাবার উত্তর দেখুন।
বেনজামিন

@ বেনজামিনওকস এটি হতে পারে তবে এই গিট আদেশগুলি বৈধ নয় valid
এরিক বি

@ এরিকবি অবশ্যই সত্য। :) বাবার উত্তর হ'ল অ্যালেক্স যা করার চেষ্টা করেছে তার বৈধ রূপ।
বেনজামিন ওকস

9

বিকল্পভাবে, আপনি আপনার সাবমোডিয়ুলগুলি সেটআপ করতে পারেন যাতে তাদের ডিফল্ট বিচ্ছিন্ন প্রধান অবস্থানে না গিয়ে আপনি একটি শাখা পরীক্ষা করে দেখতে পারেন।

যুক্ত করতে সম্পাদিত:

একটি উপায় হ'ল সাব-মডুলের একটি নির্দিষ্ট শাখা চেকআউট করা যখন আপনি এটিকে -b পতাকাটি যুক্ত করেন:

git submodule add -b master <remote-repo> <path-to-add-it-to>

আরেকটি উপায় হ'ল কেবল সাবমডিউল ডিরেক্টরিতে গিয়ে কেবল এটি পরীক্ষা করে দেখানো

git checkout master

1
আপনি আমাকে বলতে পারেন যে এটি কিভাবে?
এরিক বি

এই ডিফল্ট শাখা মোডের কোনও বিদ্যমান সাবমডিউল আপডেট করার কোনও উপায় আছে? gitmodulesসম্ভবত আপডেট ?
হার্টজেল গিনেস

পুনঃটুইট করেছেন সাবমডিউলটি একটি নির্দিষ্ট কমিট শা এ পরীক্ষা করা হয়। একটি শাখা কেবলমাত্র শ এবং শের দিকে ইঙ্গিত করে যা এটি পরিবর্তন করতে পারে। এটি কার্যকর নয় কারণ এটি চেক আউট সাবমডিউলের স্থিতি স্থির করে না। আপনি যদি সাবমডিউলে পরিবর্তন করে চলেছেন তবে একটি শাখা পরীক্ষা করা কেবল একটি সুবিধা।
আবিজার্ন

5

এই পরিস্থিতিতে শেষ করার একটি উপায় একটি প্রত্যন্ত শাখা থেকে রিবেস করার পরে। এই ক্ষেত্রে, নতুন কমিটগুলি HEADকিন্তু দ্বারা নির্দেশিতmaster করে না - এটি অন্য শাখাকে পুনর্বাসিত করার আগে যেখানেই ছিল সেখানে এটি নির্দেশ করে।

এটি করে আপনি এইটিকে নতুন masterকরে প্রতিশ্রুতিবদ্ধ করতে পারেন :

git branch -f master HEAD
git checkout master

এই বাধ্যতামূলকভাবে masterনির্দেশ করে HEAD(আপনাকে না রেখে master) তারপরে স্যুইচ করে master


প্রয়োজন মতো নিখুঁতভাবে কাজ করেছেন। আমি ইতিমধ্যে ফাইলগুলি স্টেজ করেছি এবং প্রতিশ্রুতিবদ্ধ ছিলাম, তবে উপরের ত্রুটির কারণে চাপ দিতে অক্ষম। উপরে দুটি লাইনের কোড পুরোপুরি সূক্ষ্মভাবে কাজ করেছিল এবং প্রত্যাশার সাথে সাথে আমার কোডটিকে ধাক্কা দিয়েছে।
অপরাজেয়মুফি

4

আমি সম্প্রতি আবার এই সমস্যায় পড়েছি। আমি সাবমডিউলগুলি নিয়ে সর্বশেষে কাজ করেছি এবং গিট সম্পর্কে আরও জানার পরে আমি বুঝতে পেরেছি যে আপনি যে শাখাটি সম্পাদন করতে চান তা কেবল পরীক্ষা করা যথেষ্ট। গিট কর্মক্ষম গাছ রাখবে এমনকি যদি তা স্ট্যাশ না করে।

git checkout existing_branch_name

আপনি যদি একটি নতুন শাখায় কাজ করতে চান তবে এটি আপনার পক্ষে কাজ করা উচিত:

git checkout -b new_branch_name

যদি আপনার কাজের গাছটিতে দ্বন্দ্ব থাকে তবে চেকআউটটি ব্যর্থ হবে, তবে এটি বেশ অস্বাভাবিক হওয়া উচিত এবং যদি এটি ঘটে তবে আপনি কেবল এটি স্ট্যাশ করতে পারেন, এটিকে পপ করতে পারেন এবং বিরোধটি সমাধান করতে পারেন।

গৃহীত উত্তরের তুলনায়, এই উত্তরটি আপনাকে দুটি কমান্ডের সম্পাদনা রক্ষা করবে, যেভাবে যাইহোক বাস্তবায়িত হতে খুব বেশি সময় লাগে না। অতএব আমি এই উত্তরটি গ্রহণ করব না, যদি না এটি অলৌকিকভাবে বর্তমানে গৃহীত উত্তরের চেয়ে আরও বেশি উত্স (বা কমপক্ষে) পেয়ে না যায়।


2

নিম্নলিখিত পদ্ধতিটি কাজ করতে পারে:

git rebase HEAD master
git checkout master

এটি মাস্টারের শীর্ষে আপনার বর্তমান হেড পরিবর্তনগুলি পুনঃনির্মাণ করবে। তারপরে আপনি শাখাটি স্যুইচ করতে পারেন।


বিকল্প উপায় হ'ল প্রথমে শাখাটি চেক আউট করা:

git checkout master

তারপরে গিটকে আপনার বিচ্ছিন্ন কমিটগুলির SHA1 প্রদর্শন করা উচিত, তারপরে আপনি সেগুলি বেছে নিতে পারেন, যেমন

git cherry-pick YOURSHA1

অথবা আপনি সর্বশেষটি একত্রীকরণ করতে পারেন:

git merge YOURSHA1

: বিভিন্ন শাখা থেকে আপনার করে সব দেখতে, চালানো (আপনি তাদের করেছি করতে) git reflog


0

আমি জানি যে আমি 2012 সালে বাবাকে বলেছিলাম যে আমি ভেবেছিলাম যে এটি সম্ভবত সম্ভব নয় যে কেউ বুঝতে পারে যে তারা কোনও শাখায় নেই এবং প্রতিশ্রুতিবদ্ধ ছিল না। এটি আমার সাথে কেবল ঘটেছিল, তাই আমি অনুমান করি যে আমি ভুল ছিলাম তা স্বীকার করতেই হবে, তবে এটি ঘটেছিল যে আমার সাথে এটি হওয়ার জন্য ২০১ 2016 সাল পর্যন্ত সময় লেগেছে, আপনি যুক্তি দিতে পারেন যে এটি বাস্তবে সম্ভাবনা নয়।

যাইহোক, একটি নতুন শাখা তৈরি করা আমার মতে ওভারকিল। আপনাকে যা করতে হবে তা হ'ল:

git checkout some-branch
git merge commit-sha

অন্য শাখাটি পরীক্ষা করে দেখার আগে যদি আপনি কমিট-শ অনুলিপি না করেন তবে আপনি সহজেই চালিয়ে এটি সন্ধান করতে পারেন:

git reflog

এটি এক ব্যক্তির জন্য বিরল (অসম্ভব) সমস্যা। এটি ২০১২ সালের পর থেকে আমার কাছে ঘটেনি But তবে আপনি যদি গিট-ব্যবহারকারীর সংখ্যা বাড়ানোর সুযোগটি বহুগুণে বৃদ্ধি করেন ... তবে এটি সম্ভবত খুব সম্ভব। এটি প্রতিদিন কারও সাথে হতে পারে। :)
বাবাই 4'17
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.