আমি কীভাবে মাস্টার / উত্সের সাথে পৃথক হেডের পুনর্মিলন করতে পারি?


1558

গীটের শাখা-প্রশাখা জটিলতায় আমি নতুন। আমি সর্বদা একটি একক শাখায় কাজ করি এবং পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ এবং তারপরে পর্যায়ক্রমে আমার দূরবর্তী উত্সের দিকে ঠেলে।

কোথাও কোথাও, আমি প্রতিশ্রুতিবদ্ধ পর্যায়ের মঞ্চ থেকে বেরিয়ে আসার জন্য কিছু ফাইল পুনরায় সেট করেছিলাম এবং rebase -iসাম্প্রতিক স্থানীয় স্থানীয় কমিটগুলি থেকে মুক্তি পাওয়ার জন্য কিছু করেছি। এখন আমি এমন অবস্থায় রয়েছি যা আমি বেশ বুঝতে পারি না।

আমার কর্মক্ষেত্রে, git logআমি যা প্রত্যাশা করছিলাম তা হুবহু দেখায় - আমি যেতে চাইনি এমন কমিটগুলি সহ আমি সঠিক ট্রেনে এবং সেখানে নতুন ইত্যাদি

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

আমি মনে করি "মাস্টার / উত্স" হেড থেকে বিচ্ছিন্ন, তবে এর অর্থ কী, কমান্ড লাইন সরঞ্জামগুলির সাহায্যে এটি কীভাবে দৃশ্যমান করা যায় এবং কীভাবে এটি ঠিক করা যায় সে সম্পর্কে আমি 100% পরিষ্কার নই।


আপনি কি পুনর্বাসনের আগে কমিটগুলিকে ঠেলে দিয়েছেন?
মনোজাল্ড

@ মানোজাল্ডস: আপনার অর্থ কী তা নিশ্চিত নয় Not আমি রিবেসের আগে কিছুটা সময় ঠেলেছি, তবে তাড়াতাড়ি আগে নয়।
বেন জোটো

আপনি পূর্বে যে কমান্ডগুলি রিবেসে -i-তে সরিয়েছেন তা পূর্বে রেখেছিলে .. আপনার উত্তর থেকে আমি ভাবি না।
মনোজাল্ড

@ manojlds: সঠিক। আমি কেবলমাত্র কমিটসকে হত্যা করেছি যা সাম্প্রতিকতম ধাক্কার চেয়ে সাম্প্রতিক ছিল। (যদিও আমি যেমন বলেছি, আমি তখন থেকেই ধাক্কা দিয়েছি, যেহেতু আমি ভেবেছিলাম সবকিছু ঠিক আছে)
বেন জোটো

আপনি কিছু I did a reset of some files to get them out of commit stagingঅংশে কি ব্যাখ্যা করতে পারেন ? প্রশ্নের জন্য দুঃখিত :)
manojld

উত্তর:


2521

প্রথমে আসুন স্পষ্ট করা যাক শিরোনাম কী এবং এটি আলাদা হওয়ার সময় এর অর্থ কী।

বর্তমানে চেক আউট করা কমিটের প্রতীকী নাম হেইড। যখন হেডকে বিচ্ছিন্ন না করা হয় ("সাধারণ" 1 পরিস্থিতি: আপনার একটি শাখা চেক আউট করা হয়), তখন হেড আসলে একটি শাখার "রেফ" নির্দেশ করে এবং শাখা অঙ্গীকারের দিকে নির্দেশ করে। মাথা এইভাবে একটি শাখার সাথে "সংযুক্ত" থাকে। যখন আপনি একটি নতুন প্রতিশ্রুতিবদ্ধ করেন, তখন প্রধান শাখাটি নির্দেশ করে যে শাখাটি নতুন প্রতিশ্রুতিতে নির্দেশ করে তা আপডেট করা হয়। হেড স্বয়ংক্রিয়ভাবে অনুসরণ করে যেহেতু এটি কেবল শাখায় নির্দেশ করে।

  • git symbolic-ref HEADফলন refs/heads/master
    "মাস্টার" নামে পরিচিত শাখাটি চেক আউট করা হয়েছে।
  • git rev-parse refs/heads/masterফলন 17a02998078923f2d62811326d130de991d1a95a
    হ'ল মাস্টার ব্রাঞ্চের বর্তমান টিপ বা "প্রধান"।
  • git rev-parse HEADএছাড়াও ফলন 17a02998078923f2d62811326d130de991d1a95a
    এটি "প্রতীকী রেফ" হওয়ার অর্থ এটি। এটি অন্য কিছু রেফারেন্সের মাধ্যমে কোনও বস্তুর দিকে নির্দেশ করে।
    (সিম্বলিক রেফগুলি মূলত প্রতীকী লিঙ্ক হিসাবে প্রয়োগ করা হয়েছিল, তবে পরে অতিরিক্ত ব্যাখ্যা দিয়ে প্লেইন ফাইলগুলিতে পরিবর্তিত হয়েছে যাতে সেগুলি প্ল্যাটফর্মগুলিতে সিলেলিক্স না করে ব্যবহার করা যেতে পারে।)

