গিট স্ট্যাশ -> বর্তমান পরিবর্তনের সাথে সংযুক্ত স্ট্যাশড পরিবর্তন


186

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

এই কাজ করতে একটি উপায় আছে কি?

সুবিধার্থে এটি আরও বেশি, অবশেষে আমি ছেড়ে দিয়েছি এবং প্রথমে আমার বর্তমান পরিবর্তনগুলি প্রতিশ্রুতি দিয়েছি, তারপরে আমার স্ট্যাশড পরিবর্তনগুলি, তবে আমি এগুলিকে এক ঝাঁকুনির সাথে toুকতে পছন্দ করতাম।


এর সম্ভবত নকল stackoverflow.com/q/1360712/72178
ks1322

জোশুয়ার উত্তরটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এই স্ট্যাকওভারফ্লো পোস্টটি এই প্রশ্নের প্রথম গুগল লিঙ্ক, ইন্টারনেটে সঠিক উত্তর দিন!
জের্মেমে

উত্তর:


271

আমি সবেমাত্র আবিষ্কার করেছি যে যদি আপনার বিনা অনুমতিতে পরিবর্তনগুলি সূচকে যুক্ত করা হয় (যেমন "স্টেজড", ব্যবহার করে git add ...), তবে git stash apply(এবং, সম্ভবতঃ git stash pop) আসলে একটি সঠিক সংশ্লেষ করবে merge যদি কোনও বিবাদ না হয় তবে আপনি সোনার। যদি তা না হয় তবে এটিকে git mergetoolসম্পাদক হিসাবে বা ম্যানুয়ালি যথাযথভাবে সমাধান করুন ।

পরিষ্কার করে বলতে গেলে, এই প্রক্রিয়াটির বিষয়ে আমি বলছি:

mkdir test-repo && cd test-repo && git init
echo test > test.txt
git add test.txt && git commit -m "Initial version"

# here's the interesting part:

# make a local change and stash it:
echo test2 > test.txt
git stash

# make a different local change:
echo test3 > test.txt

# try to apply the previous changes:
git stash apply
# git complains "Cannot apply to a dirty working tree, please stage your changes"

# add "test3" changes to the index, then re-try the stash:
git add test.txt
git stash apply
# git says: "Auto-merging test.txt"
# git says: "CONFLICT (content): Merge conflict in test.txt"

... যা সম্ভবত আপনি খুঁজছেন


TL; ড

আগে দৌড়াও git add


8
যেমন একটি হ্যাক, কিন্তু আরে, এটি কাজ করে এবং মনে হয় এটি করার একমাত্র উপায়। আমি আশা করি সেখানে git stash apply --forceবা কিছু ছিল ।
ম্যাট ক্যান্টর

12
আসলে, এটি হ্যাক নয় - আপনি যা চান তার চেয়ে এটি উন্নতি, যেহেতু আপনি সহজেই সূচকের পরিবর্তনগুলিতে ফিরে যেতে পারেন।
hoffmanc

2
বাহ, এই আচরণ কি সত্যিই গিট দ্বারা উদ্দিষ্ট?
edi9999

9
আমি মনে করি না যে গিট দ্বারা "অভিযুক্ত" কখনও আছে। আমার কুঁচি এখনই যে কিছু গিট এটি সুযোগ করে দেয়।
অধ্যাপক 21

5
এই নিখুঁত সমাধান। আমি ঠিক করেছিলাম git add ., git stash applyতারপর, git resetকরে করতে না করেও আমার কাজ পরিবর্তন এবং একত্রীকরণ লুকোবার জায়গা প্রযোজ্য হবে।
স্টিফেন স্মিথ

70

চলমান git stash popবা git stash applyমূলত একত্রিত হওয়া। স্ট্যাশ-এ পরিবর্তিত ফাইলগুলি যদি কার্য কপিতেও পরিবর্তন না করা হয় তবে আপনার বর্তমান পরিবর্তনগুলি করা উচিত ছিল না, এক্ষেত্রে আপনি এই ত্রুটি বার্তাটি দেখেছেন:

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

