ফাইল চেকআউট ছাড়াই গিট শাখা স্যুইচ করুন


105

গিটে সমস্ত ফাইল পরীক্ষা করে না দেখে অন্য শাখায় স্যুইচ করা কি সম্ভব?

শাখাটি স্যুইচ করার পরে আমার সমস্ত ফাইল মুছতে হবে, সেগুলি পুনরায় তৈরি করতে হবে, প্রতিশ্রুতিবদ্ধ করতে হবে এবং ফিরে যেতে হবে switch সুতরাং ফাইলগুলি পরীক্ষা করা কেবল সময়ের অপচয় (এবং এখানে প্রায় 14,000 ফাইল রয়েছে - এটি একটি দীর্ঘ ক্রিয়াকলাপ)।

সবকিছু পরিষ্কার করার জন্য:

গিটহাবে ডকুমেন্টেশন আপলোড করার জন্য আমার এই সমস্ত দরকার ।

আমার সাথে জিএইচ-পৃষ্ঠাগুলি শাখা রয়েছে os আমি যখন স্থানীয়ভাবে ডকুমেন্টেশন পুনর্নির্মাণ করি, তখন আমি এটিকে সংগ্রহস্থল ডিরেক্টরিতে অনুলিপি করি, প্রতিশ্রুতিবদ্ধ এবং গিটহাব-এ চাপি। তবে আমি খুশি হইনি, কারণ স্থানীয়ভাবে আমার কাছে দুটি কপি ডকুমেন্টেশন ছিল। এবং আমি একটি খালি শাখা তৈরি করার সিদ্ধান্ত নিয়েছি এবং প্রতিশ্রুতি দেওয়ার পরে, খালিটিতে স্যুইচ করুন এবং ফাইলগুলি মুছুন। তবে ফিরে স্যুইচ করা দীর্ঘ অপারেশন - তাই আমি এই প্রশ্নটি জিজ্ঞাসা করেছি।

আমি জানি যে আমি কেবল ঘো-পৃষ্ঠাগুলির শাখায় রেখে ফাইলগুলি মুছতে পারি, তবে আমি নোংরা কাজের গাছ পছন্দ করি না।


আপনার জন্য "দীর্ঘ" কত দিন? আপনি কোন প্লাটফর্মে কাজ করছেন? আপনি কি এনএফএস বা অন্যান্য ফাইল ভাগ করে নেওয়ার মতো কোনও নেটওয়ার্কের উপর কাজ করছেন?
গ্রেগ হিউগিল

এই মহড়ার উদ্দেশ্য কী? আপনি কি দুটি শাখা রাখতে চান, একটি বিশদ কমিটের সাথে একটি, দ্বিতীয় রেকর্ডিংয়ে কেবল বড় পরিবর্তনগুলি (মোটা-দানাযুক্ত)?
জাকুব নরবস্কি

আপনার ওয়ার্কিং কপির একটি অস্থায়ী (বা স্থায়ী?) ক্লোন তৈরি করা সস্তা। আমার সম্পর্কিত উত্তর এবং একটি লিখনআপ দেখায় যে এটি কীভাবে মূল সংগ্রহস্থলের উপ-ডিরেক্টরি হিসাবে কাজ করে।
krlMLr

উত্তর:


112

হ্যাঁ, আপনি এটা করতে পারেন।

git symbolic-ref HEAD refs/heads/otherbranch

আপনার যদি এই শাখায় প্রতিশ্রুতিবদ্ধ হওয়া দরকার হয় তবে আপনি সূচকটি পুনরায় সেট করতে চাইবেন অন্যথায় আপনি শেষ পরীক্ষিত শাখার উপর ভিত্তি করে কিছু প্রতিশ্রুতিবদ্ধ করবেন।

git reset

4
একটি শাখার পরিবর্তে রেফার দিকে নির্দেশ করতে echo "ebff34ffb665de0694872dceabe0edeaf50ec5a9" > .git/HEADঅনুসরণ করুন git reset
ক্যাডর্ন

