স্ট্যাশিং শুধুমাত্র গিটের মঞ্চ পরিবর্তন - এটি কি সম্ভব?


364

আমি কীভাবে আমার পর্যায়ক্রমে পরিবর্তনগুলি আটকে রাখতে পারি এমন কোন উপায় আছে? আমার যে দৃশ্যের সাথে সমস্যা হচ্ছে তা হ'ল আমি যখন একটি নির্দিষ্ট সময়ে বেশ কয়েকটি বাগে কাজ করেছি এবং বেশ কিছু স্টেস্টেড পরিবর্তন নেই। আমি এই ফাইলগুলি স্বতন্ত্রভাবে মঞ্চস্থ করতে, আমার .প্যাচ ফাইলগুলি তৈরি করতে এবং কোড অনুমোদিত না হওয়া পর্যন্ত এগুলি সরিয়ে রাখতে সক্ষম হতে চাই। এইভাবে অনুমোদিত হয়ে গেলে আমি আমার সম্পূর্ণ (বর্তমান) সেশনটি স্ট্যাশ করতে পারি, সেই বাগটি পপ করতে এবং কোডটি পুশ করতে পারি।

আমি কি এই ভুল পথে চলছি? আমি কীভাবে ভুল বুঝতে পারি যে গিট কীভাবে আমার প্রক্রিয়াটি সহজ করার জন্য অন্যান্য উপায়ে কাজ করতে পারে?


হ্যাঁ, আপনি সম্ভবত এই পরিস্থিতিতে পড়ার জন্য ভুল কিছু করছেন। এখনও একটি দরকারী প্রশ্ন। পরবর্তী ফিক্স শুরু করার আগে আপনার সত্যিকারের স্ট্যাশ বা শাখা করা উচিত। , স্পর্শকাতর, উত্তর স্ট্যাকওভারফ্লো.com/ a/ 50692885 সম্ভবত গিটে এটি পরিচালনা করার একটি ভাল উপায়। স্ট্যাশ নিয়ে ঘুরে বেড়ানো প্রায়শই আমার কর্মক্ষেত্রের কাছে অদ্ভুত জিনিসগুলি তৈরি করে যদি আমি উজান থেকে কমিটস টান করি।
স্যামুয়েল -স্লুন্ড

উত্তর:


469

হ্যাঁ, এটি ডাবল স্ট্যাশ দিয়ে সম্ভব

  1. আপনার স্ট্যাশ করা দরকার এমন সমস্ত ফাইল স্টেজ করুন।
  2. চালান git stash --keep-index। এই কমান্ডটি আপনার সমস্ত পরিবর্তনের ( স্টেজড এবং স্টেস্টেড না হওয়া ) সাথে স্ট্যাশ তৈরি করবে , তবে আপনার কার্যনির্বাহী ডিরেক্টরিতে ( পর্যায়ক্রমে স্টেজযুক্ত ) পর্যায়ক্রমিক পরিবর্তনগুলি ছেড়ে দেবে।
  3. চালান git stash push -m "good stash"
  4. এখন আপনার "good stash"করেছে কেবলমাত্র মঞ্চস্থ ফাইল

এখন যদি আপনার স্ট্যাশ করার আগে স্টেস্টেড না হওয়া ফাইলগুলির প্রয়োজন হয় তবে কেবল প্রথমে স্ট্যাশ প্রয়োগ করুন ( এটি দিয়ে তৈরি করা হয়েছে--keep-index ) এবং এখন আপনি স্ট্যাস করা ফাইলগুলি মুছে ফেলতে পারেন "good stash"

উপভোগ করুন


এটি মঞ্চস্থ না হওয়া সত্ত্বেও সাবমডিউলগুলিতে পরিবর্তনগুলি স্ট্যাশ করে। এই সমস্যা এড়ানোর একটি উপায় আছে কি?
rluks

1
এটি কোনওভাবে সমস্ত নতুন ফাইল (এমনকি মঞ্চস্থ) রেখে গেছে।
অরিমাস

8
অরিমাস, নতুন ফাইলগুলি স্ট্যাশ করতে আপনার -uসুইচটি ব্যবহার করা দরকার ।
গিরোমাইট

