বর্তমান ওয়ার্কিং ডিরেক্টরিতে পরিবর্তনগুলি থেকে একটি গিট প্যাচ তৈরি করুন


878

বলুন আমার আমার ওয়ার্কিং ডিরেক্টরিতে অনুমতি ছাড়াই পরিবর্তন করেছি। কোন প্রতিশ্রুতি না তৈরি করে তাদের থেকে আমি কীভাবে প্যাচ তৈরি করতে পারি?


29
গৃহীত উত্তর সম্ভবত পরিবর্তন করা উচিত, দ্বিতীয় উত্তর দেওয়া প্রায় চারগুণ বেশি জনপ্রিয়।
টিম ওগিলভি

5
@ টিম ওগিলভি সম্মত হয়েছেন। ওপি করা উচিত। দ্বিতীয় উত্তরটি আরও বেশি জনপ্রিয় এবং আরও তথ্য দেয়
জন দেমেট্রিও

1
আমি শিরোনামে অনির্দিষ্ট পরিবর্তন থেকে আপনার প্যাচ দরকার তা উল্লেখ করা ভাল বলে মনে করি।
2i3r

উত্তর:


401

git diffআনস্টেজড পরিবর্তনের জন্য। git diff --cachedমঞ্চ পরিবর্তনের জন্য।


12
হ্যাঁ, Git পরিবর্তন Git বিপরীত প্রযোজ্য
স্পাইক Gronim

33
git format-patchএছাড়াও বাইনারি ডিফ এবং কিছু মেটা তথ্য অন্তর্ভুক্ত। আসলে এটি প্যাচ তৈরির জন্য সেরা বাজি হবে তবে আফিক এটি কেবল উত্স / পরিবর্তনগুলি পরীক্ষা করার জন্য কাজ করে, তাই না?
এরিক

20
কখনও কখনও এটি বর্তমান ডিরেক্টরি সম্পর্কিত একটি প্যাচ তৈরি দরকারী হতে পারে। এই, ব্যবহার অর্জনgit diff --relative
ejboy

30
git diff> a.patch এটিকে একটি ফাইলে লিখতে
qasimzee

139
ব্যঙ্গাত্মক সীমান্তে সীমিতভাবে নীচে দেওয়া উত্তর আরও সহায়ক।
এয়ার

1863

আপনি যদি এখনও পরিবর্তনগুলি না করে থাকেন তবে:

git diff > mypatch.patch

তবে কখনও কখনও এটি ঘটে যে আপনি যে স্টাফটি করছেন তার অংশটি নতুন ফাইল যা অচিহ্নযুক্ত এবং আপনার git diffআউটপুটে থাকবে না । সুতরাং, প্যাচ করার একটি উপায় হ'ল নতুন প্রতিশ্রুতি ( git addপ্রতিটি ফাইল, বা ন্যায়সঙ্গত git add .) এর জন্য সমস্ত কিছু মঞ্চ করা কিন্তু প্রতিশ্রুতিটি করবেন না এবং তারপরে:

git diff --cached > mypatch.patch

প্যাচে বাইনারি ফাইল যুক্ত করতে চাইলে 'বাইনারি' বিকল্পটি যুক্ত করুন (যেমন এমপি 3 ফাইল):

git diff --cached --binary > mypatch.patch

আপনি পরে প্যাচ প্রয়োগ করতে পারেন:

git apply mypatch.patch

দ্রষ্টব্য: আপনি এর --stagedপ্রতিশব্দ হিসাবেও ব্যবহার করতে পারেন --cached


127
উদাহরণের জন্য আপনাকে অনেক ধন্যবাদ। গৃহীত উত্তরের বিপরীতে আপনি কীভাবে আদেশ করবেন এবং কীভাবে কেবল কথা বলবেন না তা নির্দেশাবলী প্রদর্শন করুন। আমার জন্য খুব সহায়ক এবং নির্দোষ কাজ করেছেন :)
নুয়াল

4
আমি ঠিক এটি করেছি এবং গিট প্রয়োগ কার্যকর করার পরে "মারাত্মক: অচেনা ইনপুট" পেয়েছি। কোন ধারণা কী কারণে এটি ঘটতে পারে এবং কীভাবে এটি ঠিক করা যায়?
ভাইটালি

