কমিটমেন্ট ছাড়া গিট স্ট্যাশ বিরোধ কীভাবে সমাধান করবেন?


494

যেমন এই প্রশ্নে জিজ্ঞাসা করা হয়েছে , আমি আরও জানতে চাই git stash popযে কোনও প্রতিশ্রুতিতে সমস্ত পরিবর্তন সংযোজন না করে কীভাবে বিরোধের সমাধান করা যায় (যেমন "গিট স্ট্যাশ পপ" যেমন কোনও বিবাদ না করে)।

আমার বর্তমান পদ্ধতিটি খুব অসাধারণ, কারণ আমি এটি এইভাবে করি:

git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>

[আপডেট] এটি পুনরুত্পাদন করার একটি উপায়:

mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status

2016-06-27: উদাহরণস্বরূপ 'তৃতীয়' নামে একটি নতুন ফাইল যুক্ত হয়েছে যাতে দেখানো যায় যে সিসি থেকে সমাধানের মতো কাজগুলি কেবল খালি শিরোনামের জন্যই কাজ করে তবে প্রাথমিক সমস্যাটি ঠিক করবেন না যে শিরোনামের মতো সামগ্রী নেই initial একটি জন্য git stash popএকটি দ্বন্দ্ব ছাড়াই।


সুতরাং আপনি কী git addসমাধান করেছেন সংঘাতের ফাইলগুলি কার্যকরভাবে তা সূচকে রেখেছেন এবং আপনি কি আমাদের সূচীতে না রাখতে চান?
রোমান

হ্যা, তা ঠিক. আমি কেবল সেই আচরণটিই চাই git stash popযখন কোনও বিরোধ না ঘটে (তবে বিজ্ঞপ্তি দিয়ে কোন ফাইলগুলিকে একীভূত করা দরকার)।
সেভেন

2
এর উত্তরের মতো মনে হচ্ছে এখানে: stackoverflow.com/questions/3945826/git-stash-questions । চতুর্থ মন্তব্যে নির্বাচিত উত্তরে আদম ব্যাখ্যা করেছেন কেন গিট এটি করেন।
প্যাট্রিক

@Patrick এই তথ্যের জন্য আপনাকে ধন্যবাদ - তাই মনে হয় সেখানে কোন সমাধান কারণ তার "নকশা দ্বারা" উপলব্ধ করা হবে
সেভেন

উত্তর:


506

অন্যান্য উত্তর অনুসরণ করবেন না

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

পরিষ্কার সমাধান

নীচের সমাধানটি আমার কাছে আরও পরিচ্ছন্ন বলে মনে হচ্ছে এবং এটি নিজে গিট দ্বারাও প্রস্তাবিত - git statusএকটি সংঘাতের সাথে সংগ্রহস্থলের মধ্যে চালিত করার চেষ্টা করুন :

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

সুতরাং গিটের পরামর্শ অনুসারে যা করা যাক (কোনও অকেজো প্রতিশ্রুতি না দিয়ে):

  1. ম্যানুয়ালি (বা কিছু সংশ্লেষের সরঞ্জাম ব্যবহার করে নীচে দেখুন) দ্বন্দ্ব (গুলি) সমাধান করুন।
  2. ব্যবহারের git resetচিহ্ন দ্বন্দ্ব (গুলি) সমাধান এবং unstage পরিবর্তন হিসাবে। আপনি কোনও পরামিতি ছাড়াই এটি সম্পাদন করতে পারেন এবং গিট সূচি থেকে সবকিছু সরিয়ে ফেলবে। আপনাকে git addআগে মৃত্যুদণ্ড কার্যকর করতে হবে না ।
  3. শেষ অবধি git stash drop, স্ট্যাশ দিয়ে মুছে ফেলুন , কারণ গিট বিরোধের কারণে তা করেন না।

কমান্ড-লাইনে অনুবাদিত:

$ git stash pop

# ...resolve conflict(s)

$ git reset

$ git stash drop

ডিফল্ট আচরণের ব্যাখ্যা

সংঘাত হিসাবে চিহ্নিত হিসাবে দুটি উপায় আছে: git addএবং git reset। যদিও git resetসূচক থেকে সমস্যাগুলি সমাধান করা এবং অপসারণ ফাইল হিসেবে চিহ্ন দ্বন্দ্ব git addএছাড়াও চিহ্ন সমাধান হিসাবে দ্বন্দ্ব, কিন্তু সূচক ফাইল রাখে।

