গিট স্ট্যাশ থেকে আমি কীভাবে একটি একক ফাইল (বা কোনও ফাইলে পরিবর্তন) আনব?


772

স্ট্যাশ চেঞ্জসেটটি পপিং না করে গিট স্ট্যাশ থেকে কোনও একক ফাইল বা কোনও ফাইলের আলাদা করা সম্ভব কিনা তা আমি জানতে চাই।

কেউ কি এই সম্পর্কে কিছু পরামর্শ / ধারণা দিতে সক্ষম হতে পারে?

উত্তর:


1129

উপর Git লুকোবার জায়গা র manpage আপনি (, "আলোচনা" বিভাগে পরেই "বিকল্প" বিবরণ) পড়তে পারেন যে:

স্ট্যাশকে একটি প্রতিশ্রুতিবদ্ধ হিসাবে উপস্থাপন করা হয় যার গাছটি কার্যক্ষম ডিরেক্টরিটির স্থিতি রেকর্ড করে এবং স্ট্যাশ তৈরি হওয়ার সময় এর প্রথম পিতা-মাতা হেড-এ প্রতিশ্রুতিবদ্ধ।

সুতরাং আপনি স্ট্যাশকে (যেমন stash@{0}প্রথম / শীর্ষস্থানীয় স্ট্যাশ) মার্জ কমিট হিসাবে বিবেচনা করতে পারেন এবং ব্যবহার করুন:

$ git diff stash@{0}^1 stash@{0} -- <filename>

ব্যাখ্যা: stash@{0}^1প্রদত্ত স্তরের প্রথম পিতা-মাতার অর্থ, যা উপরের ব্যাখ্যায় বর্ণিত প্রতিশ্রুতি যা পরিবর্তনগুলি বন্ধ করে দেওয়া হয়েছিল। আমরা "গিট ডিফ" এর এই ফর্মটি (দুটি কমিটের সাথে) ব্যবহার করি কারণ stash@{0}/ refs/stashএকটি মার্জ কমিট, এবং আমাদের কোন পিতামাতার সাথে আমরা আলাদা করতে চাই তা গিটকে আমাদের বলতে হবে। আরও ক্রিপ্টিক:

$ git diff stash@{0}^! -- <filename>

এছাড়াও কাজ করা উচিত ( "রেঞ্জ নির্দিষ্টকরণ" বিভাগে সিনট্যাক্সের ব্যাখ্যার জন্য গিট রেভ পার্স ম্যানপেজ দেখুন rev^!)

তেমনি, আপনি স্ট্যাটাসের বাইরে কোনও একক ফাইল চেক করতে গিট চেকআউট ব্যবহার করতে পারেন :

$ git checkout stash@{0} -- <filename>

বা অন্য ফাইলের নামে এটি সংরক্ষণ করতে:

$ git show stash@{0}:<full filename>  >  <newfile>

অথবা

$ git show stash@{0}:./<relative filename> > <newfile>

( মনে রাখবেন যে এখানে <সম্পূর্ণ ফাইলের নাম> কোনও প্রকল্পের শীর্ষ ডিরেক্টরি সম্পর্কিত (ফাইলটি সম্পর্কিত: মনে করুন stash@{0})) সম্পর্কিত একটি ফাইলের পুরো পথের নাম ।


stash@{0}শেল সম্প্রসারণ থেকে আপনার রক্ষা করার প্রয়োজন হতে পারে , যেমন ব্যবহার "stash@{0}"বা 'stash@{0}'


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

4
বেশিরভাগ ক্ষেত্রে আমি গিট চেকআউট অ্যাপ্লিকেশনটিকে আমি যা করতে চেয়েছিলাম তা সম্পাদন করার সর্বোত্তম উপায় বলে মনে করি। তবে আমি কৌতূহলী এবং ডাবল-চেক করা git checkoutম্যান পৃষ্ঠা ছিল। এটি ফাইলটি অন্য কোনও জায়গায় ফেলে দিতে পারে না। এটিতে
ড্যানি

84
it গিট চেকআউট স্ট্যাশ @ {0} - <ফাইল নাম> খুব দরকারী, ধন্যবাদ
মাধ্যাকর্ষণ