2
আপনি যখন প্রথম স্ট্যাশ পুনরায় প্রয়োগ করেন এবং সমস্ত পরিবর্তন ফিরে পাবেন তখন আপনি কেবল নিজের স্টেপ পরিবর্তনগুলি ব্যবহার করতে চান git stash apply --indexবিকল্পটি ব্যবহার করতে আগ্রহী । এটি আপনার আন (মঞ্চস্থ) অবস্থায় রাখার চেষ্টা করবে। এখন কার্যকারী গাছ থেকে অযাচিত পরিবর্তনগুলি সরিয়ে ফেলা সহজ।
ওটোমো

যদিও এই উত্তরটি ঠিক বলেছেন তা করার দরকার ছিল না, - কিপ-ইনডেক্স পতাকাটি জেনে রাখা খুব সহায়ক হয়েছিল।
অ্যারন ক্রাউস

128

সর্বশেষ গিট সহ আপনি --patchবিকল্পটি ব্যবহার করতে পারেন

git stash push --patch  

git stash save --patch   # for older git versions

এবং গিট স্ট্যাশগুলিতে যুক্ত হওয়া বা না রাখার জন্য আপনার ফাইলগুলির প্রতিটি পরিবর্তনের জন্য আপনাকে জিজ্ঞাসা করবে।
আপনি শুধু উত্তর yবাn

ডাবল স্ট্যাশের
জন্য ইউপিডি এলিয়াস :

git config --global alias.stash-staged '!bash -c "git stash --keep-index; git stash push -m "staged" --keep-index; git stash pop stash@{1}"'

এখন আপনি আপনার ফাইলগুলি মঞ্চস্থ করতে পারেন এবং তারপরে চালনা করতে পারেন git stash-staged
ফলস্বরূপ আপনার স্টেজ করা ফাইলগুলি স্ট্যাশে সংরক্ষণ করা হবে

আপনি যদি না স্টেজযুক্ত ফাইলগুলি রাখতে চান এবং সেগুলি স্ট্যাশ-এ স্থানান্তর করতে চান। তারপরে আপনি অন্য একটি নাম যুক্ত করে চালাতে পারেন git move-staged:

git config --global alias.move-staged '!bash -c "git stash-staged;git commit -m "temp"; git stash; git reset --hard HEAD^; git stash pop"'

17
প্রযুক্তিগতভাবে প্রশ্নের উত্তর দেয় না - তবে একটি দুর্দান্ত কৌশল যা নির্বাচক স্ট্যাশিং অর্জন করে।
অ্যালেক্সেরার্ডন

6
সম্মত হন, এটি ঠিক আছে, তবে এই প্রশ্নটি নিয়ে এখানে ধারণাটি হ'ল আমি যে পরিবর্তনগুলি নিয়ে কিছু করতে চাই তার মঞ্চস্থ করার সমস্ত কাজ আমি আগেই করেছি (স্পষ্টতই মূলত প্রতিশ্রুতিবদ্ধ হওয়া, তবে এখন স্ট্যাশ করতে চাই), কেবল খুঁজছেন না আবার শুরু থেকে কর.
স্টিভেন লু

4
নতুন তৈরি করা ফাইলগুলির জন্য কাজ করে না (শুধুমাত্র পরিবর্তিত ফাইলগুলিতে কাজ করে)
ডেরেক লিয়াং

@ ডেরেকলিয়াং: সদ্য নির্মিত ফাইলগুলি মোটেই ট্র্যাক হয় না। আপনি সম্ভবত পরীক্ষা করা উচিত -u|--include-untrackedবিকল্পgit-stash
Eugen Konkov

2
দস্তাবেজগুলি থেকে : " সংরক্ষণ করুন : এই বিকল্পটি গিট স্ট্যাশ পুশের পক্ষে অবতীর্ণ হয়েছে It এটি 'স্ট্যাশ পুশ' থেকে আলাদা কারণ এটি কোনও প্যাথস্পেক নিতে পারে না, এবং কোনও অপ-বিকল্প যুক্তি বার্তাটি তৈরি করে।"
বোরজভস্কি

