চেকআউট ছাড়াই শাখা পয়েন্টারটিকে বিভিন্ন প্রতিশ্রুতিতে সরান


759

একটি পরীক্ষিত শাখার শাখা পয়েন্টার স্থানান্তর করতে, git reset --hardকমান্ডটি ব্যবহার করতে পারেন । তবে কীভাবে একটি নন-চেকড আউট শাখার শাখা পয়েন্টারকে কোনও ভিন্ন প্রতিশ্রুতিতে স্থানান্তরিত করবেন (ট্র্যাকড দূরবর্তী শাখার মতো অন্যান্য সমস্ত জিনিস রেখে)?


11
আপনি যে যা করতে চেয়েছিলেন তা হ'ল এখন থেকে তৈরি করা ব্যবস্থার চেয়ে আলাদা কমিটের একটি শাখা। যদি আমার বোধগম্যতা সঠিক হয়, তবে আপনি git branch <branch-name> <SHA-1-of-the-commit>পুরানো শাখাটি ব্যবহার এবং ডাম্প থেকে এটি তৈরি করতে চান এমন প্রতিশ্রুতি থেকে আপনি কেন কেবল নতুন শাখা তৈরি করবেন না ?
ইয়াসৌসার

6
@ আইসাউসার - আমি নিশ্চিত নই যে "মাস্টার" শাখা ডাম্পিং করা ভাল ধারণা।
বুলভারসেটার

উত্তর:


578

আপনি এটি স্বেচ্ছাচারী রেফারেন্সের জন্য করতে পারেন। এইভাবে একটি শাখা পয়েন্টারটি সরানো যায়:

git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>

সাধারণ ফর্ম:

git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>

আপনি যদি পছন্দ করেন তবে আপনি রিফলগ বার্তাটি সম্পর্কে নিট বাছাই করতে পারেন - আমি বিশ্বাস করি যে এটির চেয়ে branch -fএকটি আলাদা reset --hardএবং এটি ঠিক তেমন একটিও নয়।


39
বার্তাটি কোথায় ভাল? এটি কোথায় সংরক্ষণ করা হয় এবং কীভাবে এটি পরে পড়তে হয়?
মোট

4
দ্রষ্টব্য: এটি খালি সংগ্রহস্থলগুলিতে কাজ করে না। খালি সংগ্রহস্থলগুলিতে, আপনাকে শাখা আপডেট করতে 'গিট শাখা-মাস্টার <কমিট>' ব্যবহার করতে হবে (নীচের উত্তরটি দেখুন)।
জুন রোডস

37
যদি আমার মতো আপনিও দুর্ঘটনাক্রমে রেফস / হেডস </ ফ্রেঞ্চ> এর পরিবর্তে <ব্র্যাঙ্ক> ব্যবহার করেন তবে আপনি .git / <ব্র্যাঙ্ক> এ আপনার .git ডিরেক্টরিতে একটি নতুন ফাইলটি শেষ করবেন এবং আপনি এই জাতীয় বার্তা পাবেন like আপনি যখন এটির সাথে কাজ করার চেষ্টা করবেন তখন "পুনঃনামকরণ 'মাস্টার' দ্ব্যর্থক"। আপনি ঠিক করতে আপনার .git ডিরেক্টরি থেকে ফাইলটি মুছতে পারেন।
ডেভিড মাইনর

34
এটি সন্তুষ্ট করার জন্য ব্যাখ্যা করা হয়নি যে কেন এটি এর চেয়ে ভাল git branch -f। নির্দিষ্ট করে বললে, এই পদ্ধতিটি দেখা যাচ্ছে: (ক) ব্যবহার করা আরও শক্ত (বি) মনে রাখা আরও কঠিন এবং (সি) আরও বিপজ্জনক
স্টিভেন লু

10
"স্বেচ্ছাসেবী রেফার্স বলতে যা বোঝায়" - শাখাগুলি কেবল প্রতিশ্রুতিবদ্ধ এমন একধরণের রেফ নয়। ট্যাগ রয়েছে, এবং আপনি নিজেরাই রেফারেস / whetvs / myref শৈলী নিজেকে রিফগুলি তৈরি করতে পারেন যা শাখা বা ট্যাগ নয়। আমি বিশ্বাস করি যে এটি "আরও ভাল" হতে পারে সে সম্পর্কে স্টিভেন লুয়ের প্রশ্নেরও জবাব দেয়। আমি শাখার সাথে সম্মত-f আপনি শাখা নিয়ে কাজ করা সবচেয়ে সহজ।
আদম

962
git branch -f <branch-name> <new-tip-commit>

24
বা যথেচ্ছ রেফার্সের জন্য git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>,। (- আমি বিশ্বাস করি আপনি যদি মত reflog বার্তা সম্পর্কে নিটে বাছাই করতে পারেন branch -fএক থেকে ভিন্ন reset --hardএক, এবং এই ঠিক হয় তাদের নয়।)
Cascabel

4
জেফ্রমি, দয়া করে একটি পৃথক উত্তর লিখুন যাতে আপনি ভোট পেতে পারেন। :)
মোট

