মূল সংস্করণে গিট শাখাটি পুনরায় সেট করা দরকার


440

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



গীত 2.23 (আগস্ট 2019) ঃ git switch -C mybranch origin/mybranch। দেখুন নীচের আমার সম্পাদিত উত্তর
VonC

উত্তর:


814

আপনি যদি এখনও উত্সে ঠেলাঠেলি না করেন তবে আপনি নিজের শাখাটি প্রবাহের শাখায় পুনরায় সেট করতে পারেন :

git checkout mybranch
git reset --hard origin/mybranch

(নিশ্চিত হয়ে নিন যে আপনি আপনার সাম্প্রতিক প্রতিশ্রুতি একটি পৃথক শাখায় উল্লেখ করেছেন যেমন আপনি আপনার প্রশ্নের মধ্যে উল্লেখ করেছেন)

মনে রাখবেন যে রিসেটের ঠিক পরে, রিসেটের mybranch@{1}আগে পুরানো প্রতিশ্রুতি বোঝায়।

তবে আপনি যদি ইতিমধ্যে ধাক্কা দিয়ে থাকেন তবে অন্যান্য বিকল্পগুলির জন্য " গিট শাখা তৈরি করুন এবং মূলটিকে মূল প্রবাহে ফিরিয়ে দিন " দেখুন।


সঙ্গে গীত 2.23 (আগস্ট 2019) , যে এক কমান্ড হবে: git switch
যথা:git switch -C mybranch origin/mybranch

উদাহরণ

C:\Users\vonc\git\git>git switch -C master origin/master
Reset branch 'master'
Branch 'master' set up to track remote branch 'master' from 'origin'.
Your branch is up to date with 'origin/master'.

যা সূচক এবং কার্যকারী গাছকে পুনরায় ফিরিয়ে git reset --hardআনবে , একটি ইচ্ছার মতো ।


দ্বারা মন্তব্য হিসেবে ব্র্যাড হারমান , একটি reset --hardহবে কোনো নতুন ফাইল অপসারণ বা মাথা থেকে পরিবর্তিত ফাইলটির জন্য রিসেট

প্রকৃতপক্ষে, আপনি কোনও "ক্লিন স্লেট" থেকে শুরু করেছেন তা নিশ্চিত git clean -f -dহওয়ার জন্য, পুনরায় সেট করার পরে আপনি কেবল যে শাখায় পুনরায় সেট করেছেন তার ঠিক একই রকম একটি কাজ করা গাছকে নিশ্চিত করবে ।


এই ব্লগ পোস্টটি সেই উপনামগুলির পরামর্শ দেয় ( masterকেবল শাখার জন্য , তবে আপনি সেগুলি মানিয়ে নিতে / প্রসারিত করতে পারেন):

[alias]
   resetorigin = !git fetch origin && git reset --hard origin/master && git clean -f -d
   resetupstream = !git fetch upstream && git reset --hard upstream/master && git clean -f -d

তারপরে আপনি টাইপ করতে পারেন:

git resetupstream

অথবা

git resetorigin

26
এটি আনস্ট্যাগড / স্ট্যাজেড পরিবর্তনগুলি (- থেকে থেকে) মুছে ফেলবে
পিটার

5
আমি git reset --hard origin/mybranchযখন স্থানীয় কোনও পরিবর্তন সম্পর্কে চিন্তা না করতাম এবং মূলটির সাথে মেলে এমন একটি পরিষ্কার কপি চাইতাম তখন আমি কয়েকবার কমান্ডটি ব্যবহার করেছি used যাইহোক, আজ এটি কার্যকর হয়নি - আমার কাছে এখনও কয়েক মুঠো নতুন, অচিহ্নবদ্ধ ফাইল রয়েছে এবং গিট আমাকে প্রতিশ্রুতি দিয়েছিল যে এটি হেডে রয়েছে। নোটটি git clean -f -dস্থির করে দিয়েছে যে আমি চাইনি এমন সমস্ত নতুন ফাইল মুছে ফেলা হয়েছে।
ম্যাথিউ ক্লার্ক

@MatthewClark যে আশা করা হচ্ছে: মন্তব্য দেখুন stackoverflow.com/q/4327708/6309
VonC

1
গ্রেট! এছাড়াও অনেকবার আমি git reset --hard HEADকোনও পরিবর্তনকে উপেক্ষা করে পূর্বের প্রতিশ্রুতিতে ফিরে যেতে ব্যবহার করেছি
daronwolff

এটিও কি টুকরা দিয়ে সম্ভব?
লোনজাক

20

ধরে নেওয়া এই যা ঘটেছিল:

# on branch master
vi buggy.py                 # you edit file
git add buggy.py            # stage file
git commit -m "Fix the bug" # commit
vi tests.py                 # edit another file but do not commit yet

তারপরে আপনি বুঝতে পারবেন যে আপনি ভুল শাখায় পরিবর্তন করেছেন।

