গিতের মধ্যে কেবল স্টেইনড স্ট্যান্ড স্টেইন করা হচ্ছে


228

আমি নিম্নলিখিত কাজের প্রবাহটি করতে চাই:

  1. মঞ্চে পরিবর্তন যুক্ত করুন।
  2. মঞ্চস্থ হয়নি এমন অন্যান্য সমস্ত পরিবর্তনকে স্ট্যাশ করুন।
  3. পর্যায়ে জিনিসগুলি দিয়ে কিছু স্টাফ করুন (যেমন নির্মাণ, পরীক্ষা চালানো ইত্যাদি)
  4. স্ট্যাশ প্রয়োগ করুন।

পদক্ষেপ 2 করার কোনও উপায় আছে?

উদাহরণ

 echo "123" > foo
 git add foo # Assumes this is a git directory
 echo "456" >> foo
 git stash
 cat foo # Should yield 123

আপনার পরিবর্তনগুলি তাদের মঞ্চস্থ করার পরে প্রতিশ্রুতি দিচ্ছেন না কেন?
শিজমো

3
আইআইআরসি
কিপেন্ডেডেক্স

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

ধন্যবাদ, ধন্যবাদ আমি এই কাজগুলি নিশ্চিত করতে পারি। জি, আমি লিনাক্স.ডিয়ে.নেট / ম্যান / ১ / গীত-স্ট্যাশটিতে ম্যানুয়ালটি দেখেছি যা পুরানোman git stashঅনেক ভাল।
আনপিডের

এটি - কিপ-ইনডেক্স, fww।
jaf0

উত্তর:


287

git stash saveএকটি বিকল্প রয়েছে --keep-indexযা আপনার প্রয়োজন মতো করে does

সুতরাং, চালান git stash save --keep-index


9
সত্য। আমি saveসাথে ব্যবহার চালিয়ে যান git stash। সম্ভবত এটি আমার মধ্যে প্রোগ্রামার হ'ল প্রয়োগ / পপ সহ প্রতিসাম্যকে সম্মান জানাতে জোর দিয়ে। :)
ভাল্লাক

104
দ্রষ্টব্য: এটি এখনও আপনার সমস্ত পরিবর্তনকে সংযুক্ত করে; নিয়মিত থেকে একমাত্র পার্থক্য git stash saveহ'ল এটি আপনার কার্যকরী অনুলিপিটিতে ইতিমধ্যে-পর্যায়িত পরিবর্তনগুলি ছেড়ে দেয়। উপরের কর্মপ্রবাহে এটি ঠিকঠাক কাজ করবে যেহেতু আপনি কেবল স্থানীয় অনুলিপিটির উপরে ইতিমধ্যে স্ট্যাশ প্রয়োগ করছেন যা ইতিমধ্যে স্ট্যাশগুলির অর্ধেক পরিবর্তন রয়েছে (যা গিট উপেক্ষা করার পক্ষে যথেষ্ট স্মার্ট)। তবে আপনি যদি স্ট্যাশ পুনরায় প্রয়োগ করার আগে কোডটি সম্পাদনা করেন তবে আপনি প্রয়োগ করতে গেলে আপনি সংহত সংঘাতগুলি সম্ভাব্যরূপে দেখতে পাবেন। FYI।
পিটারফ্লিন

2
@ আইপপেট যা আমাকে বহুবার কামড়েছে। আমি সত্যিই চাই যে গিটারের জন্য কেবল যে জিনিসগুলি আপনি রাখছেন না তা স্ট্যাশ করার উপায় ছিল ... আমি প্রায়শই স্টাফ করি, তারপরে একটি সম্পূর্ণ গিট স্ট্যাশ করি, জেনেও যে আমি git commit --ammendযদি প্রতিশ্রুতিবদ্ধ হয় তাতে সমস্যা আছে কিনা।
rjmunro

1
--amend(পরিবর্তে --ammend)
রোববার্ব

19
পিটারফ্লিন দ্বারা বর্ণিত সমস্যার কারণে এই সমাধানটি আমার পক্ষে কাজ করে না। এটি এখনও পর্যায়ের পরিবর্তনগুলি স্ট্যাশ করে যেহেতু এটি প্রশ্নের ভাল উত্তর নয়। এর চেয়ে ভাল সমাধান কেউ পেয়েছে?
ব্যবহারকারী 643011

