আমি কি গিট-ডিফ থেকে প্যাচ-সামঞ্জস্যপূর্ণ আউটপুট পেতে পারি?


160

আমি খুব সাধারণ কিছু ভুল করছি। আমি একটি সাধারণ প্যাচ ফাইল প্রস্তুত করার চেষ্টা করছি, তাই আমি কিছু পরিবর্তন পুনরায় আবেদন করতে পারি:

$ git diff > before
$ git diff something_here > save.patch
$ git checkout . 
$ patch < save.patch
$ git diff > after
$ diff before after
$

সঙ্গে something_here ফাঁকা এটা প্রায় কাজ করে, কিন্তু ফাইলের নাম সঠিক না। আমি মনে করি আমি কেবল কিছু বিকল্প মিস করছি।

বাস্তব জীবনে, আমি চেকআউটের পরে একত্রীকরণ করতে যাচ্ছি, যাতে প্যাচটি সেখানে ব্যর্থ হতে পারে তবে আপনি দেখুন যে আমি কী করছি getting

ভুল প্রশ্ন জিজ্ঞাসা করার জন্য আমার দোষটি এখানে সম্পাদনা করুন । আসল প্রশ্নটি হ'ল, আমি আমার পরিবর্তনগুলি দূরে সংরক্ষণ করতে চাই, একত্রীকরণ করব, তারপরে পরিবর্তনগুলি পুনরায় প্রয়োগ করতে পারি, যদি সম্ভব হয়? আমি এটিকে ভুল উপায়ে জিজ্ঞাসা করেছি কারণ এই ধরণের সমস্যাগুলি সমাধান করার জন্য আমি প্যাচ ব্যবহার করতে অভ্যস্ত এবং git diffএটি দেখতে আমার চেয়েছিল like

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

সম্পাদনা করুন, 6 বছর পরে বিষয়টির সাথে পরিচিত যে কেউ জানেন, আমি এর অসুবিধাকে খুব বেশি অনুমান করেছি git stash। প্রতিদিন অনেক কিছু বা খুব সুন্দর, আমি নিম্নলিখিত ক্রমটি ব্যবহার করব:

$ git stash
$ git merge
$ git stash pop

8
আপনি বিশেষত patchপরিবর্তে ব্যবহার করতে চান এমন কোনও কারণ আছে git apply?
সিবি বেইলি

3
এবং তারপরেও, আপনার কি সত্যিই অন্য কিছু git stashগিট সরঞ্জামের চেয়ে প্যাচগুলি দরকার ?
সিবি বেইলি

3
সম্পাদনা-পরবর্তী, আমি মনে করি যে git stashআপনি যা করার চেষ্টা করছেন তার পক্ষে এটি সহজ সমাধান, তবে কাজ করার মতো অনেকগুলি পন্থা রয়েছে।
সিবি বেইলি

1
@ মালভোলিও: সত্যিই এটি, আপনার প্যাচটি সংরক্ষণ করার জন্য আপনাকে কোনও অস্থায়ী ফাইলের নামও ভাবার দরকার নেই
সিবি বেইলি

4
@ চার্লস, কখনও কখনও আপনাকে সম্পূর্ণ গিট রিপোজিটরি ছাড়াই কাউকে প্যাচ পাঠাতে হবে। উদাহরণস্বরূপ যদি ব্যবহার করা হয় git-svn
এলাজার লাইবোভিচ

উত্তর:


139

আপনি যদি প্যাচ ব্যবহার করতে চান তবে a/ b/গিটটি ডিফল্টরূপে ব্যবহার করে এমন উপসর্গগুলি সরিয়ে ফেলতে হবে । আপনি --no-prefixবিকল্পটি দিয়ে এটি করতে পারেন (প্যাচের -pবিকল্পের সাহায্যে এটিও করতে পারেন ):

git diff --no-prefix [<other git-diff arguments>]

সাধারণত যদিও, সোজা ব্যবহার করা সহজ git diffএবং তারপরে খাওয়ানোর জন্য আউটপুটটি ব্যবহার করা সহজ git apply

বেশিরভাগ সময় আমি পাঠ্য প্যাচগুলি ব্যবহার এড়াতে চেষ্টা করি। সাধারণত এক বা একাধিক অস্থায়ী কমিটি রিবেসের সাথে মিলিত হয় git stashএবং বান্ডিলগুলি পরিচালনা করা সহজ।

আপনার ব্যবহারের ক্ষেত্রে আমি মনে করি stashএটি সবচেয়ে উপযুক্ত।

# save uncommitted changes
git stash

# do a merge or some other operation
git merge some-branch

# re-apply changes, removing stash if successful
# (you may be asked to resolve conflicts).
git stash pop

7
git diff --no-prefix master > diff.patchএবং তারপরেgit checkout master patch -p0 < diff.patch
নাতিম

1
@ নাতিম চূড়ান্ত সুরক্ষার জন্য আমি patch --dry-run < diff.patchশেষ আদেশটি দেওয়ার আগে ব্যবহার করার পরামর্শ দেব recommend
5