সেক্ষেত্রে আপনি আপনার বর্তমান পরিবর্তনগুলিতে এক ধাপে স্ট্যাশ প্রয়োগ করতে পারবেন না। আপনি পরিবর্তনগুলি সংঘবদ্ধ করতে পারেন, স্ট্যাশ প্রয়োগ করতে পারেন, আবার প্রতিশ্রুতিবদ্ধ করতে পারেন এবং git rebaseযদি আপনি সত্যিকার অর্থে দুটি কমিট না চান তবে এই দু'টি কমিটকে স্কোয়াশ করতে পারেন, তবে এটির জন্য এটি আরও বেশি সমস্যা হতে পারে।


1
আমি সেই বার্তাটি পেয়েছি - পরিবর্তনগুলি দ্বন্দ্ব করে না তবে একই ফাইলগুলি ভাগ করে, স্ট্যাশেস / অ্যাপ্লিকেশন ব্যবহার করে প্রায় কোনও?
বেমিস

1
দুঃখিত, এটি "মার্জ কোন্দল" বলতে আমি বোঝাতে চাইছিলাম তবে এটি ছিল শব্দটি পছন্দ নয়। আমি মনে করি যে ত্রুটি বার্তাটি বেশ চূড়ান্ত: যদি ওয়ার্কিং কপির পরিবর্তিত ফাইলগুলিও স্ট্যাশে পরিবর্তন করা হয় তবে আপনি স্ট্যাশ প্রয়োগ করতে পারবেন না। আমি আমার উত্তরটি একটি সম্ভাব্য কর্মক্ষেত্র দিয়ে আপডেট করেছি।
ব্র্যান্ডান

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

21
জোশুয়া ওয়ার্নারের উত্তরটি সঠিক হিসাবে চিহ্নিত হওয়া উচিত। কোনও স্ট্যাশকে মার্জ করতে, আপনার পরিবর্তনগুলি মঞ্চ করুন, স্ট্যাশ প্রয়োগ করুন, যে কোনও দ্বন্দ্ব মোকাবেলা করুন এবং তারপরে (যদি ইচ্ছা হয়) আপনার পরিবর্তনগুলি স্টেস্টেজ করুন।
ভ্রূ

4
"আপনি পরিবর্তনগুলি সংশোধন করতে পারেন, স্ট্যাশ প্রয়োগ করতে পারেন, আবার প্রতিশ্রুতিবদ্ধ করতে পারেন এবং যদি আপনি সত্যিই দু'টি প্রতিশ্রুতি না চান তবে গিট রিবেস ব্যবহার করে এই দুটি কমান্ড স্কোয়াশ করতে পারেন, তবে এটির জন্য এটি আরও বেশি সমস্যা হতে পারে" " এর পরিবর্তে আপনি এটি করতে পারেন: পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন, স্ট্যাশ প্রয়োগ করুন এবং তারপরে git commit --amend
গ্যাবে

27

আমি যা চাই তা হ'ল বর্তমান পরিবর্তনগুলির সাথে আমার স্ট্যাশড পরিবর্তনগুলিকে একীভূত করার একটি উপায়

এটি করার জন্য এখানে আরও একটি বিকল্প রয়েছে:

git stash show -p|git apply
git stash drop

git stash show -pসর্বশেষ সংরক্ষিত স্ট্যাশের প্যাচটি প্রদর্শন করবে। git applyএটি প্রয়োগ করবে মার্জ হয়ে যাওয়ার পরে, মার্জ হওয়া স্ট্যাশ দিয়ে বাদ দেওয়া যায় git stash drop


1
এর জন্য ধন্যবাদ - আমি জানি না কেন git stash pop
মার্জগুলি

বর্ধিত সংস্করণ: git stash show -p --no-color | git apply --3way( --3way= প্যাচ ব্যর্থ হলে 3-ওয়ে মার্জ করে পিছিয়ে পড়ুন)।
দিমিত্রিসান্ডালভ

