আমি কীভাবে গিট স্ট্যাশটির নাম পরিবর্তন করতে পারি?


202

আমার একটি ভুল নাম রয়েছে ash আমি নামটি ঠিক করতে চাই তাই এটি সঠিক।

আমি কীভাবে স্ট্যাশটির নাম পরিবর্তন করতে পারি?


5
এটি পপ এবং একটি পৃথক নাম দিয়ে আবার সংরক্ষণ?
বার্টলোমিয়েজ লেয়ান্ডোভস্কি

5
পপিং এবং স্ট্যাশিং আবার সবসময় কোনও বিকল্প হয় না, কারণ স্ট্যাশ পুরানো অবস্থার উপর ভিত্তি করে তৈরি হতে পারে এবং পপিংয়ের সময় সংঘাত সৃষ্টি করতে পারে। (পুরানো রাষ্ট্র এমনকি ইতিহাসে কোথাও কোথাও বিদ্যমান থাকতে পারে না।)
টম

উত্তর:


258

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

$ git stash list
stash@{0}: WIP on master: Add some very important feature 
stash@{1}: WIP on master: Fix some silly bug

প্রথমত, আপনি আবশ্যক স্ট্যাশ এন্ট্রিটি আপনাকে মুছে ফেলতে হবে যা আপনি নাম পরিবর্তন করতে চান:

$ git stash drop stash@{1}
Dropped stash@{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)

বাদ দেওয়ার পরে ফিরে আসা কমিটের শ ব্যবহার করে এটি আবার নতুন বার্তা যুক্ত করুন:

$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db

এবং এটাই:

$ git stash list
stash@{0}: Very descriptive message
stash@{1}: WIP on master: Add some very important feature

এই সমাধানটির জন্য 1.8.4 বা তার পরে গিট প্রয়োজন, এবং হ্যাঁ, এটি নোংরা ওয়ার্কিং ডিরেক্টরিতেও কাজ করে।


3
git show stash@{0}এখনও পুরানো তথ্য পরে দেখায়। কীভাবে ঠিক করব? (দয়া করে নোট করুন যে স্ট্যাশ এর পরে একটি আলাদা
টিনো

4
এটি দিয়ে হ্যাশটি পেতে এবং এটি দিয়ে git showশুরু করা ভাল git stash store। তারপরে git stash listআপনি পুরানো এবং নতুন স্ট্যাশ দেখতে পাবেন। শেষ পর্যন্ত আপনি পুরানো স্ট্যাশ দিয়ে এটি পরিষ্কার করতে পারেন git stash drop
হোগি

6
গিট স্ট্যাশ ড্রপ পরিবর্তনগুলি হারাবে না?
শ্রাব্য বোগগারাপু

4
@ শ্রব্যবোগগ্রাপু, না, গিটটি চালা না হওয়া অবধি কমিট সরিয়ে দেয় না git gc। পরে stash dropআপনি সহজেই এই জানতে পারেন স্বাভাবিকভাবে দুর্গম ব্যবহার কমিট git fsck | grep commitকমান্ড।
কিউজবি

2
@ ইরান্দি সহজভাবে প্রয়োগ করা এবং সংরক্ষণ করা সহজ বিকল্প, তবে দ্বন্দ্বের কারণে পরিবর্তনগুলি পুনরায় প্রয়োগ করা সম্ভব না হলে কাজ করে না। এদিকে যে কোনও পরিস্থিতিতে ড্রপ এবং স্টোরের কাজ। আমি আবার আমার সমাধান পরীক্ষা করেছি - এটি সর্বশেষতম গিট সংস্করণে (2.17.0) ঠিকঠাক কাজ করে।
qzb

62

আপনি নিজে নিজে এটি না করে বা গিতের উন্নতিতে অবদান না দিলে আপনি একটি নাম ব্যবহার করতে পারেন:

git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git diff-index --quiet HEAD; s=$?; [ $s != 0 ] && git stash save "tmp stash from stash-rename"; git stash apply $rev && shift && git stash save "$@" && [ $s != 0 ] && git stash pop stash@{1}; }; _'

ব্যবহার: " git stash-rename <stash> [save options] [<message>]"

যে [save options]কোনও বিকল্প সহ git stash save:[-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]

উদাহরণ:

$ git stash list
stash@{0}: On master: Pep8 format
stash@{1}: On master: co other than master with local changes
stash@{2}: On master: tests with deployAtEnd

# Let's say I want to rename the stash@{2} adding an issue reference:
$ git stash-rename stash@{2} NXP-13971-deployAtEnd

$ git stash list
stash@{0}: On master: NXP-13971-deployAtEnd
stash@{1}: On master: Pep8 format
stash@{2}: On master: co other than master with local changes

আপনার স্থানীয় স্টেস্টেড পরিবর্তন না থাকলেও এটি কাজ করবে :)