53

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা বর্তমানে যা ঘটেছিল কেবল তা স্ট্যাশ করে এবং সমস্ত কিছু ফেলে দেয়। যখন আমি অনেকগুলি সম্পর্কিত নয় এমন পরিবর্তনগুলি শুরু করি তখন এটি দুর্দান্ত aw পছন্দসই অঙ্গীকারের সাথে সম্পর্কিত নয় কেবল স্টেজ করুন এবং ঠিক সেটাই।

(প্রথম দিকের জন্য বার্তোমিয়েজকে ধন্যবাদ)

#!/bin/bash

#Stash everything temporarily.  Keep staged files, discard everything else after stashing.
git stash --keep-index

#Stash everything that remains (only the staged files should remain)  This is the stash we want to keep, so give it a name.
git stash save "$1"

#Apply the original stash to get us back to where we started.
git stash apply stash@{1}

#Create a temporary patch to reverse the originally staged changes and apply it
git stash show -p | git apply -R

#Delete the temporary stash
git stash drop stash@{1}

7
আমি যোগ চাই যে আপনি নিম্নলিখিত দ্বারা একটি Git কমান্ড মধ্যে স্ক্রিপ্ট চালু করতে পারেন thediscoblog.com/blog/2014/03/29/custom-git-commands-in-3-steps
পেত্র বেলা

3
এটা অসাধারণ! কমান্ড লাইনে যদি তারা একটি প্রবেশ না করে তবে আমি স্ট্যাশ বর্ণনার জন্য ব্যবহারকারীকে অনুরোধ করার জন্য এটি টুইট করেছি: gist.github.com/brookinc/e2589a8c5ca33f804e4868f6bfc18282
ব্রুকিনক

1
এটি গিট 2.23.0 এর সাথে মোটেও কাজ করে না।

ধন্যবাদ, আমি উজ্জীবিত হয়ে এটিকে এখানে একটি উপাধিতে পরিণত করেছি: stackoverflow.com/a/60875067/430128
রমন

33

TL; DR কেবল -- $(git diff --staged --name-only)আপনার গিট <pathspec>প্যারামিটারের জন্য যুক্ত করুন

এখানে একটি সাধারণ এক-লাইনার দেওয়া হয়েছে:

git stash -- $(git diff --staged --name-only)

এবং কেবল একটি বার্তা যুক্ত করতে:

git stash push -m "My work in progress" -- $(git diff --staged --name-only)

V2.17.1 এবং v2.21.0.windows.1 এ পরীক্ষিত

সীমাবদ্ধতা:

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

6
আমি মনে করি বর্ণিত পরিস্থিতিতে এটি সর্বোত্তম বিকল্প: বোঝা সহজ এবং কোনও কালো জাদু জড়িত নয়!
লুইস

1
এটি বেশ ঝরঝরে। আমি এটির বাইরে একটি উপন্যাস তৈরি শেষ করেছি!
কল্পনা পঞ্চাল

তাদের ভোট কমিন রাখুন
S

@ কলেশপঞ্চল আপনি কি আপনার উপনামটি ভাগ করতে পারবেন? আমি কীভাবে এড়াতে পারি তা নিশ্চিত নই, সুতরাং এটি এর সঠিক ব্যাখ্যা দিচ্ছে না।
ইগোর নাদজ

2
পুনঃটুইট এটি এখানে: github.com/panchalklpesh/git-aliases/commit/…
কল্পনা পঞ্চাল

15

একই জিনিস সম্পাদন করতে ...

  1. আপনি যে ফাইলগুলিতে কাজ করতে চান তা কেবল স্টেজ করুন।
  2. git commit -m 'temp'
  3. git add .
  4. git stash
  5. git reset HEAD~1

গম্ভীর গর্জন। আপনি চান না এমন ফাইলগুলি স্ট্যাশ করা হয়েছে। আপনি যে ফাইলগুলি চান সেটি সব আপনার জন্য প্রস্তুত।


3
এটি সহজেই সেরা উত্তর এবং মনে রাখা সবচেয়ে সহজ
কেভিন

9