43

এটি 3 টি ধাপে করা যেতে পারে: পর্যায়ক্রমে পরিবর্তনগুলি সংরক্ষণ করুন, অন্য সবকিছুর স্ট্যাশ করুন, মঞ্চ পরিবর্তনের সাহায্যে সূচি পুনরুদ্ধার করুন। যা মূলত:

git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^

এটি আপনি যা চান ঠিক তা করবে।


3
দ্রষ্টব্য: -uঅচিহ্নযুক্ত ফাইলগুলিকেও স্ট্যাশ করে।
ma11 শেই 28

এই পদ্ধতির মূলত git stash save --keep-indexআরও বেশি কাজ করে যা ডুপ্লিকেট করে। আমি কোন সুবিধা দেখতে পাচ্ছি না।
ইনিগো

1
@ ভাস না, পদ্ধতির এটির সদৃশ হয় না। গৃহীত উত্তরে পিটারফ্লিনের মন্তব্য দেখুন।
আলেকজান্ডার ক্লাউয়ার

28
git stash save --keep-index

এছাড়াও, পুন:

আপনার পরিবর্তনগুলি তাদের মঞ্চস্থ করার পরে প্রতিশ্রুতি দিচ্ছেন না কেন? - পা

উত্তর: কারণ আপনার সর্বদা পরীক্ষিত কোডটি চেক ইন করা উচিত :) এর অর্থ হল, আপনি যে পরিবর্তনগুলি করতে চলেছেন কেবল সেগুলি দিয়েই আপনাকে পরীক্ষা চালানো দরকার

অবশ্যই এগুলি ব্যতীত, একজন অভিজ্ঞ প্রোগ্রামার হিসাবে আপনার কেবলমাত্র সেই পরিবর্তনগুলি পরীক্ষা এবং পর্যালোচনা করার সহজাত আকাঙ্ক্ষা রয়েছে - কেবলমাত্র আংশিক মজা করা


14

আপনার সাথে git version 2.7.4:

git stash save --patch

gitআপনি লুকোবার জায়গা আপনার পরিবর্তনগুলি যোগ করতে অথবা না জিজ্ঞাসা করবে।
এবং আপনি কেবল উত্তর yবাn

আপনি সর্বদা এটি করার মতো আপনি কাজ ডিরেক্টরিটি পুনরুদ্ধার করতে পারেন:

git stash pop

বা, আপনি যদি সংরক্ষণে পরিবর্তনগুলি সংরক্ষণে রাখতে চান:

git stash apply

এটা সত্যিই দারুন. এটি সামান্য শ্রম-নিবিড়, তবে কমপক্ষে আপনি এড়িয়ে যেতে এবং পুরো ফাইলগুলি যুক্ত করতে পারেন।
ডাস্টিন ওপ্রেপা

5

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

প্রথমে সমস্ত কিছু লুকিয়ে রাখুন, তবে পর্যায়ক্রমে পরিবর্তনগুলি অক্ষত রেখে দিন

it গিট স্ট্যাশ সেভ - কিপ-ইনডেক্স [- অন্তর্ভুক্ত-অবরুদ্ধ]

এখন আলাদাভাবে স্টেজযুক্ত পরিবর্তনগুলিও লুকিয়ে রাখা

it গিট স্ট্যাশ সেভ

স্থির জন্য পরিবর্তন করা; এবং পরীক্ষা; তাদের প্রতিশ্রুতিবদ্ধ:

it গিট অ্যাড [- ইন্টারেক্টিভ] [- প্যাচ]

it গিট কমিট-মি "ফিক্স ..."

এখন আগের পর্যায়ের পরিবর্তনগুলি পুনরুদ্ধার করুন:

it গিট স্ট্যাশ পপ

যেকোন দ্বন্দ্ব সমাধান করুন এবং মনে রাখবেন যে যদি দ্বন্দ্ব থাকে তবে গিটটি প্রয়োগ হবে তবে শীর্ষস্থানীয় স্ট্যাশ এন্ট্রি বাদ দেওয়া হবে না

(... তারপরে পর্যায়ক্রমে পরিবর্তনগুলি সংঘটিত করুন, এবং অন্যান্য সমস্ত পরিবর্তনগুলির স্ট্যাশ পুনরুদ্ধার করুন এবং চালিয়ে যান ...)