কোনও বিরোধ নিষ্পত্তি হওয়ার পরে সূচীতে ফাইল যুক্ত করা উদ্দেশ্য। এইভাবে আপনি পূর্ববর্তী স্ট্যাশ থেকে পরিবর্তনগুলি এবং বিরোধটি সমাধান হওয়ার পরে আপনি যে পরিবর্তনগুলি করেছেন তা পার্থক্য করতে পারেন। যদি আপনি এটি পছন্দ না করেন তবে আপনি সর্বদা git resetসূচক থেকে সমস্ত কিছু সরিয়ে দিতে ব্যবহার করতে পারেন।

সরঞ্জামগুলি মার্জ করুন

আমি অত্যন্ত কোন ব্যবহার করার প্রস্তাব 3-উপায় একত্রীকরণ সরঞ্জাম সমাধানে দ্বন্দ্ব, যেমন জন্য KDiff3 , মেশানো ইত্যাদি পরিবর্তে নিজে করছেন। এটি সাধারণত সমস্ত বা সংখ্যাগরিষ্ঠ বিবাদগুলি স্বয়ংক্রিয়ভাবে সমাধান করে। এটি বিশাল সময় সাশ্রয়কারী!


32
@ কামালপাল যখন মনে হয় git stash popবিরোধের সাথে ব্যর্থ হয় তখন এটির দরকার হয়।
এমিল বার্গারন

21
@ কমলপাল হ্যাঁ, গীত আপনাকে জানিয়েছে যে বিরোধের ক্ষেত্রে স্ট্যাশ বাদ দেওয়া হয়নি। এবং প্রশ্নটি এই জাতীয় কেস সম্পর্কে ছিল, সুতরাং আপনি যদি এই স্ট্যাশ রাখতে না চান তবে আপনার সত্যিই মৃত্যুদণ্ড কার্যকর করা দরকারgit stash drop
ডেভিড ফেরেঞ্জি রোগোয়ান

@ ডেভিডফেরেঞ্জি রোগোয়ান গিট আমাকে স্ট্যাটাস এন্ট্রি হ্রাস করেনি তা অবহিত করে নি। সংস্করণ 2.17.1 এখানে।
রবার্ট সিমার

298

ধরুন আপনার উত্স থেকে টানতে আপনার পরিবর্তনগুলি যেখানে স্ট্যাশ করেছেন সেখানে এই দৃশ্য রয়েছে। সম্ভবত আপনার স্থানীয় পরিবর্তনগুলি debug: trueকিছু সেটিংস ফাইলে রয়েছে। এখন আপনি টানছেন এবং কেউ সেখানে একটি নতুন সেটিং চালু করেছেন, বিরোধ তৈরি করছে।

git status বলেছেন:

# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      src/js/globals.tpl.js
no changes added to commit (use "git add" and/or "git commit -a")

ঠিক আছে. গিটের পরামর্শ অনুসারে আমি সিদ্ধান্ত নিয়েছিলাম: আমি দ্বন্দ্ব সমাধান করেছি এবং প্রতিশ্রুতিবদ্ধ:

vim src/js/globals.tpl.js
# type type type …
git commit -a -m WIP   # (short for "work in progress")

এখন আমার ওয়ার্কিং কপিটি আমি চাই সেই রাজ্যে রয়েছে তবে আমি একটি প্রতিশ্রুতি তৈরি করেছি যা আমি চাই না। আমি আমার কাজের অনুলিপি পরিবর্তন না করে কীভাবে এই প্রতিশ্রুতি থেকে মুক্তি পাব? অপেক্ষা করুন, এটির জন্য একটি জনপ্রিয় কমান্ড আছে!

git reset HEAD^

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

তবে আরও একটি জিনিস বাকী রয়েছে: এর জন্য ম্যান পেজটি git stash popআমাদের মনে করিয়ে দেয় যে "রাষ্ট্র প্রয়োগ প্রয়োগের সাথে বিরোধের সাথে ব্যর্থ হতে পারে; এক্ষেত্রে এটি স্ট্যাশ তালিকা থেকে সরানো হয় না You আপনাকে হাত দ্বারা দ্বন্দ্বগুলি সমাধান করতে হবে এবং git stash dropতারপরে ম্যানুয়ালি কল করতে হবে ।" সুতরাং আমরা এখন ঠিক কি এটি:

git stash drop

এবং সম্পন্ন।


34
ইচ্ছাকৃতভাবে রিসেট হেড commit ... করতে হবে যা কেবলমাত্র কার্যক্ষম গাছকেই প্রভাবিত করে।