এই পরিস্থিতিতে আমি প্রতিটি ইস্যুর জন্য নতুন শাখা তৈরি করতে পছন্দ করি। আমি একটি উপসর্গ টেম্প ব্যবহার করি / তাই আমি জানি যে আমি এই শাখাগুলি পরে মুছতে পারি।

git checkout -b temp/bug1

ফাইলগুলি স্টেজ করুন যা বাগ 1 ঠিক করে এবং তাদের প্রতিশ্রুতিবদ্ধ।

git checkout -b temp/bug2

তারপরে আপনি চেরি প্রয়োজনীয় হিসাবে সংশ্লিষ্ট শাখাগুলি থেকে কমিটগুলি বেছে নিতে পারেন এবং একটি টানার অনুরোধ জমা দিতে পারেন।


2
অভিনব স্ট্যাশিং শব্দগুলি সম্পর্কে জেনে রাখা ভাল, বাস্তবে এটি এমন একটি পদ্ধতির মতো বলে মনে হয় যা আমার খুব কম হয় to
ryanjdillon

1
কমিট ব্যতীত পরিবর্তনগুলি পেতে অস্থায়ী প্রতিশ্রুতি ফিরে পাওয়ার জন্য "গিট চেরি-পিক tmpCommit" ব্যবহার করুন বা "গিট সংহত tmpCommit" + "গিট রিসেট হেড ^" করুন।
স্যামুয়েল -১slund

1
এই উত্তরটি মাঝে মাঝে দেখায় যে প্রদত্ত কৌশল দ্বারা এটি কীভাবে অর্জন করা যায় তার পরিবর্তে আপনি কী অর্জন করতে চান তা সরাসরি জিজ্ঞাসা করা ভাল। অস্থায়ী শাখা এবং চেরি-পিক জটিল পরিস্থিতিতে কার্যকর।
Guney Ozsan

যদি আপনি একটি ফাইল আংশিকভাবে মঞ্চস্থ, আপনি মূল শাখা ফিরে চলন্ত এবং তাদের পপিং আবার সামনে আপনার পরিবর্তনগুলি লুকিয়ে রাখার জন্য প্রয়োজন হবে
Jan-GLX

6

আপনি কেন একটি নির্দিষ্ট বাগের জন্য পরিবর্তন প্রতিশ্রুতিবদ্ধ করেন না এবং সেই প্রতিশ্রুতি এবং এর পূর্বসূরীর থেকে কোনও প্যাচ তৈরি করেন না?

# hackhackhack, fix two unrelated bugs
git add -p                   # add hunks of first bug
git commit -m 'fix bug #123' # create commit #1
git add -p                   # add hunks of second bug
git commit -m 'fix bug #321' # create commit #2

তারপরে, উপযুক্ত প্যাচগুলি তৈরি করতে, ব্যবহার করুন git format-patch:

git format-patch HEAD^^

এটি দুটি ফাইল তৈরি করবে: 0001-fix-bug-123.patchএবং0002-fix-bug-321.patch

অথবা আপনি প্রতিটি বাগের জন্য পৃথক শাখা তৈরি করতে পারেন, যাতে আপনি পৃথকভাবে বাগ ফিক্সগুলি মার্জ করতে বা পুনরায় চালু করতে পারেন, বা এমনকি যদি তারা কাজ না করে তবে এগুলি মুছুন।


2

git stash --keep-index এটি একটি উত্তম সমাধান ... এটি বাদ দেওয়া পথগুলিতে সঠিকভাবে কাজ না করে যা গিট 2.23 (Q3 2019) এ স্থির করা হয়েছে

দেখুন b932f6a কমিট (16 জুলাই 2019) দ্বারা টমাস Gummerer ( tgummerer)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট f8aee85 , 25 জুলাই 2019)

stash: মুছে ফেলা ফাইলগুলির সাথে হ্যান্ডলিং ঠিক করুন --keep-index

git stash push --keep-index সূচক এবং ডিস্ক উভয়ই সূচকে যুক্ত হওয়া সমস্ত পরিবর্তনগুলি রাখার কথা।