4
সরাসরি হেড ফাইলে লিখতে কম নির্ভরযোগ্য। আপনি যদি একটি subdir হয়? বিচ্ছিন্ন মাথার জন্য (সরাসরি SHA1 এর দিকে ইঙ্গিত করছে), এটি চেষ্টা করে দেখুন: git update-ref HEAD refs/heads/otherbranch
আলেকজান্ডার বার্ড

4
আপনি যদি বর্তমান শাখা থেকে একটি নতুন শাখায় যাচাই করতে চান, তবে git stashgit checkout -b otherBranchgit stash pop
এটির

@ অ্যালেক্সান্ডারবার্ড: git update-refদরকারী, তবে এটি বর্তমান শাখার ডগাও সরিয়ে নিয়েছে।
টমেকিবি

47

বেসিক গিট কমান্ডগুলি কেবল ব্যবহার করে:

এই উত্তরটি চার্লসের চেয়ে কিছুটা দীর্ঘ, তবে এটি কেবলমাত্র বেসিক গিট কমান্ডগুলির সমন্বয়ে গঠিত যা আমি বুঝতে পারি এবং এইভাবে মনে রাখতে পারি, এটি সন্ধানের প্রয়োজনটিকে অপসারণ করে।

আপনার বর্তমান অবস্থান চিহ্নিত করুন (প্রয়োজনে প্রথমে প্রতিশ্রুতি দিন):

git checkout -b temp

কাজের দির পরিবর্তন না করে চিহ্নিতকারীটিকে অন্য শাখায় পুনরায় সেট করুন (চালনা) করুন:

git reset <branch where you want to go>

এখন অস্থায়ী এবং অন্যান্য শাখা একই প্রতিশ্রুতিবদ্ধ দিকে নির্দেশ করে এবং আপনার কার্যনির্বাহী দিরটি আঁচল থাকে।

git checkout <branch where you want to go>

যেহেতু আপনার হেড ইতিমধ্যে একই প্রতিশ্রুতিবদ্ধ দিকে ইঙ্গিত করছে, তাই কাজ করার দির স্পর্শ করা যায় না

git branch -d temp

মনে রাখবেন যে এই আদেশগুলি যে কোনও গ্রাফিকাল ক্লায়েন্ট থেকে সহজেই উপলব্ধ।


7
আমি git reset --soft <branch where you want to go>সূচকটি আপডেট করা এড়াতে পছন্দ করব
জোয়েলফ্যান

7
গিট প্লাম্বিং কমান্ডগুলি এড়িয়ে চীনামাটির বাসনগুলি সমর্থন করার বিষয়ে আপনার কৌশলটির সাথে আমি সম্মত।
ব্যবহারকারী 64141

28

V2.24 git switchএ একটি নিরাপদ জাতীয় কিছু git checkout
সুতরাং আমি "কর্মক্ষেত্র পরিবর্তন না করে শাখায় হপ" করার git hopজন্য নীচের নামটির নামকরণ করেছি

পাঠকের সুবিধার জন্য:

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

git checkout --detach
git reset --soft commitish
git checkout commitish

ব্যাখ্যা:

  • git checkout --detachএটি একই git checkout HEAD^{}যা বর্তমান শাখাটি পিছনে ফেলে "বিচ্ছিন্ন মাথা অবস্থানে" চলে যায়। সুতরাং আর পরবর্তী পরিবর্তনটি HEADকোনও শাখাকে প্রভাবিত করে না। বিচ্ছিন্নHEAD worktree না সূচক প্রভাবিত করে না।
  • git reset --soft commitishতারপরে HEADপ্রদত্ত এসএএএ- তে স্থানান্তরিত হয় commitish। আপনি যদি সূচকটি আপডেট করতে চান তবে খুব --softদূরে চলে যান, তবে আমি এটি করার পরামর্শ দিই না। এটি আবারও ওয়ার্কট্রিটিকে স্পর্শ করে না এবং ( --soft) সূচকটিও নয়।
  • git checkout commitishতারপরে আবার HEADপ্রদত্ত commitish(শাখায়) সংযুক্ত করুন । (যদি commitishকোনও এসএএএ হয় তবে কিছুই হয় না)) এটিও সূচক এবং ওয়ার্কট্রিগুলিকে প্রভাবিত করে না।