6
কেন কেবল দ্বন্দ্বগুলি সমাধান করে তারপরে git add <resolved conflict files>অনুসরণ করা হবে না git reset HEAD?
বোল্টজম্যানব্রেন

পরামর্শের জন্য ধন্যবাদ তবে এটি প্রাথমিক সমস্যাটি ঠিক করে না যে git stash popএটি কোনও সংঘাত ছাড়াই একই আচরণ নয় । বিরোধী কাজ করার আগে কেবল HEAD এ অন্য একটি ফাইল যুক্ত করুন git stash popএবং আপনার git commit -a -m WIPপ্রতিশ্রুতিতে নতুন ফাইলটি যুক্ত করুন। তবে কোনও দ্বন্দ্ব ছাড়াই কেবল নতুন ফাইলটি HEAD এ থাকবে তবে git stash popফাইলগুলি নয়।
সোভেন

7
আমি প্রথমে কমিটমেন্ট করা পূর্বে কমিটমেন্ট পূর্বাভাস করা জরুরি বলে মনে করি না। কেবল দাউদ ফেরেঞ্জির উত্তর থেকে পুনরায় সেট করুন উত্তরটি একই করবে
ভ্লাদক্রাস

3
উইন্ডোজ ব্যবহারকারীদের জন্য, এটি ^একটি বিশেষ রেখার ধারাবাহিকতা হিসাবে ব্যবহৃত হয় এবং আপনাকে আরও বেশি করে বসে রাখবে? কমান্ড প্রয়োগের পরিবর্তে প্রম্পট করুন। এর পরিবর্তে ব্যবহার করুন: git reset --soft HEAD~1। দেখুন কিভাবে কি করতে-ই-ডিলিট-unpushed-Git-করে?
mrfelis

87

দ্বন্দ্ব সমাধানের জন্য আপনি যে পরিবর্তনগুলি করেছেন তা যুক্ত করার পরিবর্তে, আপনি git reset HEAD fileনিজের পরিবর্তনগুলি সংরক্ষণ না করেই বিরোধটি সমাধান করতে ব্যবহার করতে পারেন ।

তবে আপনাকে এই আদেশটি দুবার চালাতে হতে পারে। একবার সংঘাতকে সমাধান হিসাবে চিহ্নিত করার জন্য এবং একবার সংঘাত সমাধানের রুটিনের দ্বারা শুরু হওয়া পরিবর্তনগুলি আনস্টেজ করার জন্য।

এটা সম্ভব যে সেখানে একটি রিসেট মোড থাকা উচিত যা এই দুটি জিনিস একই সাথে করে, যদিও এখন নেই।


2
রিসেট মোডটি আমি সন্ধান করেছি - অন্যান্য কর্মক্ষেত্রগুলি আমি বর্ণিত মত এবং 5 টিরও বেশি ফাইলের জন্য ব্যবহারিক নয় like
সেভেন

25
এবং "গিট স্ট্যাশ পপ" শেষ করতে পরে "গিট স্ট্যাশ ড্রপ" ব্যবহার করুন।
ডেভিড লিউ

2
যদিও প্রশ্নটি এর জন্য স্পষ্টভাবে জিজ্ঞাসা করে না, তবে "গিট স্ট্যাশ ড্রপ" অন্তর্ভুক্ত করার জন্য উত্তরটি আপডেট করা কার্যকর হতে পারে কারণ কোনও বিরোধের ক্ষেত্রে স্ট্যাশ স্বয়ংক্রিয়ভাবে বাদ দেওয়া হয় না।
অভিষেক পাঠক

29
git checkout stash -- .

আমার জন্য কাজ।

বিঃদ্রঃ : এটি বিপজ্জনক হতে পারে যেহেতু এটি স্ট্যাশ থেকে পরিবর্তনগুলি আপনার কার্যকরী অনুলির সাথে একীভূত করার চেষ্টা করে না, তবে পরিবর্তে স্ট্যাশ করা ফাইলগুলির সাথে এটি ওভাররাইট করে। সুতরাং আপনি আপনার আপমুক্ত পরিবর্তনগুলি হারাতে পারেন।


"গিট টান - অটোস্ট্যাশ" যখন অযাচিত মার্জ কমিটস এবং গিট চেকআউট স্ট্যাশ পরিচয় করিয়ে দেয় - এটি সাহায্য করে। নিঃশর্তভাবে স্ট্যাশ থেকে দ্বন্দ্বগুলি ওভাররাইট করে
আলেক ইস্তমিন