4

স্ট্যাশ-এ স্ট্যাগস্ট্যাগড (কমিটমেন্টে যোগ করা হয়নি) ফাইল যুক্ত করতে নিম্নলিখিত কমান্ডটি চালান:

git stash -k

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

git stash pop

4

গিটে কেবল কার্যক্ষম গাছ (স্টেস্টেড না পরিবর্তিত) স্ট্যাশ করা যতটা হওয়া উচিত তার চেয়ে বেশি কঠিন। গৃহীত উত্তর unstaged পরিবর্তন stashes, কিন্তু stashes মঞ্চস্থ (এবং পাতার তাদের পাশাপাশি মঞ্চস্থ) পরিবর্তন, যা খুব কমই হয় কি আপনি চান।

এই উরফ ভাল কাজ করে:

stash-working = "!f() { \
  git commit --quiet -m \"temp for stash-working\" && \
  git stash push \"$@\" && \
  git reset --quiet --soft HEAD~1; }; f"

এটি অস্থায়ীভাবে মঞ্চস্থ পরিবর্তনগুলি সংঘবদ্ধ করে, অবশিষ্ট পরিবর্তনগুলি থেকে স্ট্যাশ তৈরি করে (এবং অতিরিক্ত যুক্তি যেমন --include-untrackedএবং --messageওরফে আর্গুমেন্ট হিসাবে পাস করার অনুমতি দেয় ) এবং পরে পর্যায়যুক্ত পরিবর্তনগুলি ফিরে পেতে অস্থায়ী প্রতিশ্রুতি পুনরায় সেট করে।

এটি @ সিমন কেএনপ্পের জবাবের মতো , তবে কয়েকটি ছোটখাটো পার্থক্য সহ - এটি --quietগৃহীত অস্থায়ী পদক্ষেপগুলিকে ব্যবহার করে এবং এটি স্ট্যাশ push-এর জন্য কঠোর কোডিংয়ের চেয়ে অনেকগুলি পরামিতি গ্রহণ -mকরে এবং এটি --softফাইনালে যোগ করে পুনরায় সেট করুন যাতে সূচিটি শুরু হওয়ার সাথে সাথেই থেকে যায়।

স্ট্যাশিংয়ের বিপরীত সমস্যার জন্য কেবল পর্যায়ের পরিবর্তনগুলি (ওরফে stash-index) এই উত্তরটি দেখুন


2

প্রশ্নের সাথে সম্পর্কিত আরও একটি টিপ:

যখন আপনি কার্যকরভাবে আপনার স্টেস্টেড পরিবর্তনগুলি ব্যবহার করে স্ট্যাশ করেন

keep গিট স্ট্যাশ সেভ - কিপ-ইনডেক্স

আপনি স্ট্যাশটিকে একটি বার্তা দিতে ইচ্ছুক হতে পারেন, যাতে আপনি যখন git stash listএটি করতে চান তখন আপনি যা আগে রেখেছিলেন তা আরও স্পষ্টভাবে বিশেষত যদি আপনি সেই স্ট্যাশ অপারেশনটি আরও সংরক্ষণ করে অনুসরণ করেন। উদাহরণ স্বরূপ

it গিট স্ট্যাশ সেভ - কিপ-ইনডেক্স "পরিবর্তনগুলি এখনও মঞ্চায়িত হয়নি"

(যদিও এটিতে অন্যান্য উত্তরে বর্ণিত সমস্ত পরিবর্তন রয়েছে)।

উদাহরণস্বরূপ, উপরেরগুলি অবিলম্বে অনুসরণ করা যেতে পারে:

feature গিট স্ট্যাশ সংরক্ষণ "বৈশিষ্ট্য এক্সের জন্য পর্যায়ক্রমে পরিবর্তনগুলি"

আপনি সাবধানতা অবলম্বন করুন যে আপনি তারপর ব্যবহার করতে পারবেন না

it গিট স্ট্যাশ প্রয়োগ "স্ট্যাশ @ {1}" ### you আপনি যা চান তা পুরোপুরি করে না

শুধু অনাস্থাবিহীন পরিবর্তনগুলি পুনরুদ্ধার করতে।


2

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