43
নোট করুন যে git checkoutপদ্ধতিটি স্ট্যাশ থেকে সঠিক ফাইলটি অনুলিপি করে - এটি আপনার ওয়ার্কিং ডিরেক্টরিতে যা git stash applyচায় তার সাথে এটি মার্জ করে না । (সুতরাং স্ট্যাশ তৈরি হওয়ার ভিত্তি থেকে যদি আপনার কোনও পরিবর্তন হয় তবে সেগুলি নষ্ট হয়ে যাবে)।
পিটারফ্লিন

4
দ্রষ্টব্য যে git stash applyফাইলটি স্ট্যাশ করার পরে কার্যকারী বৃক্ষে পরিবর্তিত একটি ফাইলের পরিবর্তনের জন্য, কার্য গাছের সেই ফাইলটি অবশ্যই মঞ্চস্থ করতে হবে। কাজ করার জন্য স্বতঃ-মার্জ করার জন্য, একই ফাইলগুলিকে কার্যকরী অনুলিপি এবং স্ট্যাশড কপি-টু-ইন-মার্জ করতে উভয়ই সংশোধন করা যায় না। অবশেষে, স্ট্যাশ প্রয়োগ আইটেমটিকে স্ট্যাশ থেকে পছন্দ করে না সরিয়ে দেয় git stash pop
ভিল

46

আপনি যদি এর git stash applyপরিবর্তে ব্যবহার করেন তবে git stash popএটি আপনার কার্যকারী গাছের সাথে স্ট্যাশ প্রয়োগ করবে তবে তবুও স্ট্যাশ রাখবে।

এটি হয়ে গেলে আপনি add/ আপনি commitযে ফাইলটি চান তা করতে পারেন এবং তারপরে বাকী পরিবর্তনগুলি পুনরায় সেট করতে পারেন।