git checkout -b mybranch    # you create the correct branch and switch to it

কিন্তু masterএখনও আপনার কমিট স্থানটিকে চিহ্নিত করে। আপনি এটি ইঙ্গিত করতে চান যেখানে এটি আগে নির্দেশ করেছেন।

সমাধান

সবচেয়ে সহজ উপায়:

git branch --force master origin/master

আরেকটি উপায় হ'ল:

git checkout master
git reset --soft origin/master
git checkout mybranch

নোট করুন যে ব্যবহারের reset --hardফলে আপনার নিবন্ধিত পরিবর্তনগুলি হারাতে হবে ( tests.pyআমার উদাহরণে)।


এটি আমার উত্তরের চেয়ে নিরাপদ বলে মনে হচ্ছে;) +1
ভোনসি

8

আমার একটি সার্ভারে একটি বেসরকারী রেপো রয়েছে এবং এটিতে নিয়মিত পুনরায় চাপ / বল-চাপ দিন, যা প্রায়শই আমার অন্যান্য কম্পিউটারে স্থানীয় শাখাটি পুনরায় সেট করা প্রয়োজন করে makes অতএব আমি নিম্নলিখিত উপনামটি "ক্যাচআপ" তৈরি করেছি, যা বর্তমান শাখার জন্য এটি করার অনুমতি দেয়। অন্যান্য উত্তরের মতো এই উরফে কোনও হার্ডকোডযুক্ত শাখার নাম নেই।

শক্ত করে ধর.

[alias]
  catchup = "!f(){ echo -n \"reset \\033[0;33m$(git symbolic-ref -q --short HEAD)\\033[0m to \\033[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))\\033[0m? (Y/n) \"; read -r ans; if [ \"$ans\" = \"y\" -o \"$ans\" = \"Y\" -o -z \"$ans\" ]; then git reset --hard $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)); else echo \"catchup aborted\"; fi }; f"

যথাযথভাবে ফর্ম্যাট করা (.gitconfig এ নতুন লাইনের সাথে কাজ করবে না) এটি দেখতে এরকম দেখাচ্ছে:

"
!f(){
  echo -n \"reset \\033[0;33m$(git symbolic-ref -q --short HEAD)\\033[0m to \\033[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))\\033[0m? (Y/n) \";
  read -r ans;
  if [ \"$ans\" = \"y\" -o \"$ans\" = \"Y\" -o -z \"$ans\" ]; then
    git reset --hard $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD));
  else
    echo \"catchup aborted\";
  fi
}; f
"
  • \\033[0;33mএবং\\033[0m রঙ দিয়ে বর্তমান শাখা ও মূল প্রজেক্টের উপর জোর জন্য।
  • $(git symbolic-ref -q --short HEAD) বর্তমান শাখার নাম
  • $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)) বর্তমান শাখার উজান।

যেহেতু পুনরায় সেট করা একটি সম্ভাব্য বিপজ্জনক কল (বিশেষত - বিকল্প বিকল্পের সাহায্যে আপনি কোনও আপত্তিহীন পরিবর্তন হারাবেন), এটি প্রথমে আপনাকে বলছে এটি কী করতে চলেছে। উদাহরণস্বরূপ, যদি আপনি রিমোট কলযুক্ত Qcpp / dev- ধারক সহ শাখা দেব- ধারকটিতে থাকেন এবং আপনি প্রবেশ করেন git catchup, আপনাকে অনুরোধ করা হবে:

ডেভ-কন্টেইনারটি কিউসিপি / ডেভ-ধারকটিতে পুনরায় সেট করবেন? (ওয়াই / ঢ)

এরপরে আপনি যদি y টাইপ করেন বা কেবল রিটার্ন হিট করেন তবে এটি পুনরায় সেট করে। আপনি অন্য কিছু প্রবেশ করলে রিসেটটি সম্পন্ন হবে না।

আপনি যদি সুপার নিরাপদে থাকতে চান এবং প্রোগ্রামগতভাবে অযৌক্তিক / অনির্ধারিত পরিবর্তনগুলি হারাতে বাধা দিতে চান তবে আপনি উপরের উপসর্গটি ডিফ -ইনডেক্সের চেক অনুসারে আরও চালিত করতে পারেন

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


1

আমি এটি চেষ্টা করেছিলাম এবং এটি আমার বর্তমান শাখাটি আমার দূরবর্তী গিথুবকে সর্বশেষে পুনরায় সেট করে নি। আমি গুগল করে খুঁজে পেয়েছি https://itsyndicate.org/blog/how-to-use-git-force-pull-properly/

যা প্রস্তাবিত

git fetch origin master
git reset --hard origin/master

আমি আমার ভি 8 শাখাটি পুনরায় সেট করতে চেয়েছিলাম তাই করেছিলাম

git fetch origin v8
git reset --hard origin/v8

এবং এটা কাজ করে


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