16
এটি একটি ভাল উত্তর যেহেতু এটি 99% কেস পরিচালনা করে এবং প্রকৃতপক্ষে ডকুমেন্টেশনের সাথে মানায়। git help branch"-ফ, --ফোর্স <ব্র্যাঙ্কনাম> <স্টার্টপয়েন্ট" তে রিসেট করুন <ব্র্যাঙ্কনাম> যদি ইতিমধ্যে বিদ্যমান থাকে তবে -f গিট শাখা একটি বিদ্যমান শাখা পরিবর্তন করতে অস্বীকার করে। "
অ্যালেক্সচাফি

12
আমি করছি git branch -f master <hash>এবং এটি আমাকে বলছে fatal: Cannot force update the current branch.উম্মম্মে আমাকে এখনই কি করতে হবে, এই কমান্ডটি ব্যবহারের অনুমতি দেওয়ার আগে আমাকে অন্য কোনও এলোমেলো শাখা পরীক্ষা করে দেখুন?
কিওয়ার্টি

20
আপনি যে শাখাটি সরানোর চেষ্টা করছেন তা যদি আপনার বর্তমান শাখা হয় ( HEADএটিতে নির্দেশ করা হয়) এটি কাজ করবে না ।
ভ্লাদিমির পানতেলিভ

135

আপনি git reset --hardএকটি কমিট রেফারেন্সও পাস করতে পারেন ।

উদাহরণ স্বরূপ:

git checkout branch-name
git reset --hard new-tip-commit

আমি দেখতে পাই যে আমি প্রায় আধা ঘন ঘন এমন কিছু করি:

এই ইতিহাস ধরে নিচ্ছি

$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master

# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff

# Ditch that commit on this branch
$ git reset --hard HEAD^

# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master

এটি শাখার টিপকে সময়মতো ফিরিয়ে আনার জন্য সাধারণত হ'ড বা হেড uses ব্যবহার করে এর মধ্যে সর্বাধিক ধারণা তৈরি হয়। সুতরাং এটি এগিয়ে প্রতিশ্রুতি নির্দিষ্ট করতে সামঞ্জস্যপূর্ণ।
justingordon

11
আপনার কার্যকারী গাছটি যদি পরিষ্কার থাকে তবে এটি ঠিক আছে। আপনার যদি প্রচুর পর্যায়ক্রমে বা স্টেস্টেড পরিবর্তন না থেকে থাকে তবে git update-refউপরের আলোচনা অনুযায়ী এটি করা ভাল ।
একটি প্রদত্ত নার্দ

16
আপনি কি লক্ষ্য করেছেন যে আপনার "উত্তর" এমন কিছু যুক্ত করে না যা ইতিমধ্যে প্রশ্নের অংশ নয় ?? - ওপি বলেছেন: এটি যদি চেক আউট করা হয় ... আপনি git reset --hard ...এখানে এটি পুনরাবৃত্তি করার প্রয়োজন নেই! :-(
রবার্ট সিমার

6
@ রবার্ট: আমি একমত নই প্রশ্নটি কীভাবে এটি ব্যবহার করবে এবং এটি করে তা বলেনি । কীভাবে সন্ধান করতে হবে তা না ভাল লাগছিল।
উইলসন এফ

7
@ উইলসনএফ, এখানে এটি খুঁজে পাওয়া আপনার পক্ষে ভাল লাগছিল তবে এটি প্রশ্নের উত্তর দিচ্ছে না মোটেই। হতে পারে এটি অন্য কোনও প্রশ্নের উত্তর, তবে এখানে এটি ভুল
রবার্ট সিমার

52

কেবল আলোচনাটিকে সমৃদ্ধ করার জন্য, আপনি যদি myBranchশাখাটি আপনার বর্তমান প্রতিশ্রুতিতে স্থানান্তর করতে চান তবে দ্বিতীয় যুক্তির পরে বাদ দিন-f

উদাহরণ:

git branch -f myBranch


rebaseবিচ্ছিন্নভাবে মাথা অবস্থায় থাকাকালীন আমি সাধারণত এটি করি :)


13

ইন gitk --all:

  • আপনি চান প্রতিশ্রুতি উপর ডান ক্লিক করুন
  • -> নতুন শাখা তৈরি করুন
  • একটি বিদ্যমান শাখার নাম লিখুন
  • সেই ডায়লগটিতে রিটার্ন টিপুন যা সেই নামের পুরানো শাখাটি প্রতিস্থাপনের বিষয়টি নিশ্চিত করে

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

gitkডায়লগ বাক্সে 3 টি বিকল্প রয়েছে এমন বৈশিষ্ট্য উপস্থিত থাকলে এটি দুর্দান্ত হবে : ওভাররাইট, বিদ্যমান পরিবর্তন করুন বা বাতিল করুন।


এমনকি যদি আপনি সাধারণত আমার মতো কমান্ড-লাইন জাঙ্কি হন git guiএবং gitkতারা অনুমতি দেয় এমন গিট ব্যবহারের উপসেটের জন্য বেশ সুন্দরভাবে ডিজাইন করেছেন। আমি কীভাবে তারা ভাল সেগুলির জন্য তাদের ব্যবহার করার পরামর্শ দিচ্ছি (উদাহরণস্বরূপ গিট গুইয়ের মধ্যে সূচকগুলির বাইরে বাছাই করা মজাদারদের মঞ্চস্থ করা, এবং কেবল প্রতিশ্রুতিবদ্ধ। ।)

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