এই সমাধানটি প্রতিশ্রুতিবদ্ধকে নির্দেশ করে এমন সমস্ত কিছু গ্রহণ করে, তাই এটি কারও পক্ষে আদর্শ git উপাধির । দ্যrev-parseনিচে যেমন যে টাইপস ঘটনাক্রমে বিচ্ছিন্ন মাথা দশায় সুইচ না (ত্রুটি পুনরুদ্ধারের পথ আরো জটিল হবে) নিশ্চিত করতে আপনাকে মাত্র একটা পরীক্ষা, শৃঙ্খল কিছুই বিরতি হয়।

এটি নিম্নলিখিত git hop treeishউপন্যাস বাড়ে :

git config --global alias.hop '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'

এফওয়াইআই, আপনি এটি আমার gitএলিয়াসগুলির তালিকায় খুঁজে পেতে পারেন ।


আপনি কি এর $@চেয়ে বেশি ব্যবহার করতে চান না $*? পার্থক্যটি হ'ল $ @ উদ্ধৃত যুক্তিগুলি প্রসারিত না করে, যার ভিতরে ফাঁকা স্থান রয়েছে।
KYB

4
@kyb ফাংশন কৌশলটি অন্য এসও উত্তর থেকে চুরি করা হয়েছে । এবং $@এখানে অবশ্যই বোঝানো হয় না। $*পরিবর্তে ব্যবহৃত হয় $1, এটি ত্রুটি হওয়া উচিত git switch -f bহিসাবে একই হয় git switch '-f b'। এইভাবে আমি কিছু ত্রুটি পরিচালনা করে যেমন ওরফে সংক্ষিপ্ত করতে পারি!f() { [ 1 = $# ] || { echo 'WTF!'; return 1; }; ..
টিনো

খুব ভাল সমাধান। বিশেষত, এটি দূরবর্তী শাখাগুলির জন্য ব্যবহার করা যেতে পারে!
নিলস-ও-মাদুর

14

একটি ভাণ্ডার সহ দুটি কার্যনির্বাহী ডিরেক্টরি (দু'টি কার্যক্ষেত্র), এমনকি দু'টি সংগ্রহস্থল রাখার চেয়ে ভাল সমাধানটি কী হবে না?

নেই Git-নতুন-workdir এই সরঞ্জামটি contrib/অধ্যায় এই সঙ্গে আপনাকে সাহায্য করার জন্য।


গিট-নতুন-ওয়ার্কডির কি গিটের নিজস্ব ওয়ার্কট্রি কমান্ডের মতো? আমি যখন ওয়ার্কট্রি ব্যবহার করি তখন যখন আমি একটি শাখাকে অন্য ফোল্ডারে চেকআউট করতে চাই (পুরো রেপো ক্লোন না করে)।
রিউউ

git-new-worktreeস্ক্রিপ্ট চেয়েও পুরনো git worktreesubcommand; উত্তর লিখিত হওয়ার সময় এই আদেশটি উপলব্ধ ছিল না। উদাহরণস্বরূপ স্ক্রিপ্টটির জন্য সিমলিংক সমর্থন প্রয়োজন; আইএমএইচও এটি দেশীয় সমর্থন ব্যবহার করা ভাল।
জাকুব নরবস্কি

8

আমি মনে করি আপনি নদীর গভীরতানির্ণয় কমান্ড সন্ধান করছেন git read-tree। এটি সূচক আপডেট করবে কিন্তু আপনার কার্যকারী ডিরেক্টরিতে কোনও ফাইল আপডেট করবে না। উদাহরণস্বরূপ, ধরে নেওয়াbranch নেওয়া শাখাটি পড়ার নাম:

গিট রিড-ট্রি শাখা

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

গিট প্রতীকী-রেফ হেড রেফ / মাথা / শাখা

কোন আমি শুধু সুইচ শাখা করতে হবে, অন্য কোন পরিবর্তনগুলি এখন - তাই প্রতীকী-সুত্র ভাল যথেষ্ট
স্পর্শ

read-treeত্রুটিটি উত্পন্ন করে: fatal: Not a valid object name branchযদি git switch branchএখনও কিছুই না থাকে
অ্যান্ড্রি

7

আপনি আলাদা আলাদা শাখার নাম দিয়ে আপনার হেড ফাইলটি ওভাররাইট করতে পারেন:

প্রতিধ্বনি "রেফ: রেফ / হেডস / মায়োথরঞ্চ"> .গিট / হেড


13
আপনার জন্য এটি করার জন্য প্রতীকী-রেফ কমান্ডটি ব্যবহার করা সম্ভবত আরও ভাল: git symbolic-ref HEAD refs/heads/MyOtherBranch কার্নেল.আর
গ্রেগ

@ গ্রেগ হিউগিল, এইই একমাত্র উপায় যা আমি জেনেছি যে হেডকে কমিট হ্যাশে স্থানান্তরিত করতে। আপনি কি সঙ্গে এটি করতে পারেন git symbolic-ref?
টমেকিবি

0

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


আপনি এর git-new-worktreeপরিবর্তে (ইন contrib/) এর জন্য ব্যবহার করতে পারেন
জাকুব নারাবস্কি

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

0

যদি আপনি কেবল কোনও দূরবর্তী শাখা নির্দেশ করে যেখানে পরিবর্তনের চেষ্টা করছেন, আপনি নিজের স্থানীয় অনুলিপিটি স্পর্শ না করেই "গিট পুশ" দিয়ে এটি করতে পারেন।

http://kernel.org/pub/software/scm/git/docs/git-push.html

<refspec> প্যারামিটারের ফর্ম্যাটটি হ'ল optionচ্ছিক প্লাস +, উত্স রেফ <src> এর পরে, পরে একটি কোলন: এবং গন্তব্য রেফ <dst> অনুসরণ করে। দূরবর্তী সংগ্রহস্থলের <src> অবজেক্ট <dst> রেফারেন্সটি কী আপডেট করতে হবে তা নির্দিষ্ট করতে এটি ব্যবহার করা হয়।

উদাহরণস্বরূপ, c5f7eba প্রতিশ্রুতিবদ্ধ foo আপডেট করার জন্য নিম্নলিখিত করুন:

git push origin c5f7eba:foo

আপনি কি পরে ছিলেন কি না তা নিশ্চিত নয়।


প্রশ্নের ইতিমধ্যে একটি উত্তর পেয়েছে: স্ট্যাকওভারফ্লো.com
টাইগ

0

আপনি ব্যবহার করতে পারেন

      1. git checkout -f <new-branch>
      2. git cherry-pick -x <previous-branch-commit-id>

পূর্ববর্তী-শাখা-কমিট-আইডি হল সেই প্রতিশ্রুতি যেখানে আপনি পুরানো ডেটা অনুলিপি করতে চান।


0

অথবা আপনার অন্য ব্র্যাঞ্চ থেকে আপনার মাস্টারের কাছে প্যাচ করতে কেবল কোনও প্যাচ ফাইল ব্যবহার করুন

git diff otherbranch master > ~/tmp/otherbranch.diff
git checkout master
git apply ~/tmp/otherbranch.diff

-1

বলুন যে আপনি শাখা A তে থাকতে চান তবে শাখা বি থেকে প্রাপ্ত ফাইলগুলি দিয়ে

গিট লগ সহ শাখা A এর বর্তমান কমিট রেফটি সন্ধান করুন, যেমন "99ce9a2",

git checkout A
git reset --hard B
git reset 99ce9a2

আপনার এখন বি এর সাথে সম্পর্কিত ফোল্ডার কাঠামো সহ একটি শাখা A তে থাকা উচিত যা অচিহ্নবদ্ধ পরিবর্তন হিসাবে প্রদর্শিত হয় (ইতিহাসের কোনও পরিবর্তন হয়নি)।

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