"গিট টান" স্বয়ংক্রিয়ভাবে লুকিয়ে থাকা এবং পেন্ডিং পরিবর্তনগুলি পপ করতে পারে?


121

আমি এটি সমাধান করতে জানি:

user@host$ git pull
Updating 9386059..6e3ffde
error: Your local changes to the following files would be overwritten by merge:
    foo.bar
Please, commit your changes or stash them before you can merge.
Aborting

কিন্তু দিন একটি উপায় নয় git pullকি stashএবং popআমার জন্য নাচ?

যদি এই কমান্ডটির আলাদা নাম থাকে তবে ঠিক আছে।

এর জন্য শেল ওরফে তৈরি git stash; git pull; git stash popকরা একটি সমাধান, তবে আমি আরও ভাল সমাধান অনুসন্ধান করি।


একটি গিট ওরফে সম্পর্কে কি ?
isois

20
চলমান git stash; git pull; git stash popপ্রোগ্রামের মাধ্যমে, বিপজ্জনক, কারণ যদি লুকিয়ে রাখার জন্য কিছুই, git stashকোন সমিতি হবে, কিন্তু git stash popগত লুকোবার জায়গা (যদি থাকে), যা প্রায় অবশ্যই পপ আপ করবে না আপনি যা চান তা। ব্যবহারকারীর টেরেকের স্ট্যাক ওভারফ্লোতে এই সম্পর্কে দুর্দান্ত পোস্ট রয়েছে, তবে আমি এটি খুঁজে পাচ্ছি না ...
jub0bs

2
@ জুবস এই এক? stackoverflow.com/a/20412685/6309 নাকি এটি? stackoverflow.com/a/20480591/6309
VonC

1
@ গুয়েতলি আমি আপনার প্রশ্নের প্রতিলিপি দিচ্ছিলাম না, আমি কেবল যুবসের মন্তব্যে উত্তর দিচ্ছিলাম।
ভনসি 13'15

2
আরও এক ধাপ হিসাবে, স্ট্যাশগুলি টান দেওয়ার পরে পরিষ্কারভাবে প্রয়োগ করা যেতে পারে তবেই অপারেশনটি সফল হবে। যদি দ্বন্দ্ব হয়, তবে পুরো অপারেশনটি পরমাণুর সাথে ব্যর্থ হয় যাতে গাছটি পরিবর্তন না হয়। এটিই আমি করতে চাই: হয় আমার স্থানীয়গুলিতে সংযুক্ত হওয়াগুলির সাথে পরিবর্তনগুলি নীচে নামিয়ে দিন, নাহলে কোনও ত্রুটির সাথে ব্যর্থ হন এবং আমাকে কী করতে হবে তা নিজেই সিদ্ধান্ত নিতে দিন। এই জাতীয় গিট 'লেনদেন' কি সম্ভব?
এড অ্যাভিস

উত্তর:


184

গিট 2.6+ এর জন্য (28 সেপ্টেম্বর 2015 প্রকাশিত হয়েছে)

দ্য কেবল git config যা আগ্রহী হবে সেটিংটি হ'ল:

rebase.autoStash

(গিট 2.27, কিউ 22020 সহ, আপনার কাছে এখন রয়েছে merge.autostash, নীচে দেখুন)

সত্য হিসাবে সেট করা হলে, অপারেশন শুরু হওয়ার আগে স্বয়ংক্রিয়ভাবে একটি অস্থায়ী স্ট্যাশ তৈরি করুন এবং অপারেশন শেষ হওয়ার পরে এটি প্রয়োগ করুন।
এর অর্থ হ'ল আপনি কোনও নোংরা ওয়ার্কট্রিতে রিবেস চালাতে পারেন।

তবে, যত্ন সহ ব্যবহার করুন: সফল রিবেসের পরে চূড়ান্ত স্ট্যাশ অ্যাপ্লিকেশনটির কারণে অ-তুচ্ছ সংঘাত হতে পারে। মিথ্যা ডিফল্ট।

এর সাথে একত্রিত করুন:

pull.rebase

সত্য হয়ে গেলে, "গিট টান" চালানো হলে ডিফল্ট দূরবর্তী থেকে ডিফল্ট শাখাটি মার্জ করার পরিবর্তে আনীত শাখার শীর্ষে শাখাগুলি রিবেস করা হয়।

git config pull.rebase true
git config rebase.autoStash true

কোনও সরল git pullনোংরা গাছে এমনকি কাজ করার জন্য এটি যথেষ্ট ।
সেক্ষেত্রে কোনও উলের প্রয়োজন নেই।