গিট অবশ্য আপনাকে কোন ফাইলগুলি স্ট্যাশ করতে চান তা নির্দিষ্ট করতে দেয়।

git stash push --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

আপনি যদি কেবলমাত্র সেই ফাইলগুলিতে নির্দিষ্ট পরিবর্তনগুলি রাখতে চান তবে --patchবিকল্পটি যুক্ত করুন।

git stash push --patch --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

--include-untrackedবিকল্পটি untracked ফাইল লুকিয়ে রাখার জন্য করতে দেয়।

git stash push --include-untracked --message 'Untracked files' -- app/controllers/widgets_controller.rb test/controllers/widgets_controller_test.rb

আরও তথ্যের জন্য চালান git help stash(বা man git-stash)।

দ্রষ্টব্য: যদি আপনার অচিহ্নবদ্ধ পরিবর্তনগুলি পরিবর্তে বিযুক্ত করা হয় তবে @ আলেসগুজিকের উত্তর সম্ভবত সহজ easier


0

এই কমান্ডটির আধুনিক রূপ git stash push [--] [<pathspec>...]হ'ল গিট ২.১16++ (অবমূল্যায়ন git stash saveকরা হয়েছে )

আপনি এটি একটি ওয়াইল্ডকার্ড ফর্মের সাথে একত্রিত করতে পারেন, উদাহরণস্বরূপ:

git stash push --all --keep-index ':(glob)**/*.testextension' 

উইন্ডোজের উইন্ডোজ উইন্ডোজ উইন্ডোজের সাথে এটি ভাল কাজ করে না, গিট ২.২২ (Q2 2019) অবধি 2037 নম্বর দেখুন , git stashসি-তে পুনরায় প্রয়োগ করা হয়েছে (শেল স্ক্রিপ্টের পরিবর্তে)

টমাস গুমেরার ( ) দ্বারা 7db9302 (11 মার্চ 2019) প্রতিশ্রুতিবদ্ধ দেখুন । দেখুন কমিট 1366c78 , কমিট 7b556aa (07 মার্চ 2019) দ্বারা জোহানেস Schindelin ( )(দ্বারা একীভূত junio সি Hamano - - মধ্যে কমিট 0ba1ba4 , 22 এপ্রিল 2019)tgummerer
dscho
gitster

অন্তর্নির্মিত stash: :(glob)আবার প্যাথস্পেকগুলি পরিচালনা করুন

পাঠস্পেকগুলির একটি তালিকা পাস করার সময়, বলুন, git addআমাদের পথস্পেকগুলির পার্সড ফর্মটি নয়, মূল ফর্মটি ব্যবহার করার ক্ষেত্রে যত্নবান হওয়া দরকার।

এটি একটি পার্থক্য তোলে যেমন কল করার সময়

git stash -- ':(glob)**/*.txt'

যেখানে মূল ফর্মটিতে :(glob)উপসর্গ অন্তর্ভুক্ত রয়েছে যখন পার্স করা ফর্মটি না করে।

তবে বিল্ট-ইন-এ git stash, আমরা পার্সড (অর্থাত্ ভুল) ফর্মটি পাস করেছি এবং git addত্রুটি বার্তায় ব্যর্থ হব :

fatal: pathspec '**/*.txt' did not match any files

এমন পর্যায়ে যেখানে git stashওয়ার্কট্রি থেকে পরিবর্তনগুলি ড্রপ করে, এমনকি যদি refs/stashসত্যিকার অর্থে সফলভাবে আপডেট করা হয়।


0

আমি একটি উপাধি ব্যবহার করি যা স্ট্যাশ প্রবেশের বার্তা হিসাবে স্ট্রিং গ্রহণ করে।

mystash = "!f() { git commit -m hold && git stash push -m \"$1\" && git reset HEAD^; }; f"

কোনটি:

  • সূচকের সমস্ত কিছু প্রতিশ্রুতিবদ্ধ,
  • কার্যকারী গাছের মধ্যে যা পরিবর্তিত হয়েছে তা স্ট্যাশ করে (অবশ্যই যোগ করতে পারে -uবা করতে পারে -a),
  • কাজের প্রতিশ্রুতিতে শেষ প্রতিশ্রুতি পুনরায় সেট করে ( --softএটি সূচকে রাখতে ব্যবহার করতে পারে)।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.