আমাদের আছে HEADrefs/heads/master17a02998078923f2d62811326d130de991d1a95a

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

  • git symbolic-ref HEAD সঙ্গে ব্যর্থ fatal: ref HEAD is not a symbolic ref
  • git rev-parse HEADফলন 17a02998078923f2d62811326d130de991d1a95a
    যেহেতু এটি একটি প্রতীকী রেফ নয়, এটি অবশ্যই নিজের দায়বদ্ধতার দিকে নির্দেশ করবে।

আমাদের আছে HEAD17a02998078923f2d62811326d130de991d1a95a

একটি বিচ্ছিন্ন হেডের সাথে মনে রাখার গুরুত্বপূর্ণ বিষয়টি হ'ল এটি যে প্রতিশ্রুতি নির্দেশ করে তা যদি অন্যথায় অযৌক্তিক হয় (অন্য কোনও রেফ এটি পৌঁছতে পারে না), তবে আপনি যখন অন্য কোনও প্রতিশ্রুতি চেক আউট করবেন তখন এটি "জটলা" হয়ে উঠবে। অবশেষে, এ জাতীয় ঝুঁকিপূর্ণ কমিটগুলি আবর্জনা সংগ্রহের প্রক্রিয়াটির মাধ্যমে ছাঁটাই করা হবে (ডিফল্টরূপে সেগুলি কমপক্ষে 2 সপ্তাহের জন্য রাখা হয় এবং হেডের রিফ্লোগ দ্বারা রেফারেন্স করে দীর্ঘ সময় রাখা যেতে পারে)।

1 একটি বিচ্ছিন্ন হেডের সাথে "স্বাভাবিক" কাজ করা পুরোপুরি ঠিক আছে, রিফ্লগের বাইরে থাকা ইতিহাসের মাছটিকে এড়াতে আপনি কী করছেন সে সম্পর্কে আপনাকে কেবল নজর রাখতে হবে।


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

আপনার পরিস্থিতি থেকে পুনরুদ্ধার করতে, আপনার একটি শাখা তৈরি করা উচিত যা আপনার বিচ্ছিন্ন হেড দ্বারা বর্তমানে নির্দেশিত প্রতিশ্রুতিগুলিকে নির্দেশ করে:

git branch temp
git checkout temp

(এই দুটি কমান্ড সংক্ষেপে হিসাবে সংক্ষিপ্ত করা যেতে পারে git checkout -b temp)

এটি আপনার হেডকে নতুন tempশাখায় পুনরায় সংযুক্ত করবে ।

এরপরে, আপনার বর্তমান কমিট (এবং এর ইতিহাস) এর সাথে তুলনা করা উচিত যে সাধারণ শাখায় আপনি কাজ করছেন বলে আশা করছেন:

git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp

(আপনি সম্ভবত লগ বিকল্পগুলি নিয়ে পরীক্ষা করতে চাইবেন: সম্পূর্ণ লগ বার্তা ইত্যাদি দেখতে যোগ করুন -p, ছেড়ে দিন --pretty=…)

আপনার নতুন tempশাখাটি দেখতে ভাল masterলাগলে আপনি এটি আপডেট করতে (যেমন) আপডেট করতে চাইতে পারেন :

git branch -f master temp
git checkout master

(এই দুটি কমান্ড সংক্ষেপে হিসাবে সংক্ষিপ্ত করা যেতে পারে git checkout -B master temp)

তারপরে আপনি অস্থায়ী শাখাটি মুছতে পারেন:

git branch -d temp

শেষ অবধি, আপনি সম্ভবত পুনঃপ্রকাশিত ইতিহাসটি এগিয়ে নিতে চাইবেন:

git push origin master

--forceনতুন কমিটের কাছে যদি দূরবর্তী শাখাটি "দ্রুত-ফরওয়ার্ড" না করা যায় (যেমন আপনি বাদ পড়েছেন বা কিছু বিদ্যমান প্রতিশ্রুতি পুনরায় লিখেছেন, অথবা ইতিহাসের কিছুটা পুনর্লিখন লিখেছেন) তবে আপনাকে এই কমান্ডের শেষের দিকে চাপ দিতে হবে push

আপনি যদি রিবেস অপারেশনের মাঝামাঝি থাকেন তবে সম্ভবত আপনার এটি পরিষ্কার করা উচিত। ডিরেক্টরিটি সন্ধান করে কোনও রিবেস প্রক্রিয়াধীন ছিল কিনা তা আপনি পরীক্ষা করতে পারেন .git/rebase-merge/। আপনি কেবলমাত্র সেই ডিরেক্টরি মুছে ফেলার মাধ্যমে অগ্রগতি রিবেসটি ম্যানুয়ালি পরিষ্কার করতে পারেন (উদাহরণস্বরূপ যদি আপনি সক্রিয় রিবেস অপারেশনের উদ্দেশ্য এবং প্রসঙ্গটি মনে না রাখেন)। সাধারণত আপনি ব্যবহার করবেন git rebase --abort, তবে এটি কিছু অতিরিক্ত পুনরায় সেট করে যা আপনি সম্ভবত এড়াতে চান (এটি মাথাটি মূল শাখায় ফিরে যায় এবং এটিকে পুনরায় সেট করে দেয় মূল প্রতিশ্রুতিতে, যা আমরা উপরে কিছু কাজ পূর্বাবস্থায় ফিরিয়ে আনব)।