দেখুন 53c76dc কমিট দ্বারা (04 জুলাই 2015) কেভিন Daudt ( Ikke)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট e69b408 , 17 আগস্ট 2015)

pull: rebase.autostashসক্ষম হলে নোংরা গাছের অনুমতি দিন

রিবাজে পরিবর্তনগুলি যখন কোনও খারাপ কাজের গাছের সাথে দেখা হয় তখন তা স্ট্যাশ করতে শিখেছে, কিন্তু git pull --rebaseতা হয় না।

যখন rebase.autostashসক্ষম গাছটি অসমর্থিত হয় তখনই তা যাচাই করুন ।


দ্রষ্টব্য: আপনি যদি অটোস্ট্যাশ ছাড়াই টানতে চান (যদিও rebase.autoStash trueসেট করা থাকে) তবে আপনার গিট 2.9 (জুন ২০১ 2016) রয়েছে:

 pull --rebase --no-autostash

দেখুন কমিট 450dd1d , 1662297 কমিট , 44a59ff কমিট , 5c82bcd কমিট , 6ddc97c কমিট , eff960b কমিট , কমিট efa195d (02 এপ্রিল 2016), এবং f66398e কমিট , c48d73b কমিট (21 মার্চ 2016) দ্বারা তানবিরা জৈন ( mehul2029)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে 7c137bb কমিট , 13 এপ্রিল 2016)

প্রতিশ্রুতিবদ্ধ f66398e বিশেষত অন্তর্ভুক্ত:

pull --rebase: --[no-]autostashপতাকা যুক্ত করুন

যদি rebase.autoStashকনফিগারেশন ভেরিয়েবল সেট করা থাকে git pull --rebaseতবে কমান্ড লাইন থেকে " " ওভাররাইড করার কোনও উপায় নেই ।

শেখান " git pull --rebase" --[no-]autostashকম্যান্ড লাইন পাতাকার যার বর্তমান মূল্য অগ্রাহ্য rebase.autoStash, যদি সেট করা হয়েছে। বিকল্পটি যেমন " git rebase" বোঝে --[no-]autostash, git rebaseতখন " git pull --rebase" "যখন" "ডাকা হয় তখন অন্তর্নিহিত বিকল্পটি পাস করার বিষয় ।


সতর্কতা: গিট 2.14 (Q3 2017) এর আগে " git pull --rebase --autostash" স্থানীয় ইতিহাস যখন দ্রুত প্রবাহে এগিয়ে যায় তখন " " স্বয়ংক্রিয়ভাবে স্ট্যাশ দেয় না।

দেখুন f15e7cf কমিট (01 জুন 2017) দ্বারা টিলার তাম্রকার ( tylerbrazier)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 35898ea , 05 জুন 2017)

pull: ff --rebase --autostashনোংরা রেপোতে কাজ করে

যখন git pull --rebase --autostashকোনও নোংরা রিপোজিটরিতে একটি দ্রুতগতির ফলাফল ঘটে তখন কিছুই অটোস্ট্যাস করা হয় নি এবং টান ব্যর্থ হয়।
আমরা দ্রুত-ফরোয়ার্ড করতে পারলে রিবেস চালানো এড়ানোর জন্য এটি একটি শর্টকাটের কারণে ঘটেছিল, তবে সেই কোডডে অটোস্ট্যাশ উপেক্ষা করা হয়।


আপডেট করুন: Mariusz Pawelski জিজ্ঞেস মন্তব্য একটি আকর্ষণীয় প্রশ্ন:

সুতরাং প্রত্যেকে autostashযখন আপনি রিবেস (বা pull --rebase) করবেন তখন লিখছেন ।

আপনি যখন মার্জগুলির সাথে সাধারণ টান করেন তবে কেউ অটোস্ট্যাশিংয়ের বিষয়ে বিবেচনা করে না ।
তাহলে কি তার জন্য কোনও স্বয়ংক্রিয় সুইচ নেই? নাকি আমি কিছু মিস করছি? আমি করা পছন্দ করি git pull --rebaseতবে ওপি " স্ট্যান্ডার্ড " গিট টান সম্পর্কে জিজ্ঞাসা করে

উত্তর:

মূল থ্রেড এই autostash বৈশিষ্ট্য নিয়ে আলোচনা, এটা আসল উভয় বাস্তবায়ন করা হয় git pull(একত্রীকরণ) এবং git pull --rebase

তবে ... জুনিও সি হামানো (গিট রক্ষণাবেক্ষণকারী) উল্লেখ করেছে যে:

pull-mergeসংজ্ঞা অনুসারে, এই বিষয়টিকে ট্রিগারকারী "বিরক্তি" উত্সাহিত করতে পারে এমন কিছু যদি হয় তবে সংশ্লেষের সাথে স্থানীয় পরিবর্তনটি ওভারল্যাপ হয় এবং এই অভ্যন্তরীণ "স্ট্যাশ পপ" সংযুক্তির ছোঁয়া পাথগুলিকে স্পর্শ করবে এবং এটি সম্ভবত "ড্রপড" এর ফলস্বরূপ নয় "তবে আরও বিরোধগুলি সমাধানের জন্য ছেড়ে দিন।

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

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

সুতরাং, একটি ক্লাসিক পুল-মার্জ সম্পর্কে, এটি আরও ভাল:

" git pull" চালানোর আগে কার্যনির্বাহী গাছের ডাব্লুআইপি'র প্রকৃতি সম্পর্কে ভাবতে ব্যবহারকারীকে উত্সাহিত করুন " "
এটি কি খুব জটিল একটি প্রাণী যা অন্যরা যা করছে তার মধ্যে হস্তক্ষেপ করতে পারে, বা এটি একটি তুচ্ছ পরিবর্তন যা সে লুকিয়ে রেখে তা ফিরিয়ে আনতে পারে?

যদি প্রাক্তন হয় তবে তিনি " checkout -b" না করা থেকে অনেক ভাল হয়ে উঠবেন, স্থানীয় পরিবর্তনটি কিছুটা আরও ভাল আকারে না নেওয়ানো অবধি কাজ চালিয়ে যান এবং মূল শাখায় যাওয়ার আগে "প্রতিশ্রুতিবদ্ধ" হন।

যদি দ্বিতীয়টি হয় তবে তিনি আরও ভাল করছেন:

  • " git pull",
  • এটি দ্বন্দ্ব খুঁজে পাওয়ার পরে, চালান
    • git stash,
    • git merge FETCH_HEAD এবং
    • git stash pop

বলা হচ্ছে, গিট 2.27 (কিউ 22020) এর সাথে, " git pull" যখন কোনও pull.rebaseকনফিগারেশন উপস্থিত নেই তখন সতর্ক করতে শিখেছি এবং না --[no-]rebaseদেওয়াও --ff-onlyহয় না (যা সংশ্লেষের ফলে ঘটবে)।

দেখুন d18c950 কমিট (10 মার্চ 2020) দ্বারা অ্যালেক্স Henrie ( alexhenrie)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে 1c56d6f কমিট , 27 মার্চ 2020)

pull: সতর্কতা অবলম্বন করুন যদি ব্যবহারকারী পুনরায় শোধ করতে হবে বা মার্জ করতে হবে তা না বলে

সাইন-অফ-বাই: অ্যালেক্স হেনরি

প্রায়শই নবাগত গিট ব্যবহারকারীরা " pull --rebase" বলতে ভুলে যান এবং প্রবাহ থেকে অহেতুক একত্রিত হয়ে শেষ হন।

তারা সাধারণত যা চায় তা হ'ল pull --rebaseসহজ ক্ষেত্রে " pull --ff-only" বা প্রধান ইন্টিগ্রেশন শাখাগুলির অনুলিপি আপডেট করার জন্য এবং তাদের কাজটি পৃথকভাবে পুনর্বাসিত করা। কনফিগারেশন পরিবর্তনশীল তাদের সহজ ক্ষেত্রেই সাহায্য করার জন্য বিদ্যমান, কিন্তু এই ব্যবহারকারীদের এটা সচেতন করতে কোন প্রক্রিয়া।
pull.rebase

--[no-]rebaseকমান্ড লাইন থেকে কোনও বিকল্প এবং কোনও pull.rebaseকনফিগারেশন ভেরিয়েবল না দেওয়া হলে একটি সতর্কতা বার্তা জারি করুন ।
যাঁরা কখনও " pull --rebase" চান না , যাদের বিশেষ কিছু করতে হয়নি, তাদের অসুবিধা হবে, তবে অসুবিধার জন্য মূল্য ব্যবহারকারী হিসাবে একবার দেওয়া হয়, যা বেশ কয়েকটি নতুন ব্যবহারকারীকে সহায়তা করার জন্য একটি যুক্তিসঙ্গত ব্যয় হওয়া উচিত।


গিট 2.27 (কিউ 22020) দিয়ে, " git merge" " --autostash" বিকল্পটি এবং নতুন merge.autostashসেটিংস শিখবে ।