কোনও ফাইলকে সূচক থেকে সরানো হলে বর্তমানে এটি সঠিকভাবে আচরণ করে না।
এটি ডিস্কে মুছে ফেলার পরিবর্তে, ** - কিপ -ইনডেক্স ফাইলটি পুনরুদ্ধার করে * **

git checkoutনো-ওভারলে মোডে ' ' ব্যবহার করে সেই আচরণটি ঠিক করুন যা বিশ্বস্ততার সাথে সূচক এবং কার্যক্ষম গাছটিকে পুনরুদ্ধার করতে পারে।
এটি কোডটিও সরল করে।

নোট করুন যে এটি যদি অচিহ্নযুক্ত ফাইলের একই নাম থাকে তবে সূচি মুছে ফেলা এমন ফাইলের ওভাররাইট করা হবে।


2

গিটে কেবল সূচি (স্টেজ পরিবর্তনগুলি) স্ট্যাশ করা যতটা হওয়া উচিত তার চেয়ে বেশি কঠিন। আমি @ জো-এর উত্তর ভালভাবে কাজ করার উত্তর খুঁজে পেয়েছি এবং এর একটি সামান্য পরিবর্তনকে এই ওরফে পরিণত করেছি:

stash-index = "!f() { \
  git stash push --quiet --keep-index -m \"temp for stash-index\" && \
  git stash push \"$@\" && \
  git stash pop --quiet stash@{1} && \
  git stash show -p | git apply -R; }; f"

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

স্ট্যাশ করার বিপরীত সমস্যার জন্য কেবল অচিহ্নবদ্ধ পরিবর্তন (উরফ stash-working) দেখুন এই উত্তরটি


1

একবারে বেশ কয়েকটি বাগে কাজ করা কি একেবারে প্রয়োজনীয়? এবং "একবারে," আমার অর্থ "একই সাথে একাধিক বাগের জন্য ফাইল সম্পাদনা করা" " কারণ আপনার যদি একেবারে এটির প্রয়োজন না হয়, আমি আপনার পরিবেশে একবারে কেবল একটি বাগে কাজ করব। এইভাবে আপনি স্থানীয় শাখা এবং পুনর্বাসনা ব্যবহার করতে পারেন, যা আমি জটিল স্ট্যাশ / স্টেজ পরিচালনা করার চেয়ে অনেক সহজ মনে করি।

ধরা যাক মাস্টার কমিট বি তে আছেন এখন বাগ # 1 এ কাজ করুন।

git checkout -b bug1

এখন আপনি শাখা বাগ 1 এ আছেন। কিছু পরিবর্তন করুন, প্রতিশ্রুতি দিন, কোড পর্যালোচনার জন্য অপেক্ষা করুন। এটি স্থানীয়, সুতরাং আপনি অন্য কাউকে প্রভাবিত করছেন না এবং গিট ডিফ্স থেকে কোনও প্যাচ তৈরি করা যথেষ্ট সহজ হওয়া উচিত।

A-B < master
   \
    C < bug1

এখন আপনি বাগ 2 নিয়ে কাজ করছেন। সঙ্গে মাস্টার ফিরে যান git checkout master। একটি নতুন শাখা তৈরি করুন git checkout -b bug2,। পরিবর্তন করুন, প্রতিশ্রুতি দিন, কোড পর্যালোচনার জন্য অপেক্ষা করুন।

    D < bug2
   /
A-B < master
   \
    C < bug1

আসুন আমরা ভেবে দেখি যে আপনি যখন পর্যালোচনার অপেক্ষায় রয়েছেন তখন অন্য কেউ মাস্টারকে ই-এফ করুন করে।

    D < bug2
   /
A-B-E-F < master
   \
    C < bug1

আপনার কোড অনুমোদিত হয়ে গেলে, আপনি নিম্নলিখিত পদক্ষেপগুলির সাথে মাস্টারকে এটি পুনরায় চালু করতে পারেন:

git checkout bug1
git rebase master
git checkout master
git merge bug1

এর ফলে নিম্নলিখিত ফলাফলগুলি হবে:

    D < bug2
   /
A-B-E-F-C' < master, bug1