সম্পাদনা 2016/02/22

সরলীকৃত স্ক্রিপ্ট, কুইজেবিতে ক্রেডিট , https://stackoverflow.com/a/35549615/515973

git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git stash store -m "$2" $rev; }; _'

ব্যবহার: " git stash-rename <stash> [<message>]"


1
অসাধারণ! এমনকি আপনি যদি করতে পারেন তবে শীতলgit stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'
মাইকমেকানা

3
সুতরাং উত্তরটি 1) ক্লিন ওয়ার্কিং কপি, 2) আপনি নাম পরিবর্তন করতে চান এমন স্ট্যাশ প্রয়োগ করুন, 3) স্ট্যাশ তালিকা থেকে বাদ দিন, 4) সঠিক বার্তা সহ একটি নতুন স্ট্যাশ তৈরি করুন।
gcb

2
পরিষ্কার করার জন্য, আপনি শেষ স্ট্যাশটির নাম পরিবর্তন করছেন, এবং এই জাতীয় পদক্ষেপের পরে এটি শীর্ষ স্ট্যাশ হয়ে যায়?
ওয়ানব্রি

2
আমি পুনরায় নামকরণের জন্য স্ট্যাশটিকে মুছে ফেলি, বর্তমান পরিবর্তনগুলি যদি হয় তবে সংরক্ষণ করা উচিত, মুছে ফেলা স্ট্যাশকে চাইলে নামটি দিয়ে পুনরায় তৈরি করুন, বর্তমান পরিবর্তনগুলি যদি আবার থাকে তবে পুনরায় প্রয়োগ করি।
জুলিয়েন কার্সিক

3
এই সংস্করণটি উভয় আর্গুমেন্ট রয়েছে তা নিশ্চিত করে পরীক্ষা করে তোলে যাতে এটি আপনার শেষ স্ট্যাশটিকে দুর্ঘটনাক্রমে না ফেলে। এটির জন্য কেবলমাত্র স্ট্যাশ নম্বর প্রয়োজন, পুরো stash@{0}রেফারেন্সটি নয়। gist.github.com/jdforsythe/f248bf6c72fc020225cc3e315a32e922 git config --global alias.stash-rename '!_() { if [ -z \"$1\" ] || [ -z \"$2\" ]; then echo \"git stash-rename 0 NewName\" && echo \"\" && git stash list && exit 1; else stash=\"stash@{$1}\"; rev=$(git rev-parse \"${stash}\"); git stash drop \"${stash}\" || exit 1; git stash store -m \"$2\" \"$rev\" || exit 1; git stash list; fi }; _'
jdforsythe

6

এটা খুবই সাধারণ. প্রথমে এর সাথে শেষ স্ট্যাশটিকে পূর্বাবস্থায় ফিরিয়ে আনুন:

git stash pop

এর পরে, আপনি এইভাবে কোনও পছন্দসই নামের সাথে স্ট্যাশ সংরক্ষণ করতে পারেন:

git stash save "your explanatory name"

আমি আশা করি এটি আপনার জন্য কার্যকর। :)


নাম পরিবর্তিত স্ট্যাশ সাম্প্রতিকতম নাও হতে পারে।
মাইকমেকানা

সাম্প্রতিকতম স্ট্যাশের জন্য এটি আরও সোজা (কেবল) থেকে থাম্বস আপ।
কাইহুয়া

3

আমি মনে করি না যে এটি করা সম্ভব। স্ট্যাশ পুনর্নামকরণের জন্য একটি প্রস্তাব এসেছে , তবে এটি এখনও কার্যকর হয়নি।

আমার সাধারণ ধারণাটি হ'ল:

  1. একটি নতুন git reflog updateকমান্ড প্রয়োগ করুন যা নির্দিষ্ট রেফ্লগ এন্ট্রির সাথে সম্পর্কিত বার্তাটি আপডেট করে। এটি করার জন্য, একটি নতুন update_reflog_ent()ফাংশন ( রিফ্লগসি-তে ) নির্দিষ্ট রেফ্লগ এন্ট্রির সাথে সম্পর্কিত বার্তাটি আপডেট করতে পরিবর্তন করবে। একটি update_reflog()ফাংশন ব্যবহার করেন for_each_reflog_ent()সঙ্গে update_reflog_entআসলে পরিবর্তন করতে।

  2. একটি git stash renameকমান্ডের তখন কেবল git reflog updateউপযুক্ত রেফ এবং নতুন বার্তা সহ কল করা দরকার ।

অথবা আপনি অবশ্যই স্ট্যাশ পপ করতে এবং একটি করতে পারেন git stash save [message]


3

পাঠকের সুবিধার জন্য, বর্তমানে গৃহীত এবং সঠিক উত্তরের জন্য এখানে একটি বর্ধিতাংশ দেওয়া আছে