দেখুন d9f15d3 কমিট , f8a1785 কমিট , a03b555 কমিট , 804fe31 কমিট , কমিট 12b6e13 , কমিট 0dd562e , কমিট 0816f1d , কমিট 9bb3dea , 4d4bc15 কমিট , কমিট b309a97 , f213f06 কমিট , 86ed00a কমিট , facca7f কমিট , be1bb60 কমিট , efcf6cf কমিট , c20de8b কমিট , কমিট bfa50c2 , কমিট 3442c3d , 5b2f6d9 কমিট (07 এপ্রিল 2020), 65c425a কমিট(04 এপ্রিল 2020), এবং fd6852c প্রতিশ্রুতিবদ্ধ , ডেন্টন লিউ ( ) দ্বারা 805d9ea (21 মার্চ 2020 ) প্রতিশ্রুতিবদ্ধ(দ্বারা একীভূত junio সি Hamano - - মধ্যে কমিট bf10200 , 29 এপ্রিল 2020)Denton-L
gitster

pull: মার্জ --autostash একত্রিত করতে

সাইন-অফ-বাই: ডেন্টন লিউ

আগে, --autostashশুধুমাত্র সঙ্গে কাজ git pull --rebase

যাইহোক, শেষ প্যাচগুলিতে, মার্জটিও শিখেছে --autostashতাই আমাদের আর এই বাধা থাকার কারণ নেই। একত্রীকরণের
জন্য টানতে শিখান --autostash, ঠিক যেমন এটি পুনর্বাসনের জন্য করেছিল।

এবং:

rebase: apply_autostash()সিকোয়েন্সার.সি থেকে ব্যবহার করুন

সাইন-অফ-বাই: ডেন্টন লিউ

apply_autostash()ফাংশন builtin/rebase.cঅনুরূপ যথেষ্ট apply_autostash()ফাংশন sequencer.cতারা প্রায় বিনিমেয়, এর ARG তারা গ্রহণ টাইপ জন্য ব্যতীত রয়েছে। করুন sequencer.cসংস্করণ extern এবং এটি রি-বেসের ফলে তাতে ব্যবহার করুন।