6
থেকে আকর্ষণীয় man git-symbolic-ref: "অতীতে .git/HEADছিল সিম্বলিক লিঙ্ক নির্দেশ refs/heads/masterযখন আমরা অন্য শাখা স্যুইচ করতে চেয়েছিলেন, আমরা করেনি। ln -sf refs/heads/newbranch .git/HEAD, এবং যখন আমরা খুঁজে বের করতে যা শাখা আমরা উপর চেয়েছিলেন, আমরা কি readlink .git/HEADতবে সিম্বলিক লিংক সম্পূর্ণভাবে পোর্টেবল নয়। , সুতরাং এগুলি এখন অবচয় করা হয়েছে এবং প্রতীকী রেফগুলি (উপরে বর্ণিত হিসাবে) ডিফল্টরূপে ব্যবহৃত হয়। "
দিমিত্রি মিনকভস্কি

10
আমি @ অ্যান্টোনিওসেষ্টোর সাথে একমত: বেশিরভাগ প্রকল্পের জন্য (এমনকি মোটামুটি বৃহত্তর) আপনার গিটের মতো মন-বগল জটিলতা দরকার নেই। আমার মস্তিষ্ক এমন কোনও কিছু নিয়ে ঝাঁপিয়ে পড়ে বিদ্রোহী যেটি এত স্পষ্টভাবে ওভার ইঞ্জিনিয়ারড। আমার এটি দরকার নেই এবং আমি এটিও চাই না।
জ্যাস্পার স্প্রেঞ্জার্স

36
এটি একটি ভাল উত্তর, তবে আমি মনে করি টেম্প শাখার কোনও প্রয়োজন নেই (যদিও আমি সাধারণত আমার নিজের ব্যবহার করি)। git branch -f master HEAD && git checkout masterযথেষ্ট - আপনার লক্ষ্য ধরে নেওয়া আপনার বর্তমান মাথা রাখা তবে এটি হিসাবে মনোনীত করা master। অন্যান্য লক্ষ্যগুলিও বোধগম্য হয় এবং অন্যান্য রেসিপিগুলি আহ্বান করে।
অ্যাড্রিয়ান রত্নপাল

38
দৈর্ঘ্য সম্পর্কে দুরন্ত মন্তব্য মন্তব্য। আমাদের বাকী অংশগুলি কেবল "আপনার পরিস্থিতি থেকে পুনরুদ্ধার করার জন্য [...]" বলার লাইনে পৌঁছানো অবধি স্ক্যান করতে হবে এবং সেখান থেকে যেতে হবে - এমন একটি মানসিক নোট তৈরি করার সময় যে আমরা পড়তে পারি এমন একটি কার্যকর সুস্পষ্ট ব্যাকস্টোরি রয়েছে কোন বৃষ্টি মুখর দিনে. বিকল্প আরো আপনি আঘাত না পড়তে, কিন্তু এটা নেই সুবিধা অন্যদের কাছে দাঁড়ানো।
আন্ডারস্কোর_ড

5
এই কারণেই আমি গিটকে ঘৃণা করি।
মনিকা হেডনেক

626

শুধু এটি করুন:

git checkout master

বা, আপনি রাখতে চান এমন পরিবর্তনগুলি থাকলে, এটি করুন:

git checkout -b temp
git checkout -B master temp

57
এটি একটি বিপজ্জনক প্রতিক্রিয়া। এই উত্তরে আগত লোকদের আলাদা আলাদা রাজ্য থাকে এবং "ঠিক করার জন্য এটি করুন" প্রতিক্রিয়া প্রশ্নের উত্তর দেয় না। এই এক সহজেই কাজ ধ্বংস করতে পারেন।
আর্কোনিক

15
"গিট চেকআউট মাস্টার" যদি বিচ্ছিন্ন মাথা মাস্টারের অংশ না হয় তবে সমস্ত পরিবর্তন হারাতে হবে !!
টনি

3
@ ব্লাউহিরন আপনার সম্ভবত কমিট পরীক্ষা হয়েছে, শাখাটি নয়। শাখাটি এখনও একই প্রতিশ্রুতি দেখায় তবে আপনি অন্যরকম 'মোডে' রয়েছেন।
ড্যানিয়েল আলেক্সিয়ুক

1
git reset"আপনি কী করছেন সে সম্পর্কে যদি আপনার কোনও ধারণা না থাকে তবে এটি বন্ধ করুন" একটি সতর্কতা নিয়ে আসা উচিত। সন্ত্রাসের এক ঘন্টা থেকে সবে ফিরে এসে ভেবেছিলাম আমি কাজের শেষ সপ্তাহটি হারাব। ধন্যবাদ!
Opus1217