1
@ that এটি করে লাভ কী হবে? যেহেতু আমরা গিট ব্যবহার করছি আমরা কোনও কিছু শিথিল করার সম্ভাবনা নেই তাই না?
নাতিম

1
@ নাতিম যেমনটি আমি বলেছি, কেবল চূড়ান্ত সুরক্ষার জন্য, ত্রুটির ক্ষেত্রে কোনও কিছুই পূর্বাবস্থায় ফেলার দরকার নেই। আমি সেই লোকদের সম্পর্কেও ভাবছিলাম যারা এটি পড়েন এবং আরও সাধারণ ব্যবহারের ক্ষেত্রে patchগিটের বাইরে (সম্ভবত উত্পন্ন কোনও প্যাচ ফাইল ব্যবহার করে diff) ব্যবহার করতে চান।
11

অর্ডার অন্তর্ভুক্ত করতে নতুন আপনার প্যাচ ফাইল আপনি প্রয়োজন এছাড়াও প্যাচ মধ্যে "Git পরিবর্তন --no-উপসর্গ --cached" আছে। আরও ভাল উপায় আছে?
জামশিদ

219

কেবলমাত্র ব্যবহার করুন -p1: যাইহোক -p0আপনার --no-prefixক্ষেত্রে ব্যবহারের প্রয়োজন হবে , যাতে আপনি কেবল এটিকে ছেড়ে দিতে পারেন --no-prefixএবং ব্যবহার করতে পারেন -p1:

$ git diff > save.patch
$ patch -p1 < save.patch

$ git diff --no-prefix > save.patch
$ patch -p0 < save.patch

1
আপনি যদি ভাবছেন কেন, লোকটি ডক্সটি সুন্দরভাবে এটি উত্স করে দেয় - উত্স
tutuDajuju

3
এটি নামগুলির সাথে কাজ করবে না; উপেক্ষা করে git diffএমন একটি রেখা আউটপুট patchকরে। git applyযাবার উপায়
হারাবান

17

গিট ডিফের একটি অতিরিক্ত পাথ সেগমেন্ট ফাইল পাথগুলিতে প্রিপেন্ড করা আছে। আপনি এই এন্ট্রিটি প্যাচ দিয়ে -p1 নির্দিষ্ট করে এই পথে প্রবেশ করতে পারেন:

patch -p1 < save.patch

10
  1. আমি বর্তমানের হেডের বিপরীতে বর্তমান ডিরেক্টরিটির (বিহীন ফাইলগুলি সহ) পৃথকীকরণগুলি সংরক্ষণ করি।
  2. তারপরে আপনি save.patchফাইলটি যেখানেই যেতে পারেন (বাইনারি ফাইল সহ) to
  3. আপনার টার্গেট মেশিনে, প্যাচটি ব্যবহার করে প্রয়োগ করুন git apply <file>

দ্রষ্টব্য: এটি বর্তমানে মঞ্চযুক্ত ফাইলগুলির চেয়ে পৃথক।

$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch

Hahaha। মজার ব্যাপার। আমি প্রায় চার বছর আগে এই প্রশ্নটি জিজ্ঞাসা করেছি এবং আমি এটি করার পদ্ধতিটি বিকশিত হয়েছে তবে আপনি যদি গতকাল আমাকে জিজ্ঞাসা করতেন যে এটি কীভাবে করা যায় তবে আমি আপনার উত্তরটি দিতাম এবং বলেছিলাম যে আমি এই প্রশ্নের উত্তর পেয়েছি। (আসলে আমি সম্ভবত একটি রিসেটের পরিবর্তে একটি খালি ব্যবহার করব git diff > save.patchএবং git checkout .হ্যাঁ ...
মালভোলিও

ওহ এটির 4 বছরের পুরানো বিষয়টি লক্ষ্য করেনি: পি। BTW, রিসেট শুধু এটি কাজ করে প্রকট .. আমিও যে কেউ ব্যবহার না দেখতে না হয় git applyবা পরিবর্তন আপনার রাষ্ট্র প্রাসঙ্গিক তৈরীর এবং শেষ পয়েন্টার প্রাপ্তিসাধ্য কমিট। সবেমাত্র git diffকরা মোটেও কিছুই করেনি
মেটেজ

হ্যাঁ, এখন আমি অবাক হয়েছি যে আমি কীভাবে এটি জানতে পেরেছিলাম git apply। সঙ্গে জিনিস git diff(আমার ধারণা) হল ব্যবহার থেকে git reset- রেপো, সূচি, এবং কাজ এলাকা মধ্যে সম্পর্ক ইস্যু হয়।
মালভোলিও

8

অস্থায়ী প্যাচ ফাইলগুলি এড়ানোর জন্য একটি দরকারী কৌশল:

git diff | patch -p1 -d [dst-dir]

ঠিক আমি যা চেয়েছিলাম এছাড়াও স্ট্যাশগুলির সাথে পুরোপুরি কাজ করে! git stash show -p stash@{3} | patch -p1 -d [dst-dir]
dtmland
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.