রিবাজ সংস্করণটি 6defce2b02 (" বিল্টিন রিবেস: সমর্থন ) এ চালু হয়েছিল--autostash বিকল্প", 2018-09-04, গীত v2.20.0-rc0 - একত্রীকরণ তালিকাভুক্ত ব্যাচ # 8 ) সি রূপান্তর করার শেল অংশ হিসেবে।
এটি ফাংশনটির সদৃশ হওয়ার বিকল্পটি বেছে নিয়েছিল কারণ, সেই সময়, আরও একটি অগ্রগতি প্রকল্প ছিল যেটি ইন্টারেক্টিভ রিবেসকে শেল থেকে সিতে রূপান্তরিত করেছিল এবং তারা তাদের সাথে সংঘর্ষ করতে চায় না sequencer.cসংস্করণটির রিফ্যাক্টরিং করে apply_autostash()
যেহেতু উভয় প্রচেষ্টা দীর্ঘ হয়েছে, আমরা এখনই তাদেরকে অবাধে একত্রিত করতে পারি।


২.৪.২ হিসাবে, এটি এখনও কার্যকর করা হয়নি। সম্ভবত কিছু দিন। rebase.autoStashরিবেস ব্যবহার করার সময়ই প্রযোজ্য। pull.rebaseটান ব্যবহার করার সময়ই প্রযোজ্য।
রেন্ডাল শোয়ার্জ

"কোনও নোংরা গাছে এমনকি সরল গিট টানের জন্য এটি যথেষ্ট হবে" " র‌্যান্ডাল যেমন মন্তব্য করেছেন, এটি এখনও সত্য নয়। বর্তমানের মাস্টারের পুল.সি এখনও চয়ন করে die_on_unclean_work_tree
প্রধান

1
@ প্রধানমন্ত্রীর সাথে আমি একমত আজ সকালে বাস্তবায়নটি মাস্টার হিসাবে পেয়েছে এবং গিটার 2.6-তে থাকা উচিত। আমি এটি পরিষ্কার করার জন্য উত্তরটি সম্পাদনা করেছি।
ভনসি

আমি নিশ্চিত করেছি যে অটোস্ট্যাশ গিটের সাথে কাজ করছে 2.5.5
জোশুয়া হাবলিট

1
সুতরাং আপনি rebase(বা pull --rebase) করার সময় প্রত্যেকে অটোস্ট্যাশ সম্পর্কে লিখছেন । আপনি যখন pullমার্জগুলির সাথে স্বাভাবিক করেন তখন কেউ অটোস্ট্যাশিংয়ের বিষয়ে বিবেচনা করে না । তাহলে কি তার জন্য কোনও স্বয়ংক্রিয় সুইচ নেই? নাকি আমি কিছু মিস করছি? আমি git pull --rebasegit pull
করণ

41

আগত অভিযাত্রীদের জন্য কয়েক সেকেন্ড বাঁচাতে, এখানে একটি সংক্ষিপ্তসার দেওয়া হয়েছে (@ ভনসিকে ধন্যবাদ):

git pull --rebase --autostash

6
কথাটি হ'ল: এক git config pull.rebase trueএবং পরে git config rebase.autoStash trueআপনার যা যা প্রয়োজন তা হ'ল git pull। শুধু git pull। অন্য কোনও বিকল্পের প্রয়োজন নেই।
ভোনসি

3
--autostashবিকল্পটির জন্য আপনার কমপক্ষে গিট ২.৯ প্রয়োজন বলে মনে হচ্ছে । -c rebase.autoStash=trueগীত 2.6 অনওয়ার্ড কাজ করে।
এনটিসি 2

15

উপরের মতামত অনুসারে, দুটি কনফিগার মান নির্ধারণ করা বর্তমানে কাজ করে না git pull, কারণ অটোস্ট্যাশ কনফিগারেশনটি কেবল আসল প্রত্যাবর্তনের ক্ষেত্রে প্রযোজ্য। এই গিট কমান্ডগুলি আপনি যা চান তা করুন:

git fetch
git rebase --autostash FETCH_HEAD

অথবা এটিকে একটি নাম হিসাবে সেট করুন:

git config alias.pullr '!git fetch; git rebase --autostash FETCH_HEAD'

তারপরে:

git pullr

অবশ্যই, এই উপনামটির পছন্দসই নামকরণ করা যেতে পারে।


7

গিট 2.6+ এর মাধ্যমে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

alias gup='git -c rebase.autoStash=true pull --rebase'

এটি পরিবর্তে --rebaseগিট-পুল ব্যবহার rebaseকরে merge, তাই সেটিংস / বিকল্পগুলি পছন্দ করে--ff-only প্রয়োগ করা হবে না।

আমি --ff-onlyডিফল্ট ( git pull --ff-only) দিয়ে টানতে একটি উপনাম ব্যবহার করছি , এবং gupদ্রুত-ফরোয়ার্ড একীভূত হওয়া সম্ভব না হলে বা স্ট্যাশড পরিবর্তন রয়েছে সে ক্ষেত্রে (উপরে থেকে) ব্যবহার করতে পারি ।


মধ্যে মূল পার্থক্য কি git pull --ff-onlyএবংgit pull pull --rebase --autostash
Alper

0

যেমনটি আপনি ইতিমধ্যে উল্লেখ করেছেন এটি করার উপায়। আপনি এটি টাইপ করতে এবং শর্টকাট ব্যবহার করতে বা এটি একটি একক লাইনে ব্যবহার করতে পারেন (এটিও একটি উপনাম হতে পারে)

git stash && git pull --rebase && git stash pop

এটি আপনার মতো একই কাজ করবে তবে একটি একক লাইনে (&&) এবং আপনি কি উপন্যাস হিসাবে সেট করেছেন এটি আরও ছোট হবে।

নীচের লাইনগুলি আপনি টান / ধাক্কা দেওয়ার আগে আগত / বহির্গামী পরিবর্তনগুলি প্রদর্শন করবে

git log ^master origin/master
git log master ^origin/master

8
এই stash popপদ্ধতিরটি অনিরাপদ: স্ট্যাশ করার মতো কিছু না থাকলে প্রথম কমান্ড কিছুই করবে না এবং তারপরে আগে থেকে কিছু এলোমেলো জিনিস আনস্টাশ করবে।
জন জুইনক

কেবল অতিরিক্ত স্পষ্ট করে বলা: এমনকি git stashকোনও কিছুকে স্ট্যাশ না করা সত্ত্বেও এটি কোনও ত্রুটিকোডকে "ফেরত" দেয় না যাতে &&& এখনও একটি পূর্ববর্তী স্ট্যাশকে সাথে git pullনিয়ে যায় git stash popএবং পপ করে। সুতরাং আপনি যদি নিশ্চিত হন যে এটি কিছু লুকিয়ে রাখে তবে এটি ব্যবহার না করা ভাল!
মুনলাইট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.