আপনি যদি কেবলমাত্র স্ট্যাশ বার্তাটি সংশোধন করতে না চান এবং স্ট্যাশের প্রতিশ্রুতি বার্তাটিও ঠিক করতে চান, যেমন such

git stash list

এবং

git log --oneline -1 stash

উভয়ই যা দেখানো হয়েছে তাতে সম্মত হন, আপনার আরও কিছুটা প্রয়োজন। এটি করার আরও ভাল উপায় হতে পারে তবে এখানে এই রেসিপিটি বোঝা সহজ, আমি আশা করি।

সক্ষম হতে git commit --amendআপনাকে শাখার টিআইপিতে থাকতে হবে। সুতরাং সমাধানটি হ'ল:

git checkout -b scratch stash@{1}
git stash drop stash@{1}
git commit --amend -m "$MESSAGE"
git stash store -m "$MESSAGE" HEAD
git checkout master
git branch -D scratch

ব্যাখ্যা:

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

অপূর্ণতা:

  • এটি সাময়িকভাবে শাখাগুলি স্যুইচ করে। সুতরাং এই রেসিপিটি কেবল তখনই প্রয়োগ করা যেতে পারে যখন git status --porcelainপরিষ্কার থাকে (পড়ুন: কিছুই আউটপুট দেয় না)

  • এটি স্ট্যাশগুলি পুনর্নবীকরণ করে, তাই পরিবর্তিত স্ট্যাশ হয়ে যায় stash@{0}

  • আপনাকে $MESSAGEদুবার প্রবেশ করতে হবে বা কিছু পরিবেশ পরিবর্তনশীল ব্যবহার করতে হবে (উদাহরণস্বরূপ MESSAGE:)

  • আপনার অব্যবহৃত শাখার নাম খুঁজে পাওয়া দরকার

শাখাগুলি স্যুইচ না করে এটি করার উপায় রয়েছে তবে এটি এই উত্তরের পরিধি ছাড়াই।

উদাহরণ

git init scratch
cd scratch
for a in A B C D; do date >$a; git add $a; git commit -m $a; done
for a in X Y; do echo $a > Z; git stash save --all; done
git log --oneline --graph --decorate --all; git stash list

আউটপুট

*-.   e0e281b (refs/stash) WIP on master: 8bdcc32 D
|\ \  
| | * 4d62f52 untracked files on master: 8bdcc32 D
| * 096f158 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: WIP on master: 8bdcc32 D
stash@{1}: WIP on master: 8bdcc32 D

এখন প্রতিশ্রুতি পরিবর্তন না করে (দ্রষ্টব্য: নীচে থাকা SHA আপনার পক্ষে আলাদা হবে):

git stash drop stash@{1}
git stash store -m ...changed... 2fbf9007dfdfb95ae269a19e13b8b9ca3e24181c
git log --oneline --graph --decorate --all; git stash list

আউটপুট

*-.   2fbf900 (refs/stash) WIP on master: 8bdcc32 D
|\ \  
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D

আপনি দেখতে পাচ্ছেন, stash@{0}এখনও হিসাবে প্রদর্শিত 2fbf900 (refs/stash) WIP on master: 8bdcc32 Dহয় git log। আপনি যদি মনোযোগ দিয়ে দেখুন, আপনি দেখতে পাবেন যে বেশ কয়েকটি কমিট এসএইচএ পরিবর্তন করেছে। এটি স্ট্যাশগুলি কীভাবে পরিচালনা করা হয় তার কারণে হয় (পিতামাতারা এসএইচএর অন্তর্ভুক্ত থাকে এবং স্ট্যাশগুলির পিতা-মাতা হিসাবে তাদের স্ট্যাশ থাকে)।

এটি স্থির করুন:

git checkout -b scratch stash
git stash drop
git commit --amend -m ...changed...
git stash store -m ...changed... HEAD
git checkout master
git branch -D scratch
git log --oneline --graph --decorate --all; git stash list

আউটপুট

*-.   4d55186 (refs/stash) ...changed...
|\ \  
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D

আপনি যেমন দেখতে পাচ্ছেন, তারও refs/stashপরিবর্তিত এসএএচ রয়েছে।


উল্লেখযোগ্য: এটি মূল স্ট্যাশের সাথে সংরক্ষণ করা সেই সূচকটিকে নষ্ট করে, একে নতুন সূচীর সাথে প্রতিস্থাপন করে যা মূল স্ট্যাশের পিতামাতার প্রতিশ্রুতি মেলে। যদি কেউ আসল সংরক্ষিত সূচকটি ব্যবহার করার পরিকল্পনা না করে (বা এটি ইতিমধ্যে মূল স্ট্যাশের পিতামাতার সাথে মেলে) তবে এটি কোনও সমস্যা নয়।
টেরিক

1