1
@ আর্চোনিকের সাথে সম্মত হোন আপনি কোনও কমান্ড অন্ধভাবে চালানোর আগে গিট কীভাবে কাজ করে তা বোঝা গুরুত্বপূর্ণ। বড় উত্তরটি না পড়ে আপনি সময় বাঁচাতে পারেন, তবে আপনার কাজটি যদি হারিয়ে যায় তবে আরও বেশি সময় হারাতে পারেন।
ইউসুফালি 2205

132

আমি এই ইস্যুতে দৌড়েছি এবং যখন আমি শীর্ষে ভোট দেওয়া উত্তরটি পড়েছি:

বর্তমানে চেক আউট করা কমিটের প্রতীকী নাম হেইড।

আমি ভেবেছিলাম: আহ-হা! যদি HEADকার্লাল্টি চেকআউট প্রতিশ্রুতিবদ্ধতার প্রতীকী নাম হয় তবে আমি এটিকে masterছাড় দিয়ে এইটির সাথে পুনরায় মিলন করতে পারি master:

git rebase HEAD master

এই আদেশ:

  1. চেক আউট master
  2. পিতামাতার প্রতিশ্রুতিগুলি থেকে HEADফিরে HEADসরানো বিন্দুতে চিহ্নিত করেmaster
  3. উপরের যারা কমিট খেলুন master

শেষ ফলাফলটি হ'ল যে সমস্ত কমিটগুলি ছিল যা ছিল HEADকিন্তু masterতখন ছিল না mastermasterঅবশেষে চেক আউট।


রিমোট সম্পর্কিত:

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

দূরবর্তী ইতিহাস আর আপনার স্থানীয় ইতিহাস ব্যবহার করে দ্রুত এগিয়ে যায় না। আপনাকে জোর করে ধাক্কা দিতে হবে (git push -fদূরবর্তী ইতিহাসের ওভাররাইট করতে ) করতে হবে। আপনার যদি কোনও সহযোগী থাকে তবে তাদের সাথে এটি সমন্বয় করা সাধারণত বুদ্ধিমান হয় তাই প্রত্যেকে একই পৃষ্ঠায় রয়েছে।

masterআপনি রিমোটে চাপ দেওয়ার পরে origin, আপনার দূরবর্তী ট্র্যাকিং শাখাটি origin/masterএকই প্রতিশ্রুতিতে নির্দেশ করতে আপডেট করা হবে master


3
গিট: "প্রথমে আপনার কাজটিকে উপরে চাপিয়ে দেওয়ার জন্য মাথাটি রিওয়াইন্ডিং করুন ... দ্রুত এগিয়ে ফেলার জন্য মাস্টার হেড।" আমি: "চমৎকার!"
বেনিয়ামিন

81

বিচ্ছিন্ন মাথাটির মূল ব্যাখ্যাটির জন্য এখানে দেখুন:

http://git-scm.com/docs/git-checkout

এটি দেখার জন্য কমান্ড লাইন:

git branch

অথবা

git branch -a

আপনি নীচের মত আউটপুট পাবেন:

* (no branch)
master
branch1

* (no branch)শো আপনি বিচু্যত মাথা রয়েছে।

আপনি কোনও git checkout somecommitইত্যাদি করে এই রাজ্যে আসতে পারতেন এবং এটি আপনাকে নিম্নলিখিতগুলির সাথে সতর্ক করে দিত:

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

আপনি যদি নিজের তৈরি কমিটগুলি ধরে রাখতে একটি নতুন শাখা তৈরি করতে চান তবে আপনি চেকআউট কমান্ড দিয়ে -b ব্যবহার করে (এখন বা পরে) এটি করতে পারেন। উদাহরণ:

গিট চেকআউট-বি নতুন_ ব্রাঞ্চ_নাম

এখন, এগুলি মাস্টারকে পেতে:

একটি git reflogবা এমনকি ন্যায়বিচার করুন git logএবং আপনার প্রতিশ্রুতিগুলি নোট করুন। এখন git checkout masterএবং git mergeকমিট।

git merge HEAD@{1}

সম্পাদনা:

যোগ করার জন্য, git rebase -iকেবল আপনার প্রয়োজন হয় না এমন কমিটগুলি মুছে ফেলার জন্য / হত্যা করার জন্য নয়, সেগুলি সম্পাদনা করার জন্যও ব্যবহার করুন। কমিট লিস্টে কেবল "সম্পাদনা" উল্লেখ করুন এবং আপনি আপনার প্রতিশ্রুতি সংশোধন করতে সক্ষম হবেন এবং তারপরে git rebase --continueএগিয়ে যাওয়ার জন্য একটি ইস্যু করতে পারবেন । এটি নিশ্চিত করে যে আপনি কখনই কোনও বিচ্ছিন্ন হেডে প্রবেশ করতে পারেন নি।


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

6
"@ {1}" কী করে?
ebi

35

আপনার নিজস্ব শাখায় বিচ্ছিন্ন প্রতিশ্রুতি পান