কিন্তু git stash show -pএকটি পরিবর্তন তৈরি করে stashed বিষয়বস্তুর মধ্যে এবং ফিরে কমিট যখন লুকোবার জায়গা এন্ট্রি প্রথম তৈরি করা হয়েছে । সুতরাং এটি ওপ্রেড করে ওপিং-এর কার্যকারী ফাইলকে পরিবর্তন করে।
পল এফ উড

ওভাররাইট কেন? বিবাদ ছাড়াই যদি সম্ভব হয় তবে এর সাথে উত্পাদিত ডিফটি সংহত করে দেওয়া git stash show -pহবে git apply
ks1322

1

আমি এটি করার git addউপায়টি প্রথমে এটিই git stash apply <stash code>। এটি সবচেয়ে সহজ উপায়।


3
এটি কীভাবে গৃহীত উত্তরের টিএল, ডাঃ এর সঠিক অনুলিপি নয়?
রোমেনভ্যালেরি

0

@ ব্র্যান্ডনের পরামর্শ অনুসারে, আশেপাশে যাওয়ার জন্য আমার যা করা দরকার তা এখানে

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

এই প্রক্রিয়া অনুসরণ করুন:

git status  # local changes to `file`
git stash list  # further changes to `file` we want to merge
git commit -m "WIP" file
git stash pop
git commit -m "WIP2" file
git rebase -i HEAD^^  # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^
# mark the second commit to squash into the first using your EDITOR
git reset HEAD^

এবং আপনাকে সম্পূর্ণরূপে একীভূত স্থানীয় পরিবর্তনগুলিতে ছেড়ে fileদেওয়া হবে, আরও কাজ / ক্লিনআপ করতে প্রস্তুত বা একটি ভাল প্রতিশ্রুতিবদ্ধ করতে। অথবা, যদি আপনি জানেন যে মার্জ করা সামগ্রীগুলি fileসঠিক হবে তবে আপনি কোনও উপযুক্ত বার্তা লিখে এড়িয়ে যেতে পারেন git reset HEAD^


0

হতে পারে, ... হ্যাঁ ... একটি শাখা থেকে (ডিফ্টোলের মাধ্যমে) মার্জ করা খুব খারাপ ধারণা নয়!

> current_branch=$(git status | head -n1 | cut -d' ' -f3)
> stash_branch="$current_branch-stash-$(date +%yy%mm%dd-%Hh%M)"
> git stash branch $stash_branch
> git checkout $current_branch
> git difftool $stash_branch

0

আপনি সহজেই পারেন

  1. আপনার বর্তমান পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ
  2. আপনার স্ট্যাশ আনস্টাশ করুন এবং বিরোধগুলি সমাধান করুন
  3. স্ট্যাশ থেকে পরিবর্তন প্রতিশ্রুতিবদ্ধ
  4. আপনি আসছেন এমন প্রতিশ্রুতি দেওয়ার জন্য সফট রিসেট (সর্বশেষ সঠিক প্রতিশ্রুতি)

-1

আরেকটি বিকল্প হ'ল স্থানীয় আপত্তিহীন পরিবর্তনগুলির আরেকটি "গিট স্ট্যাশ" করা, তারপরে দুটি গিট স্ট্যাশগুলি একত্রিত করুন। দুর্ভাগ্যক্রমে গিটের কাছে সহজেই দুটি স্ট্যাশ একত্রিত করার উপায় নেই। সুতরাং একটি বিকল্প হ'ল দুটি .ডিফ ফাইল তৈরি করা এবং সেগুলি দুটি প্রয়োগ করা - যাতে এটি অতিরিক্ত প্রতিশ্রুতি না দেয় এবং দশ ধাপের প্রক্রিয়া জড়িত না: |

কীভাবে: https://stackoverflow.com/a/9658688/32453


এটি একটি ডিফ প্রয়োগ করার সমস্যাটিকে দুটি ডিফ প্রয়োগ করার সমস্যায় পরিণত করে। অতিরিক্তভাবে, গৃহীত সমাধানটি কোনও প্রতিশ্রুতিবদ্ধ না, কেবল একটি পর্যায় এবং এটি কেবল একটি একক কমান্ড (গিট অ্যাড)। (আমি ডাউনভিটার নই।)
আইকে

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