আমার কাছে কোনও গ্রাফিকাল ফাইল ব্রাউজার খোলা নেই তবে আমি গিটক / গিট গুই পছন্দ করি।


1
খুব সহজ! আমি সবেমাত্র গিটগ থেকে গিটকে রূপান্তর করেছি।
মাইকেল কোল

এই ভাবে তবে ট্র্যাকিং শাখার তথ্য হারিয়ে গেছে।
এমবিদেপল

@ এমএমদেবপিএল: আমি আসলে গিট বিশেষজ্ঞ নই। আমি মনে করি আপনি কী বলতে চাইছেন তা আমি বুঝতে পেরেছি তবে এর অর্থগুলি নয়। আমি এটি প্রায়শই ব্যবহার করেছি, এবং এখনও এই শাখাগুলি দূরবর্তী অঞ্চলে একই নামের শাখাগুলিতে ঠেলাতে সক্ষম হয়েছি। একটি শাখা এবং এর দূরবর্তী ট্র্যাকিং শাখার মধ্যে সমিতি আপনার জন্য কী করে?
পিটার কর্ডেস


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

7

প্রস্তাবিত সমাধানgit branch -f branch-pointer-to-move new-pointer মধ্যে TortoiseGit :

  • "গিট শো লগ"
  • "সমস্ত শাখা" চেক করুন
  • লাইনে আপনি শাখা পয়েন্টারটি (নতুন পয়েন্টার) এ যেতে চান:
    • ডান ক্লিক করুন, "এই সংস্করণে শাখা তৈরি করুন"
    • "শাখা" এর পাশে, স্থানান্তর করতে শাখার নাম লিখুন (শাখা-পয়েন্টার-থেকে-সরানো)
    • "বেস অন" এর অধীনে, পরীক্ষা করুন যে নতুন পয়েন্টারটি সঠিক কিনা
    • "ফোর্স" পরীক্ষা করুন
    • ঠিক আছে

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


4

সত্যিই, আমি আশ্চর্য হয়েছি কীভাবে git pushআদেশটি সম্পর্কে কেউ ভাবেননি :

git push -f . <destination>:<branch>

বিন্দু (।) স্থানীয় সংগ্রহস্থলকে বোঝায় এবং আপনার জন্য -f বিকল্পের প্রয়োজন হতে পারে কারণ গন্তব্যটি "এর দূরবর্তী অংশের পিছনে" থাকতে পারে ।

যদিও এই কমান্ডটি আপনার সার্ভারে আপনার পরিবর্তনগুলি সংরক্ষণ করার জন্য ব্যবহৃত হয়, ফলাফলটি হ'ল দূরবর্তী শাখাকে ( <branch>) স্থানীয় শাখার ( <destination>) হিসাবে একই প্রতিশ্রুতিতে স্থানান্তরিত করার মতো is


এছাড়াও আপনি ছাড়া এই কাজ করতে পারেন -fএড়ানোর clobbering কিছু স্থানীয় করা; উদাহরণস্বরূপ, git fetch origin && git push . origin/develop:developgit checkout develop && git pull --ff-only
19 -45

1

ফাইলটি খুলুন .git/refs/heads/<your_branch_name>এবং সেখানে সঞ্চিত হ্যাশটিকে সেখানে পরিবর্তন করুন যেখানে আপনি নিজের শাখার মাথা সরাতে চান। যে কোনও পাঠ্য সম্পাদক দিয়ে ফাইলটি সম্পাদনা এবং সংরক্ষণ করুন edit কেবলমাত্র নিশ্চিত হয়ে নিন যে সংশোধন করার শাখাটি এখনকার সক্রিয় নয়।

দাবি অস্বীকার: সম্ভবত এটি করার পরামর্শ দেওয়া উপায় নয়, তবে কাজটি হয়ে যায়।


1
এটি নিশ্চিত করার জন্য এটি বিশৃঙ্খলা বা খারাপ উপায় কিনা। 🤔 😉
কিথ রাসেল

@ কিথারসেল উভয়ই হতে পারে: পি
গিলারমো

0

আপনি যে প্রতিশ্রুতিটি উল্লেখ করতে চান তা বর্তমান শাখার আগে (যা বর্তমান শাখার শেষ কমিটিগুলি পূর্বাবস্থায় ফিরিয়ে না নিতে চাইলে এমন হওয়া উচিত) আপনি কেবল তা করতে পারেন:

git merge <commit>

শাখাটি চেক আউট না করা হলে কী করা উচিত সে সম্পর্কে প্রশ্ন করা হয়েছিল।
কিথ রাসেল

ওফফ, আমি এই পয়েন্টটি মিস করেছি। সেক্ষেত্রে আপনি git push . <commit>:<branch>ইতিমধ্যে প্রস্তাবিত হিসাবে করতে পারেন ।
জিন পল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.