সহজভাবে চালান git checkout -b mynewbranch

তারপরে দৌড়াও git log, এবং আপনি দেখতে পাবেন যে প্রতিশ্রুতিবদ্ধ এখন HEADএই নতুন শাখায়।


আমি যদি এটি করি, কিছু mynewbranchসংযুক্ত করে?
বেনজাহান

1
হ্যাঁ, এটি যেখানে বিচ্ছিন্ন মাথা সংযুক্ত করা হত এটি সংযুক্ত করে, যা ঠিক আমি চেয়েছিলাম। ধন্যবাদ!
বেনজোহন

22

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

git checkout origin/develop

দ্রষ্টব্য: উত্স / বিকাশ পরীক্ষা করা

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

তারপর

git checkout -b develop

এটি কাজ করে :)


7
আমার জন্য যা কাজ করেছে তা 'গিট চেকআউট উত্স / বিকাশ' নয় বরং 'গিট চেকআউট বিকাশ'। 'উত্স / বিকাশ' ব্যবহারের ফলে সর্বদা কোনও পরিবর্তন হয় নি, এরপরে "হেড বিচ্ছিন্নভাবে উৎপত্তি / বিকাশ" এ থাকে। 'উত্স' অংশ এড়িয়ে যাওয়া সবকিছু স্থির করে।
DrStrangepork

18

আপনি যদি আপনার বর্তমান বিচ্ছিন্ন হেডকে ধাক্কা দিতে চান ( git logআগে পরীক্ষা করুন), চেষ্টা করুন:

git push origin HEAD:master

আপনার বিচ্ছিন্ন হেডকে মূল শাখায় পাঠাতে send যদি আপনার ধাক্কা প্রত্যাখ্যান হয়ে যায়, git pull origin masterতবে উত্স থেকে পরিবর্তনগুলি নেওয়ার চেষ্টা করুন । আপনি যদি উত্স থেকে আসা পরিবর্তনগুলি সম্পর্কে চিন্তা করেন না এবং এটি প্রত্যাখ্যান করা হয়, কারণ আপনি কিছু উদ্দেশ্যমূলক রিবেস করেছেন এবং আপনি আপনার বর্তমান বিচ্ছিন্ন শাখার সাথে উত্স / মাস্টার প্রতিস্থাপন করতে চান - তবে আপনি এটি জোর করতে পারেন ( -f)। আপনি যদি পূর্ববর্তী কমিটগুলিতে কিছু অ্যাক্সেস হারিয়ে ফেলে থাকেন তবে আপনি সর্বদা git reflogসমস্ত শাখা থেকে ইতিহাস দেখতে চালাতে পারেন।


মাস্টার শাখায় ফিরে আসতে, পরিবর্তনগুলি বজায় রেখে নিম্নলিখিত কমান্ডগুলি ব্যবহার করে দেখুন:

git rebase HEAD master
git checkout master

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


2
এটি প্রকৃতপক্ষে বিচ্ছিন্ন প্রতিশ্রুতিগুলি উত্স / মাস্টারকে প্রেরণ করে। স্থানীয় শাখায় মাথা সংযুক্ত করার জন্য এটি করুন: stackoverflow.com/a/17667057/776345
পাসচালিস

আমি যখন এটি করি আমি এই সংগ্রহস্থলটি গিট এলএফএসের জন্য কনফিগার করা হয়েছে তবে 'গিট-এলএফএস' আপনার পথে পাওয়া যায় নি। আপনি যদি আর গিট এলএফএস ব্যবহার করতে না চান তবে .git / hooks / post-checkout মুছে এই হুকটি সরান।
ব্যবহারকারী 2568374

16

অনুসন্ধান করার সময় আমি এই প্রশ্নটি পেয়েছি You are in 'detached HEAD' state.

এখানে যা করার জন্য আমি কী করেছি তা বিশ্লেষণ করার পরে, আমি অতীতে যা করেছি তার সাথে তুলনা করে আমি আবিষ্কার করেছি যে আমি একটি ভুল করেছি।

আমার স্বাভাবিক প্রবাহটি হ'ল:

git checkout master
git fetch
git checkout my-cool-branch
git pull

এবার আমি করেছি:

git checkout master
git fetch
git checkout origin/my-cool-branch
# You are in 'detached HEAD' state.

সমস্যাটি হ'ল আমি দুর্ঘটনাক্রমে:

git checkout origin/my-cool-branch

বরং:

git checkout my-cool-branch

ঠিক করা (আমার পরিস্থিতিতে) কেবলমাত্র উপরের কমান্ডটি চালানো এবং তারপরে প্রবাহ চালিয়ে যাওয়া ছিল:

git checkout my-cool-branch
git pull

11

নিম্নলিখিতগুলি আমার পক্ষে কাজ করেছে (কেবলমাত্র শাখা মাস্টার ব্যবহার করে):

git push origin HEAD:master
git checkout master        
git pull

প্রথমটি বিচ্ছিন্ন হেডকে দূরবর্তী উত্সে ঠেলে দেয়।