11
git add .
git reset

git add . আপনি দ্বন্দ্ব সমাধান করেছেন বলে গিটকে জানিয়ে সমস্ত ফাইল মঞ্চস্থ করবে

git reset প্রতিশ্রুতি তৈরি না করেই মঞ্চস্থ সমস্ত ফাইল আনস্টেজ করা হবে


এটি আসলে একটি খারাপ উত্তর নয়, এটা প্রায় কাছাকাছি মত git add -uতারপরgit reset
ebob

4

দেখে মনে হচ্ছে এটির উত্তর আপনি সন্ধান করছেন এটি আমি ব্যক্তিগতভাবে এখনও চেষ্টা করি নি তবে মনে হয় এটি কৌশলটি করতে পারে। এই কমান্ডের সাহায্যে জিআইটি তাদের সমস্ত প্রতিশ্রুতিবদ্ধতার জন্য যুক্ত করার চেষ্টা না করেই আগের মতো পরিবর্তনগুলি প্রয়োগ করার চেষ্টা করবে।

git stash apply --index

এখানে সম্পূর্ণ ব্যাখ্যা:

http://git-scm.com/book/en/Git-Tools-Stashing


এই ইঙ্গিতটির জন্য ধন্যবাদ, তবে আমি যখন ইতিমধ্যে করেছি তখন এটি সাহায্য করবে না git stash pop- বা এটিকে ফিরিয়ে নেওয়ার কোনও উপায় আছে এবং git stash apply --indexযখন আমি জানতে পেরেছি যে এটি git stash popকোনও দ্বন্দ্বের মধ্যে চলে যাবে?
সোভেন

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

3
আপনি যদি এখানে এই পোস্টের নীচের দিকে লক্ষ্য করেন তবে এটি বলছে যে আপনি যদি চালনা করেন git stash popএবং এটি বিরোধের সাথে শেষ হয় তবে স্ট্যাশ সরানো হয় না ... সুতরাং আপনি git reset --hardপপটিকে পূর্বাবস্থায় ফেরাতে পারেন এবং তারপরে আমার প্রস্তাবিত সমাধানটি চেষ্টা করতে পারেন ।
মার্কো পন্টি

সবেমাত্র এটি চেষ্টা করে দেখুন বিরোধী অবস্থায় আপনার ফাইল থাকার পরে এটি কাজ করে না। এমনকি যদি আপনি ম্যানুয়ালি সংঘাতের সমাধান করেন।
স্যাম3 কে

2

git stash branchকাজ করবে, যা আপনার জন্য একটি নতুন শাখা তৈরি করে, আপনি যখন আপনার কাজটি স্থির করে রেখেছিলেন তখন আপনি যে প্রতিশ্রুতিটি করেছিলেন তা পরীক্ষা করে, সেখানে আপনার কাজটি পুনরায় প্রয়োগ করে, এবং যদি এটি সফলভাবে প্রয়োগ হয় তবে স্ট্যাশকে বাদ দেয়। এটি পরীক্ষা করুন


2

আমি যে দ্রুততম উপায়টি খুঁজে পেয়েছি তা হল দ্বন্দ্ব সমাধান করা, তারপরে git add -uএবং তারপরে git reset HEAD, যা এমনকি কোনও অঙ্গীকারকে জড়িত করে না।


1

গিট স্ট্যাশ প্রশ্ন অনুসারে , সংঘাতের সমাধানের পরে,git add <file> সঠিক পদক্ষেপ।

এই মন্তব্যটি পড়ার পরে আমি বুঝতে পেরেছিলাম যে পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে সূচকে (নকশায়) যুক্ত হয়। এজন্য git add <file>দ্বন্দ্ব নিরসন প্রক্রিয়াটি সম্পূর্ণ করে।


-1

এটি করার সর্বোত্তম উপায় নয় তবে এটি কাজ করে:

$ git stash apply
$ >> resolve your conflict <<
$ >> do what you want to do with your code <<
$ git checkout HEAD -- file/path/to/your/file

এই উত্তরটি আমার কাছে স্পষ্ট ভুল বলে মনে হচ্ছে, কারণ এতে সমস্ত পরিবর্তন বাতিল হয়ে যাবে discard file/path/to/your/file কাছে স্পষ্টরূপে , যা ওপি বলেছিল, এএফএইউ
ওরোমাইলুইগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.