তারপরে আপনি আপনার স্থানীয় বাগ 1 শাখাটি টিপতে পারেন, মুছে ফেলতে পারেন এবং আপনি চলে যাবেন। আপনার কর্মক্ষেত্রে একবারে একটি বাগ, তবে স্থানীয় শাখা ব্যবহার করে আপনার সংগ্রহশালা একাধিক বাগ পরিচালনা করতে পারে। এবং এটি একটি জটিল মঞ্চ / স্ট্যাশ নাচ এড়ায়।

মন্তব্যে সিটিটের প্রশ্নের উত্তর:

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

তাই git rebase -i

আপনি যখন একটি শাখাকে অন্যটিতে রিবেস করেন, আপনি এটি ইন্টারেক্টিভভাবে করতে পারেন (-i পতাকা)। আপনি যখন এটি করেন, প্রতিটি প্রতিশ্রুতি দিয়ে আপনি কী করতে চান তা বাছাই করার বিকল্প আপনার কাছে রয়েছে। প্রো গিট একটি দুর্দান্ত বই যা এইচটিএমএল ফর্ম্যাটেও অনলাইনে রয়েছে এবং এটি রিবেসিং এবং স্কোয়াশিংয়ের উপর একটি দুর্দান্ত বিভাগ রয়েছে:

http://git-scm.com/book/ch6-4.html

সুবিধার্থে আমি তাদের উদাহরণ ভারব্যাটিম চুরি করব। আপনার নীচের প্রতিশ্রুতিবদ্ধ ইতিহাস রয়েছে বলে ভান করুন এবং আপনি মাস্টারটির উপরে আবার স্কোয়াশ বাগ 1 পুনরায় চালু করতে চান:

    F < bug2
   /
A-B-G-H < master
   \
    C-D-E < bug1

আপনি টাইপ করার সময় আপনি কী দেখতে পাবেন তা এখানে git rebase -i master bug1

pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

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

pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit

হ্যাঁ, স্কোয়াশিং কিছুটা ব্যথা হয় তবে আমি স্ট্যাশগুলির ভারী ব্যবহারের জন্য এটি সুপারিশ করব।


1
বিস্তারিত পোস্টের জন্য ধন্যবাদ! এটি নিশ্চিত হয়ে আমার প্রচুর সমস্যা সমাধান করে - আমি দেখি একমাত্র সমস্যাটি হ'ল আমাদের বর্তমান দলটি অনুরোধ করেছে আমরা সমস্ত বিতরণ একক প্রতিশ্রুতিতে রাখি। :(
মিঃডুক

1
প্রোডাকশন রেপোতে যদি তাদের প্রয়োজন না হয় বা আপনার কাজের ইতিহাস না চান তবে এটি দুর্দান্ত: শাখাগুলি মার্জ করার চেয়ে আলাদা করে প্রয়োগ করে আপনার ট্র্যাকিংয়ের মাস্টার ইতিহাসকে কম করুন। আপনি কীভাবে একটি সজ্জিত-মাস্টার শাখা রাখতে পারেন যাতে প্রকৃত সংশ্লেষের ইতিহাস থাকে এবং সেখান থেকে আপনার আসল কাজটি করা যায়, এইভাবে সঠিক তফাতগুলি উত্পন্ন করা সহজ হবে।
jthill

2
নোটটি git checkout master; git checkout -b bug2সংক্ষিপ্ত করা যেতে পারে git checkout -b bug2 master। একই ক্ষেত্রে প্রযোজ্য git checkout bug1; git rebase master; git checkout master; git merge bug1, যা অনুরূপ git rebase master bug1; git push . bug1:master(মঞ্জুর, pushকৌশলটি সুস্পষ্ট নয়)
নিটল

1
আমি মূল উত্তরে উপরের
স্ট্যাশিংয়ের