দ্বিতীয়টি শাখা মাস্টারে চলে আসে।

তৃতীয়টি সেই হেডকে পুনরুদ্ধার করে যা শাখা মাস্টারের সাথে সংযুক্ত হয়ে যায়।

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


কাজ হয়নি, পেয়েছি: এই সংগ্রহস্থলটি গিট এলএফএসের জন্য কনফিগার করা হয়েছে তবে 'গিট-এলএফএস' আপনার পথে পাওয়া যায় নি। আপনি যদি আর গিট এলএফএস ব্যবহার করতে না চান তবে .git / hooks / প্রাক-পুশ মুছে এই হুকটি সরান। এবং আপনি বর্তমানে একটি শাখায় নেই। আপনি কোন শাখায় একত্রী হতে চান তা দয়া করে নির্দিষ্ট করুন।
ব্যবহারকারী 2568374

11

আমি আজই এই সমস্যাটিতে এসেছি এবং বেশ নিশ্চিত যে আমি এটি করে এটি সমাধান করেছি:

git branch temp
git checkout master
git merge temp

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


@ স্টারশাইন কেনর্ব এটি স্থির করেছেন এখন এটি আপনার বিচ্ছিন্ন প্রতিশ্রুতিগুলি একটি নতুন শাখায় সজ্জিত করে, টেম্পে, মাস্টারটিতে স্যুইচ করে এবং টেম্পকে মাস্টারে মার্জ করে।
সিইস টিমারম্যান

আমি জানি না পিপিএল কেন এটিকে নিম্নমানের করছে, এটি আমার সমস্যা স্থির করে তবে আপনি মুছে ফেলতে পারবেন টেম্প শাখা কমান্ডটি।
গ্লাসগোস্ট

8

আপনি যদি নিশ্চিত হন যে হেডই ভাল অবস্থা:

git branch -f master HEAD
git checkout master

আপনি সম্ভবত উত্সকে ঠেলে দিতে পারবেন না, যেহেতু আপনার মাস্টার উত্স থেকে সরে এসেছেন। আপনি যদি নিশ্চিত হন যে অন্য কেউ রেপো ব্যবহার করছে না, আপনি জোর করে চাপতে পারেন:

git push -f

সর্বাধিক দরকারী যদি আপনি কোনও বৈশিষ্ট্য শাখায় থাকেন তবে অন্য কেউ ব্যবহার করছেন না।


6

আপনাকে যা করতে হবে তা হ'ল 'গিট চেকআউট [শাখা-নাম]' যেখানে [শাখা-নাম] সেই মূল শাখার নাম যা থেকে আপনি বিচ্ছিন্ন মাথাব্যাথাতে এসেছিলেন। (এসিডাফ্যাসডিএফ থেকে বিচ্ছিন্ন) অদৃশ্য হয়ে যাবে।

সুতরাং উদাহরণস্বরূপ, শাখা 'দেব' তে আপনি কমিট অ্যাসেটফ্যাসড 14314 -> চেকআউট করেন

'git checkout asdfasd14314'

আপনি এখন একটি বিচ্ছিন্ন মাথা অবস্থায় রয়েছেন

'গিট শাখা' - - এর মতো কিছু তালিকাবদ্ধ করবে

* (detached from asdfasdf)
  dev
  prod
  stage

তবে বিচ্ছিন্ন মাথা থেকে বেরিয়ে আসতে এবং দেব -> এ ফিরে যেতে

'git checkout dev'

এবং তারপরে 'গিট শাখা' তালিকাবদ্ধ করবে ->

* dev
  prod
  stage

তবে অবশ্যই এটি যদি আপনি বিচ্ছিন্ন হেড স্টেট থেকে কোনও পরিবর্তন রাখার ইচ্ছা না রাখেন তবে আমি নিজেকে অনেক কিছু করে দেখতে পাচ্ছি যে কোনও পরিবর্তন আনার ইচ্ছা নয় বরং কেবল পূর্বের প্রতিশ্রুতি দেখার জন্য


6

ক্রিস দ্বারা চিহ্নিত হিসাবে, আমি নিম্নলিখিত পরিস্থিতি ছিল

git symbolic-ref HEAD সঙ্গে ব্যর্থ fatal: ref HEAD is not a symbolic ref