2
একটি নির্দিষ্ট স্ট্যাশ পপ করতে: git stash pop stash@{0}( git stash list
স্ট্যাশড

যদি স্ট্যাশ-এর ​​অন্যান্য ফাইলগুলি মার্জ সংঘাতের কারণ হয়, গিট আমাকে যে ফাইলটি চায় তা প্রতিশ্রুতিবদ্ধ করতে দেয় না :(
ছদ্মবেশী

33

স্ট্যাশ সহ যেকোনো শাখা থেকে পরিবর্তন আনার একটি সহজ উপায় রয়েছে:

$ git checkout --patch stash@{0} path/to/file

আপনি অনেকগুলি অংশে প্যাচ করতে চান তবে আপনি ফাইলটি বাদ দিতে পারেন। অথবা একক ফাইলে সমস্ত পরিবর্তন আনতে প্যাচ বাদ দিন (তবে পথটি নয়)। আপনার একাধিক 0নম্বর থাকলে স্ট্যাশ নম্বরটি দিয়ে প্রতিস্থাপন করুন git stash list। মনে রাখবেন এটি এর মতো diffএবং শাখাগুলির মধ্যে সমস্ত পার্থক্য প্রয়োগ করার প্রস্তাব দেয় । শুধুমাত্র একটি একক প্রতিশ্রুতি / স্ট্যাশ থেকে পরিবর্তন পেতে, একবার দেখুন git cherry-pick --no-commit


এই স্ট্যাশ থেকে সঠিক ফাইলটি অনুলিপি করে, না এটি মার্জ করে? অনুলিপিটির ক্ষেত্রে, স্ট্যাশ তৈরি হওয়ার পরে আপনার যদি কোনও পরিবর্তন হয়, সেগুলি হারাবে।
দানিজেল

2
@Danijel পড়ুন git help checkout--patchইন্টারেক্টিভ মার্জ করে, শেলটিতে আপনি অনুমোদনের (গুলি) যা যা প্রয়োগ করে (অথবা আপনি eপ্যাচটি ছিদ্র করতে পছন্দ করেন তবে যা কিছু সংরক্ষণ করুন) এটি প্রয়োগ করে । পাথ একাই ফাইলটি ওভাররাইট করবে, যেমন আমি লিখেছিলাম, "সমস্ত পরিবর্তন"।
ওয়ালফ

1
সামান্য উন্নতি: git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")' - এরপরে git applydiffat stash@{4}কেবল স্ট্যাশ এবং এর পিতামাতার মধ্যে পরিবর্তিত ফাইলগুলি ব্যবহার করা হয়।
চিহ্নিত করুন

25

সংক্ষিপ্ত উত্তর

পুরো ফাইলটি দেখতে: git show stash@{0}:<filename>

পার্থক্যটি দেখতে: git diff stash@{0}^1 stash@{0} -- <filename>


1
আমি মনে করি না যে তিনি কোনও নির্দিষ্ট ফাইলের জন্য স্ট্যাশ দেখার সাথে সম্পর্কিত ছিলেন - কেবল সেই ফাইলটি পপিং করা।
অমলগোভিনাস

1
এই আমি খুঁজছিলাম ছিল। তারপর আপনি প্রতিস্থাপন করতে পারেন diffসঙ্গে difftoolআপনার প্রিয় বহিরাগত পরিবর্তন ব্যবহার করতে।
পিট ব্রিটস

19
$ git checkout stash@{0} -- <filename>

মন্তব্য:

  1. আপনি "-" এবং ফাইলের নাম প্যারামিটারের পরে স্থান রেখেছেন তা নিশ্চিত করুন

  2. আপনার নির্দিষ্ট স্ট্যাশ নম্বর দিয়ে শূন্য (0) প্রতিস্থাপন করুন। স্ট্যাশ তালিকা পেতে, ব্যবহার করুন:

    git stash list
    

ভিত্তিক জাকুব নারাবস্কির উত্তরের - সংক্ষিপ্ত সংস্করণ


11

আপনি " git show stash@{0}" (বা স্ট্যাশের সংখ্যা যাই হোক না কেন; "গিট স্ট্যাশ তালিকা" দেখুন) দিয়ে স্ট্যাশের জন্য পৃথকীকরণ পেতে পারেন। একটি একক ফাইলের জন্য পার্থক্যের অংশটি বের করা সহজ।


2
আমার মতো মনের পক্ষে সহজ সরল: git show stashশীর্ষস্থানীয় স্ট্যাশ দেখানোর জন্য ব্যবহার করুন (সাধারণত কেবলমাত্র আপনার একমাত্র)। একইভাবে আপনি আপনার বর্তমান শাখা এবং এর সাথে স্ট্যাশগুলির মধ্যে পার্থক্য দেখাতে পারেন git diff head stash
ডিজলি

5

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

আপনি যদি git stashতাদের সকলকে স্ট্যাশ করে, git stash applyআবার এবং আবার ফিরিয়ে আনতে করেনgit checkout f.c কার্যকরভাবে পুনরায় সেট করার জন্য প্রশ্নে থাকা ফাইলটিতে।

আপনি যখন ফাইলটি আনস্টাশ করতে চান git reset --hardতখন রান করুন এবং আবার চালনা করুন git stash apply, git stash applyস্ট্যাশ স্ট্যাকের থেকে পৃথকটি সাফ করে না এমন সত্যতার সুযোগ নিয়ে ।


1

যদি স্ট্যাশ করা ফাইলগুলিকে বর্তমান সংস্করণের সাথে একত্রীকরণের প্রয়োজন হয় তবে ডিফ ব্যবহার করে পূর্ববর্তী উপায়গুলি ব্যবহার করুন। অন্যথায় আপনি git popএগুলি স্টেস্ট করার git add fileWantToKeepজন্য , আপনার ফাইল git stash save --keep-indexমঞ্চ করার জন্য এবং মঞ্চে যা আছে তা বাদ দিয়ে সবকিছু করার জন্য ব্যবহার করতে পারেন । মনে রাখবেন যে পূর্ববর্তীগুলির সাথে এই ধরণের পার্থক্য হ'ল এটি স্ট্যাশ থেকে ফাইলটিকে "পপ" করে। পূর্ববর্তী উত্তরগুলি এটি রাখে git checkout stash@{0} -- <filename>তাই এটি আপনার প্রয়োজন অনুসারে চলে।


0

আপনার কার্যনির্বাহী গাছের কাছে স্ট্যাশ-এ থাকা কোনও ফাইলের পরিবর্তনগুলি প্রয়োগ করতে নিম্নলিখিতটি ব্যবহার করুন।

git diff stash^! -- <filename> | git apply

এটি সাধারণত ব্যবহারের চেয়ে ভাল git checkoutকারণ আপনি স্ট্যাশ তৈরি করার পরে আপনি ফাইলটিতে যে কোনও পরিবর্তন হারাবেন না।


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