এখানে জুলিয়ানের ওরফে একটি পরিবর্তিত সংস্করণ দেওয়া হয়েছে যা আপনাকে On <branch>সাধারণত স্ট্যাশ নামগুলিতে প্রিফিক্স প্রিফিক্সটির সাথে সঠিকভাবে মোকাবেলা করতে দেয় :

git config --global alias.stash-rename '!_() { newmsg="$1" && stash=${2:-"stash@{0}"} && newbranch="$3" && sha=$(git rev-parse "$stash") && olddesc="$(git stash list --format=%gs -1 "$stash")" && newdesc="$(if [[ "$newbranch" = "." ]]; then echo "$newmsg"; else if [[ -n "$newbranch" ]]; then echo "On $newbranch: $newmsg"; else if [[ "$olddesc" =~ ":" ]]; then echo "$(echo "$olddesc" | cut -f1 -d":"): $newmsg"; else echo "$newmsg"; fi; fi; fi)" && git stash drop "$stash" > /dev/null || exit 1; git stash store -m "$newdesc" "$sha" && git stash list; }; _'

বাক্য গঠন:

git stash-rename <new-name> [<stash> [<new-branch-name> | .]]

ব্যবহারের উদাহরণ:

repo[master] % touch tmp && git add tmp && git stash save first
Saved working directory and index state On master: first
HEAD is now at bd62064 Initial commit
repo[master] % touch tmp && git add tmp && git stash save second
Saved working directory and index state On master: second
HEAD is now at bd62064 Initial commit
repo[master] % git stash list
stash@{0}: On master: second
stash@{1}: On master: first
repo[master] % git stash-rename renamed
stash@{0}: On master: renamed
stash@{1}: On master: first
repo[master] % git stash-rename also-renamed stash@{1}
stash@{0}: On master: also-renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-changed stash@{0} new-branch
stash@{0}: On new-branch: branch-changed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-name-persists
stash@{0}: On new-branch: branch-name-persists
stash@{1}: On master: renamed
repo[master] % git stash-rename no-branch stash@{0} .
stash@{0}: no-branch
stash@{1}: On master: renamed
repo[master] % git stash-rename renamed
stash@{0}: renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename readd-branch stash@{0} develop
stash@{0}: On develop: readd-branch
stash@{1}: On master: renamed

কমান্ডটির বেশিরভাগটি যুক্তি বিশ্লেষণ এবং শাখার নামটি কী করা উচিত তা নির্ধারণের জন্য। gitব্যবহৃত সরঞ্জাম নিম্নরূপ:

  • git rev-parse <stash> স্ট্যাশ এর এসএইচএ খুঁজে পেতে।
  • git stash list --format=%gs -1 <stash>এটি reflog বিষয় লুকোবার জায়গা আছে। নোট করুন যে এটি স্ট্যাশের প্রতিশ্রুতিবদ্ধ বার্তার থেকে পৃথক , যা এই আদেশ দ্বারা পরিবর্তিত হয় না। রিফ্লগের বিষয়টি এটিতে প্রদর্শিত হয় git stash listএবং স্ট্যাশগুলির সাথে সম্পর্কিত কমিটের হ্যাশগুলি পরিবর্তন না করে আপনি রিফ্লগের বিষয়টিকে পরিবর্তন করতে পারেন। তবে আপনি সর্বদা আসল প্রতিশ্রুতি বার্তাটি খুঁজে পেতে পারেন, সুতরাং git stash-renameসংবেদনশীল তথ্য অপসারণ করতে ব্যবহার করবেন না !
  • git stash drop <stash>পুরাতন রেফারেন্স স্ট্যাশগুলিতে ফেলে দেওয়ার জন্য (তবে আমাদের এখনও এসএইচএ রয়েছে, তাই এটি হারিয়ে যায়নি)।
  • git stash store -m <new-message> <sha>একই প্রতিশ্রুতিবদ্ধ তথ্যের সাথে স্ট্যাশগুলিতে একটি নতুন রেফারেন্স সংরক্ষণ করতে তবে একটি ভিন্ন রেফলগ বিষয়
  • git stash listঅপারেশন শেষ হওয়ার পরে স্ট্যাশগুলির তালিকা তৈরি করতে। নোট করুন যে নতুন স্ট্যাশগুলি সর্বদা তালিকার শুরুর দিকে এগিয়ে যায়। আসল অবস্থানটি পুনরুদ্ধার করতে আগ্রহের স্ট্যাশগুলির আগে সমস্ত স্ট্যাশকে পুনরায় চাপ দেওয়া প্রয়োজন ।

0

সবচেয়ে সহজ উপায়: গিট স্ট্যাশ পপ দিয়ে আপনার স্ট্যাশকে পপ করুন তারপরে আবার গিট স্ট্যাশ দিয়ে আপনার নামটি সংরক্ষণ করুন save


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