যাহোক git rev-parse refs/heads/master যেখানে আমি পুনরুদ্ধার করতে পারি সেখান থেকে একটি ভাল প্রতিশ্রুতির দিকে ইঙ্গিত করা হয়েছিল (আমার ক্ষেত্রে সর্বশেষ প্রতিশ্রুতিবদ্ধ এবং আপনি ব্যবহার করে সেই প্রতিশ্রুতি দেখতে পারেনgit show [SHA]

এর পরে আমি অনেক অগোছালো কাজ করেছি, তবে যা ঠিক হয়েছে বলে মনে হচ্ছে তা ঠিক,

git symbolic-ref HEAD refs/heads/master

আর মাথাটা আবার সংযুক্ত!


1
ধন্যবাদ! আমার মাথা বিচ্ছিন্ন হয়ে গেছে। আমি এটি মাস্টারের কাছে ধরতে পারলাম তবে তারা কেবল একই প্রতিশ্রুতিতে ইশারা করে মাষ্টারের দিকে ইশারা করায় যা অঙ্গীকারকে নির্দেশ করেছিল। ভাল টিপ = ডি
র‌্যাজিংরোজভেল্ট

4

পরিবর্তে না git checkout origin/master

শুধু কর git checkout master

তারপরে git branchআপনার শাখাটি নিশ্চিত করবে।


4

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

git checkout master
git cherry-pick 99fe23ab

আমার চিন্তাভাবনা গেল: আমি বিচ্ছিন্ন মাথায় আছি, তবে আমি মাস্টার হতে চাই। আমার বিচ্ছিন্ন রাজ্যটি মাস্টারের থেকে খুব আলাদা নয়, যদি আমি আমার প্রতিশ্রুতিবদ্ধতার সাথে প্রয়োগ করতে পারি তবে আমি সেট হয়ে যাব। চেরি-পিকটি ঠিক এটিই করে।


3

আপনি যদি মাস্টার শীর্ষে কিছু কমিট করে থাকেন এবং কেবল masterসেখানে "পিছনের দিকে একত্রীকরণ" করতে চান (যেমন আপনি masterউল্লেখ করতে চান HEAD), তবে ওয়ান-লাইনারটি হ'ল:

git checkout -B master HEAD
  1. masterএটি ইতিমধ্যে বিদ্যমান থাকা সত্ত্বেও (যা চলার মতো) নামে একটি নতুন শাখা তৈরি করেmaster এবং আমরা )।
  2. সদ্য নির্মিত শাখাটি নির্দেশ করতে চলেছে HEAD আপনি যেখানে আছেন সেদিকে ।
  3. নতুন শাখাটি চেক আউট হয়ে গেছে, সুতরাং আপনি masterপরে রয়েছেন ।

আমি এটি সাব-রিপোজিটরিগুলির ক্ষেত্রে বিশেষত কার্যকর বলে মনে করেছি যা প্রায়শই বিচ্ছিন্ন অবস্থায় থাকে।


3

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

আপনার পরিবর্তনগুলি রাখা প্রয়োজন

  1. আপনাকে git checkout masterমাস্টার ব্রাঞ্চে ফিরিয়ে আনতে প্রথমে আপনার কমান্ড চালানো দরকার ।
  2. আপনার পরিবর্তনগুলি চালানোর দরকার হলে কেবল চালানো git checkout -b changesএবং git checkout -B master changes

আপনার পরিবর্তনগুলি প্রয়োজন না হলে

  1. আপনার শাখা চালনা থেকে সমস্ত তালিকার চিহ্নবিহীন ফাইলগুলি সরাতে git clean -df

  2. তারপরে আপনাকে আপনার সংগ্রহস্থলের মধ্যে থাকা সমস্ত অচিহ্নবদ্ধ পরিবর্তনগুলি সাফ করা দরকার। এটি করার জন্য আপনাকে দৌড়াতে হবেgit checkout --

  3. অবশেষে আপনাকে git checkout masterকমান্ড ব্যবহার করে আপনার শাখাটি মাস্টার শাখায় ফিরিয়ে দিতে হবে ।


3

আমার পক্ষে এটি আবার স্থানীয় শাখাটি মোছার মতোই সহজ ছিল, যেহেতু আমার কোনও স্থানীয় প্রতিশ্রুতি নেই যা আমি চাপ দিতে চাইছিলাম:

তাই আমি:

git branch -d branchname

এবং তারপরে আবার শাখাটি পরীক্ষা করে দেখুন:

git checkout branchname

1

আমি যখন ব্যক্তিগতভাবে নিজেকে এমন পরিস্থিতিতে দেখতে পাই যখন যখন দেখা যাচ্ছে যে আমি না থাকাকালীন আমি কিছু পরিবর্তন করেছি master(অর্থাত HEADউপরে উপরে বিচ্ছিন্ন masterএবং এর মধ্যে কোনও অঙ্গীকার নেই) স্ট্যাশিং সাহায্য করতে পারে:

git stash # HEAD has same content as master, but we are still not in master
git checkout master  # switch to master, okay because no changes and master
git stash apply  # apply changes we had between HEAD and master in the first place

1

সহজ কথায়, বিচ্ছিন্ন হেড রাষ্ট্রের অর্থ আপনাকে কোনও শাখার হেড (বা টিপ) এর বাইরে পরীক্ষা করা হয় না

একটি উদাহরণ সহ বুঝতে

বেশিরভাগ ক্ষেত্রে একটি শাখা হ'ল একাধিক কমিটের ক্রম:

প্রতিশ্রুতি 1: মাস্টার -> শাখা _EAD (123be6a76168aca712aea16076e971c23835f8ca)

প্রতিশ্রুতি 2: মাস্টার -> 123be6a76168aca712aea16076e971c23835f8ca -> শাখা_এইএডিএডি (100644a76168aca712aea16076e971c23835f8ca)

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