6
@ ভিটালি: আপনি যদি কোনও পাঠ্য সম্পাদক দিয়ে এটি খুলেন তবে আপনার প্যাচটি পাঠযোগ্য? এটি কোনও অদ্ভুত অক্ষর ছাড়াই পরিষ্কার হওয়া উচিত, উদাহরণস্বরূপ, যদি color.diff সেটিংস সেট করা থাকে তবে আপনার প্যাচটিতে এমন কিছু 'বর্ণের অক্ষর রয়েছে যা' গিট প্রয়োগ করতে 'ব্যর্থ করতে পারে, সে ক্ষেত্রে চেষ্টা করুন git diff --no-color। অন্যথায়, এটি একটি এনকোডিং সমস্যার মতো দেখাচ্ছে।
jcarballo

3
"নতুন ফাইলগুলি যাঁর চিহ্নবিহীন রয়েছে" সম্পর্কিত: "গিট ডিফ" এবং "গিট ডিফ - ক্যাশেড" কেবল তখনই কাজ করে যদি "গিট অ্যাড <ফাইল>" প্রথমে ডাকা হয়। (আমি গিটে নতুন এবং আমি কেন ভেবে পেলাম কেন আমি প্রতিবার খালি প্যাচ পেয়েছি)
বেনামে

5
এটি আমাকে খুব সহজেই একটি অদ্ভুত সংশ্লেষ /
জন হান্ট

86

git diffএবং git applyপাঠ্য ফাইলগুলির জন্য কাজ করবে তবে বাইনারি ফাইলগুলির জন্য কাজ করবে না।

আপনি সহজেই একটি পূর্ণ বাইনারি প্যাচ তৈরি করতে পারেন তবে আপনাকে একটি অস্থায়ী প্রতিশ্রুতি তৈরি করতে হবে। একবার আপনি নিজের অস্থায়ী প্রতিশ্রুতিবদ্ধ হয়ে গেলে আপনি প্যাচটি এটি সহ তৈরি করতে পারেন:

git format-patch <options...>

আপনি প্যাচ তৈরির পরে, এই আদেশটি চালান:

git reset --mixed <SHA of commit *before* your working-changes commit(s)>

এটি আপনার অস্থায়ী প্রতিশ্রুতিগুলি ফিরিয়ে আনবে। চূড়ান্ত ফলাফলটি আপনার কার্যকরী অনুলিপিটি (ইচ্ছাকৃতভাবে) আপনার মূল পরিবর্তনগুলির সাথে নোংরা করে।

প্রাপ্তির পক্ষে, আপনি প্রতিশ্রুতিবদ্ধ ইতিহাস না রেখে ওয়ার্কিং কপির পরিবর্তনগুলি প্রয়োগ করতে একই কৌশলটি ব্যবহার করতে পারেন। কেবল প্যাচ (এস) প্রয়োগ করুন এবং git reset --mixed <SHA of commit *before* the patches>

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


কচ্ছপ গিটে কীভাবে একই প্যাচগুলি তৈরি করবেন তা এখানে নয় (যে আমি সেই সরঞ্জামটি ব্যবহার করার পরামর্শ দিই না):

  1. আপনার কাজের পরিবর্তন প্রতিশ্রুতিবদ্ধ
  2. শাখা রুট ডিরেক্টরিতে রাইট ক্লিক করুন এবং Tortoise Git-> ক্লিক করুনCreate Patch Serial
    1. যে কোনও ব্যাপ্তি বোধগম্যতা চয়ন করুন ( Since: FETCH_HEADআপনি ভাল-সিঙ্ক হয়ে থাকলে কাজ করবে)
    2. প্যাচ তৈরি করুন (এস)
  3. শাখা রুট ডিরেক্টরিতে রাইট ক্লিক করুন এবং Tortise Git-> ক্লিক করুনShow Log
  4. আপনার অস্থায়ী প্রতিশ্রুতিবদ্ধ হওয়ার আগে কমিটকে রাইট ক্লিক করুন এবং ক্লিক করুনreset "<branch>" to this...
  5. Mixedবিকল্পটি নির্বাচন করুন