6
আমি হ্রাস পেয়েছি কারণ এটি মূল প্রশ্নের উত্তর দেয় না। আমি একটি শাখায় কিছু নিয়ে কাজ করছি এবং আমি কেবল একটি পরিবর্তন করেছি যা আমি মনে করি আলাদাভাবে ইন্টিগ্রেশন শাখায় প্রতিশ্রুতিবদ্ধ হওয়া উচিত। আমি যা করতে চাই তা হ'ল এটি পরিবর্তন এবং স্ট্যাশ করে যাতে আমি আমার বর্তমান "অগ্রগতিতে কাজ" শাখার পরিবর্তে অন্য একটি শাখায় সরিয়ে আলাদাভাবে প্রতিশ্রুতিবদ্ধ করতে পারি। (সতর্কতা, এগিয়ে গিট রেটিং) এটি করণীয় যে এটি করা এতটাই কঠিন; আমি কল্পনা যে এই একটি আছে সাধারণ সংঘটন। (একটি শাখায় কাজ করা এবং দ্রুত পরিবর্তনটি চিহ্নিত করা দরকার যা তৈরি করা দরকার এবং প্রথমে স্যুইচ করতে ভুলে যেতে হবে))
jpmc26

0

মাইক মনকিউইকজের উত্তর সম্পর্কে আপনার মন্তব্যের মধ্যে আমি একটি সহজ মডেল ব্যবহার করার পরামর্শ দিচ্ছি: নিয়মিত বিকাশ শাখা ব্যবহার করুন, তবে আপনার মাস্টার শাখায় একক প্রতিশ্রুতি পেতে মার্জটির স্কোয়াশ বিকল্পটি ব্যবহার করুন:

git checkout -b bug1    # create the development branch
* hack hack hack *      # do some work
git commit
* hack hack hack *
git commit
* hack hack hack *
git commit
* hack hack hack *
git commit
git checkout master     # go back to the master branch
git merge --squash bug1 # merge the work back
git commit              # commit the merge (don't forget
                        #    to change the default commit message)
git branch -D bug1      # remove the development branch

এই পদ্ধতির সুবিধা হ'ল আপনি সাধারণ গিট কাজের প্রবাহ ব্যবহার করতে পারেন।


এই উত্তর কীভাবে সাহায্য করতে পারে তা আমি দেখতে পাচ্ছি না। এটি মূল প্রশ্নের সাথে সম্পর্কিত নয়।
16

0

টিএল; ডিআর ;git stash-staged

একটি উপনাম তৈরির পরে:

git config --global alias.stash-staged '!bash -c "git stash -- \$(git diff --staged --name-only)"'

এখানে git diffএকটি তালিকা ফেরৎ --stagedফাইল --name-only
এবং তারপর আমরা যত এই তালিকায় পাস pathspecকরার git stashcommad।

থেকে man git stash:

git stash [--] [<pathspec>...]

<pathspec>...
   The new stash entry records the modified states only for the files
   that match the pathspec. The index entries and working tree
   files are then rolled back to the state in HEAD only for these
   files, too, leaving files that do not match the pathspec intact.


-1

দুর্ঘটনাজনিত পরিবর্তনকে ছাঁটাই করতে, বিশেষত একাধিক ফাইল মোছার জন্য নিম্নলিখিতটি করুন:

git add <stuff to keep> && git stash --keep-index && git stash drop

অন্য কথায়, ছদ্মবেশটি স্ট্যাশ করে পুরোপুরি স্ট্যাশ দিয়ে ফেলে দিন।

গিট সংস্করণ 2.17.1 এ পরীক্ষা করা হয়েছে


কোনও মন্তব্য ছাড়াই একটি ডাউনভোট আমার পক্ষে বা পরবর্তী পাঠকের পক্ষে সহায়ক নয় ... জ্যান্সস গ্রম্পি আনন। যদিও আমি এই ওয়ান-লাইনারের একটি সমস্যা কল্পনা করতে পারি: সূচকে সমস্ত পছন্দসই পরিবর্তনগুলি যুক্ত করতে ভুলে যাওয়া উচিত না সে সম্পর্কে খুব সতর্ক হওয়া উচিত, অন্যথায় এই গুরুত্বপূর্ণ পরিবর্তনগুলিও মুছে ফেলা হবে। তবে আবারও, কোনও ক্লাইয়ের সরঞ্জামের অ-যত্নবান ব্যবহার সবচেয়ে খারাপ ক্ষেত্রে নিজের মূল্যবান সময় এবং কাজের জন্য খুব বিপজ্জনক হতে পারে।
wmax
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.