তাত্ত্বিক ব্যাখ্যা

এই ব্লগে এটি স্পষ্টভাবে উল্লেখ করছে যে গিট সংগ্রহস্থলটি একটি ট্রিট অফ কমিটস, প্রতিটি কমিট পয়েন্টার সহ পূর্বপুরুষের প্রতি নির্দেশ করে প্রতিটি আপডেট করা হয় এবং প্রতিটি শাখায় এই পয়েন্টারগুলি .git / রেফস সাব ডিরেক্টরিতে সংরক্ষণ করা হয়। ট্যাগগুলি .git / রেফ / ট্যাগগুলিতে সংরক্ষণ করা হয় এবং শাখাগুলি .git / রেফ / মস্তকগুলিতে সংরক্ষণ করা হয়। যদি আপনি যে কোনও ফাইলের দিকে তাকান, আপনি প্রতিটি ট্যাগটি একটি একক ফাইলের সাথে মিল পাবেন, যেখানে 40-অক্ষরের কমিট হ্যাশ রয়েছে এবং উপরে ক্রিস জনসন এবং @ ইয়ারোস্লাভ নিকিতেনকো ব্যাখ্যা করেছেন, আপনি এই রেফারেন্সগুলি পরীক্ষা করে দেখতে পারেন।


0

আমি সত্যিই মূর্খ অবস্থায় gotুকলাম, আমি সন্দেহ করি যে অন্য যে কেউ এটিকে দরকারী বলে মনে করবে .... তবে কেবল ক্ষেত্রে

git ls-remote origin
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        HEAD
6f96ad0f97ee832ee16007d865aac9af847c1ef6        refs/heads/HEAD
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        refs/heads/master

যা আমি শেষ পর্যন্ত ঠিক করেছিলাম

git push origin :HEAD

0

এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে:

1।git stash আপনার স্থানীয় পরিবর্তনগুলি সংরক্ষণ করুন

আপনি যদি পরিবর্তনগুলি বাতিল করতে চান
git clean -df
git checkout -- .
গিট ক্লিন সমস্ত অচিহ্নযুক্ত ফাইলগুলি সরিয়ে দেয় (সতর্কতা: এটি সরাসরি .gitignore এ উল্লিখিত উপেক্ষা করা ফাইলগুলি মুছবে না, তবে এটি ফোল্ডারে থাকা অবহেলিত ফাইলগুলি মুছে ফেলতে পারে) এবং গিট চেকআউট সমস্ত অনিচ্ছাকৃত পরিবর্তনগুলি সাফ করে দেয়।

২. git checkout masterপ্রধান শাখায় স্যুইচ করা (ধরে নিই যে আপনি মাস্টার ব্যবহার করতে চান)
৩. git pullমাস্টার শাখা থেকে শেষ প্রতিশ্রুতি টানা
৪. git statusসবকিছু দেখতে দুর্দান্ত দেখতে চেক করার জন্য

On branch master
Your branch is up-to-date with 'origin/master'.

0

আমার ক্ষেত্রে, আমি দৌড়ে এসেছি git statusএবং আমি দেখেছি যে আমার ওয়ার্কিং ডিরেক্টরিতে আমার হাতে থাকা কয়েকটি চিহ্নবিহীন ফাইল রয়েছে।

রিবেসটিকে কাজ করতে, আমাকে কেবল তাদের পরিষ্কার করতে হয়েছিল (যেহেতু আমার তাদের প্রয়োজন হয়নি)।


0

আপনি যদি ইগ্রিটটি Eclipse এ ব্যবহার করছেন : ধরে নিন আপনার মাস্টার আপনার প্রধান বিকাশ শাখা

  • আপনাকে একটি শাখায় পরিবর্তন করতে প্রতিশ্রুতিবদ্ধ করুন, সাধারণত একটি নতুন one
  • তারপরে রিমোট থেকে টানুন
  • তারপরে প্রকল্প নোডটিতে ডান ক্লিক করুন, দল নির্বাচন করুন এবং তারপরে ইতিহাস প্রদর্শন করুন
  • তারপরে মাস্টারে ডান ক্লিক করুন, চেক আউট নির্বাচন করুন
  • যদি Eclipse আপনাকে বলে, সেখানে দুটি স্থানীয় মাস্টার একজন স্থানীয় একটি রিমোট, রিমোটটি চয়ন করুন

এর পরে আপনি মূল-মাস্টারের সাথে পুনরায় যুক্ত হতে সক্ষম হওয়া উচিত।


-1

আমারও একই সমস্যা ছিল। আমি git stashস্থানীয় পরিবর্তনগুলিতে আমার পরিবর্তনগুলি কঠোরভাবে পূর্বাবস্থায় ফিরিয়ে আনলাম এবং আমি ভাবলাম যে এটি এর কারণ হয়েছিল) তখন একটি কাজ করেছিল git pullএবং আমি এখন মাথাটি আলাদা করে ফেলছি না। git stash applyআপনার পরিবর্তনগুলি আবার করতে ভুলবেন না।


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