এবং কীভাবে সেগুলি প্রয়োগ করবেন:

  1. শাখা রুট ডিরেক্টরিতে রাইট ক্লিক করুন এবং Tortoise Git-> ক্লিক করুনApply Patch Serial
  2. সঠিক প্যাচ (এস) নির্বাচন করুন এবং সেগুলি প্রয়োগ করুন
  3. শাখা রুট ডিরেক্টরিতে রাইট ক্লিক করুন এবং Tortise Git-> ক্লিক করুনShow Log
  4. প্যাচের কমিট (গুলি) এর আগে কমিটকে রাইট ক্লিক করুন এবং ক্লিক করুনreset "<branch>" to this...
  5. Mixedবিকল্পটি নির্বাচন করুন

5
প্রযুক্তিগতভাবে এটির জন্য একটি অঙ্গীকার তৈরি করা দরকার যা ওপিকে এড়াতে বলা হয়েছিল, তবে এটি একটি অস্থায়ী এবং এর উত্তর নির্বিশেষে দরকারী।
davenpcj

33

সংশোধিত এবং নতুন উভয় ফাইল (মঞ্চযুক্ত) দিয়ে প্যাচ তৈরি করতে আপনি চালাতে পারেন:

git diff HEAD > file_name.patch

ধন্যবাদ, আমার ক্ষেত্রে, এই উত্তরটি কাজ করে, কিন্তু git diff --cached > mypatch.patchকাজ করছে না।
খনন

আমার একটি প্রশ্ন আছে: কমান্ডটি file_name.patchব্যবহার করা যাবে patch? তারা একে অপরের সাথে সামঞ্জস্যপূর্ণ?
রক্ষীথ রবি 4'19

গিট ডিফ + গিট ডিফ - ক্যাচড / স্টেজড == গিট ডিফ হেড (শেষ প্রতিশ্রুতি থেকে সমস্ত পরিবর্তনগুলি দেখান)
কে। প্রতীক

20

আমি পছন্দ করি:

git format-patch HEAD~<N>

<N>প্যাচ হিসাবে সংরক্ষণের জন্য সর্বশেষ প্রতিশ্রুতিবদ্ধদের সংখ্যা কোথায় ।

কমান্ডটি কীভাবে ব্যবহার করতে হয় তার বিশদটি ডওসিটিতে রয়েছে

ইউপিডি
এখানে আপনি কীভাবে প্রয়োগ করতে পারেন তা এখানে পেতে পারেন।

ইউপিডি যারা format-patch
অ্যাড ওরফে ধারণাটি পায়নি তাদের জন্য :

git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'

তারপরে আপনার প্রকল্পের সংগ্রহস্থলের কোনও ডিরেক্টরিতে চালান:

git make-patch

এই কমান্ডটি 0001-uncommited.patchআপনার বর্তমান ডিরেক্টরিতে তৈরি করবে । প্যাচটিতে সমস্ত পরিবর্তন এবং অচিহ্নযুক্ত ফাইল থাকবে যা পরবর্তী কমান্ডে দৃশ্যমান:

git status .

@ জাকার্বালো: আমি উত্তর আপডেট করেছি। আপনার কোন নোটিস আমাকে নির্দ্বিধায় ফেলে দিন।
ইউজেন কনকভ

2
প্রতিশ্রুতিবদ্ধতা তৈরি করা এবং আপত্তিহীন করার চেয়ে সহজ উপায় রয়েছে। গিট ডিফ
গৌরব আগরওয়াল

9

আপনি যদি বাইনারি করতে চান তবে --binaryরান করার সময় একটি বিকল্প দিন git diff


0

আপেক্ষিক পরিবর্তন সহ কেবলমাত্র ফাইলগুলি অন্তর্ভুক্ত করার জন্য আমরা ফাইলগুলি নির্দিষ্ট করতে পারি, বিশেষত যখন তারা একাধিক ডিরেক্টরি প্রসারিত করে

git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch

আমি উত্তর এবং মন্তব্যে এটি নির্দিষ্ট না করে খুঁজে পেয়েছি, যা সমস্ত প্রাসঙ্গিক এবং সঠিক, তাই এটি যুক্ত করার জন্য বেছে নিয়েছি। সুস্পষ্ট বর্ণিত চেয়ে ভাল!

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