වත්මන් වැඩ කරන නාමාවලියෙහි නොගැලපෙන වෙනස්කම් වලින් git patch එකක් සාදන්න


913

මගේ වැඩ කරන නාමාවලියෙහි මා විසින් වෙනස් නොකළ වෙනස්කම් ඇති බව පවසන්න. බැඳීමක් ඇති නොකර මම ඔවුන්ගෙන් පැච් එකක් සාදා ගන්නේ කෙසේද?


32
දෙවන පිළිතුර සිව් ගුණයකින් වැඩි ජනප්‍රියත්වයක් ලබා දී ඇති බැවින් පිළිගත් පිළිතුර බොහෝ විට වෙනස් කළ යුතුය.
ටිම් ඔගිල්වි

5
ImTimOgilvy එකඟ විය. OP එය කළ යුතුය. දෙවන පිළිතුර වඩාත් ජනප්‍රිය වන අතර වැඩි විස්තර ලබා දෙයි
ජෝන් ඩෙමෙට්‍රියෝ

1
මාතෘකාවෙහි නොගැලපෙන වෙනස්කම් වලින් ඔබට පැච් එකක් අවශ්‍ය බව සඳහන් කිරීම වටී යැයි මම සිතමි.
2i3r

Answers:


419

git diff අස්ථිර වෙනස්කම් සඳහා.

git diff --cached වේදිකාගත වෙනස්කම් සඳහා.

git diff HEAD වේදිකාගත කර ඇති සහ වේදිකාගත නොකළ වෙනස්කම් සඳහා.


15
ඔව්, git diff යනු git අයදුම් කිරීමේ ප්‍රතිලෝමයයි
ස්පයික් ග්‍රොනිම්

35
git format-patchද්විමය වෙනස්කම් සහ සමහර මෙටා තොරතුරු ද ඇතුළත් වේ. ඇත්ත වශයෙන්ම එය පැච් එකක් සෑදීම සඳහා හොඳම ඔට්ටුව වනු ඇත, නමුත් අෆයික් මෙය ක්‍රියාත්මක වන්නේ ප්‍රභවයන් / වෙනස්කම් පරීක්ෂා කිරීම සඳහා පමණි, නේද?
එරික්

24
සමහර විට වත්මන් නාමාවලියට සාපේක්ෂව පැච් එකක් සෑදීම ප්‍රයෝජනවත් විය හැකිය. මෙය සාක්ෂාත් කර ගැනීම සඳහා, භාවිතා කරන්නgit diff --relative
ejboy

33
git diff> a.patch එය ගොනුවකට ලිවීමට
qasimzee

141
උපහාසාත්මක මායිම්, පහත පිළිතුර වඩාත් ප්‍රයෝජනවත් වේ.
එයාර්

1933

ඔබ තවමත් වෙනස්කම් සිදු කර නොමැති නම්:

git diff > mypatch.patch

නමුත් සමහර විට එය සිදුවන්නේ ඔබ කරන දේවල් වලින් කොටසක් අළුත් ලිපිගොනු සොයා නොගත් අතර ඒවා ඔබේ git diffප්‍රතිදානයේ නොතිබෙනු ඇත . එබැවින්, පැච් එකක් කළ හැකි එක් ක්‍රමයක් නම්, සෑම දෙයක්ම නව කැපවීමක් සඳහා ( git addසෑම ගොනුවක්ම හෝ හුදෙක්ම git add .) වේදිකා ගත කිරීමයි .

git diff --cached > mypatch.patch

පැච් එකට ද්විමය ගොනු එක් කිරීමට අවශ්‍ය නම් 'ද්විමය' විකල්පය එක් කරන්න (උදා: mp3 ගොනු):

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

ඔබට පසුව පැච් එක යෙදිය හැකිය:

git apply mypatch.patch

සටහන: ඔබට --stagedසමාන පදයක් ලෙසද භාවිතා කළ හැකිය --cached.


5
මම එය හරියටම කළ අතර git apply ක්‍රියාත්මක කිරීමෙන් පසු "මාරාන්තික: හඳුනා නොගත් ආදානය" ලැබුණි. කිසියම් අදහසක් මෙයට හේතු විය හැක්කේ කුමක්ද සහ එය නිවැරදි කරන්නේ කෙසේද?
විටාලි

8
Ital Vitaly: ඔබ එය පෙළ සංස්කාරකයක් සමඟ විවෘත කළහොත් ඔබේ පැච් කියවිය හැකිද? එය අමුතු අක්ෂර නොමැතිව පිරිසිදු විය යුතුය, නිදසුනක් ලෙස color.diff සැකසුම සකසා ඇත්නම් ඔබේ පැච් එකෙහි 'වර්ණ අක්ෂර' ඇති අතර එය 'git apply' අසමත් වීමට හේතු වේ, එවැනි අවස්ථාවක උත්සාහ කරන්න git diff --no-color. එසේ නොමැතිනම් එය කේතීකරණ ගැටලුවක් සේ පෙනේ.
jcarballo

1
දැනටමත් සිදු කර ඇති වෙනස්කම් වලින් පැච් නිර්මාණය කිරීම සඳහා ඔබටද කළ හැකිය git diff --staged > mypatch.patch, මන්ද --stagedඑයට සමාන පදයකි --cached. මම හිතන්නේ මතක තබා ගැනීම පහසුයි.
මතෙව්ස්

3
"හඳුනා නොගත් නව ලිපිගොනු" හා සම්බන්ධ: "git diff" සහ "git diff --cached" වැඩ කරන්නේ "git add <file>" පළමුව කැඳවූයේ නම් පමණි. (මම සෑම විටම හිස් පැච් එකක් ලබාගත්තේ ඇයිදැයි කල්පනා කර බැලුවෙමි)
නිර්නාමික

5
මෙය මට අමුතු ඒකාබද්ධ කිරීමකින් / නිරයෙන් පහසුවෙන් නිරාකරණය කර ගැනීමට ස්තූතියි, ස්තූතියි :)
ජෝන් හන්ට්

88

git diff සහ git apply පෙළ ගොනු සඳහා ක්‍රියා කරනු ඇත, නමුත් ද්විමය ගොනු සඳහා ක්‍රියා නොකරනු ඇත.

ඔබට පහසුවෙන් සම්පූර්ණ ද්විමය පැච් එකක් සෑදිය හැකිය, නමුත් ඔබට තාවකාලික බැඳීමක් නිර්මාණය කිරීමට සිදුවනු ඇත. ඔබ ඔබේ තාවකාලික බැඳීම් (ය) කළ පසු, ඔබට මෙම පැච් එක සෑදිය හැකිය:

git format-patch <options...>

ඔබ පැච් එක සෑදූ පසු, මෙම විධානය ක්‍රියාත්මක කරන්න:

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

මෙය ඔබගේ තාවකාලික බැඳීම් (ය) ආපසු හරවනු ඇත. අවසාන ප්‍රති result ලය මඟින් ඔබ මුලින් කළ වෙනස්කම් සමඟම ඔබගේ වැඩ කරන පිටපත (හිතාමතාම) අපිරිසිදු වේ.

ලැබීමේ පැත්තෙන්, කැපවීමේ ඉතිහාසය නොමැතිව, වැඩ කරන පිටපතෙහි වෙනස්කම් යෙදීම සඳහා ඔබට එකම උපක්‍රමය භාවිතා කළ හැකිය. පැච් (එස්), සහgit reset --mixed <SHA of commit *before* the patches> .

මෙම සම්පූර්ණ විකල්පය වැඩ කිරීම සඳහා ඔබ හොඳින් සමමුහුර්ත විය යුතු බව සලකන්න. පැච් සෑදීමේදී යම් යම් දෝෂ මා දැක ඇති අතර ඒවා සාදන පුද්ගලයා මා සතුව ඇති තරම් වෙනස්කම් පහතට ගෙන නොමැත. එය වැඩ කිරීමට ක්‍රම බොහෝ විට ඇත, නමුත් මම ඒ ගැන වැඩි දුරක් සොයා බැලුවේ නැත.


ඉබ්බා Git හි එකම පැච් නිර්මාණය කරන්නේ කෙසේද යන්න මෙන්න (මම එම මෙවලම භාවිතා කිරීමට නිර්දේශ කරමි):

  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
තාක්‍ෂණිකව මේ සඳහා OP ඉල්ලා සිටින බැඳීමක් ඇති කිරීම අවශ්‍ය වේ, නමුත් එය තාවකාලික එකක් වන අතර පිළිතුර නොසලකා ප්‍රයෝජනවත් වේ.
davenpcj

38

නවීකරණය කරන ලද සහ නව ලිපිගොනු (වේදිකාගත) සහිත පැච් එකක් සෑදීමට ඔබට ධාවනය කළ හැකිය:

git diff HEAD > file_name.patch

ස්තූතියි, මගේ නඩුවේදී, මෙම පිළිතුර ක්‍රියාත්මක වන නමුත් git diff --cached > mypatch.patchක්‍රියා නොකරයි.
පතල් කැණීම

මට ප්රශ්ණයක් තියෙනවා: හැක file_name.patchවිසින් භාවිතා කළ patchවිධාන? ඔවුන් එකිනෙකා සමඟ අනුකූලද?
රක්ෂාත් රවී

1
git diff + git diff --cached / staged == git diff HEAD (අන්තිම කැපවීමෙන් පසුව ඇති සියලුම වෙනස්කම් පෙන්වන්න)
කේ. සංකේතය

1
@RakshithRavi afaik, ඔව් ඔව්. git diff HEAD > file-name.patchඋදා: ඔබ විසින් සාදන ලද ඔබේ පැච් එක පහත පරිදි භාවිතා කළ හැකිය :patch --forward --strip=1 < file-name.patch
ඇයි

25

මම කැමතියි:

git format-patch HEAD~<N>

<N>පැච් ලෙස සුරැකීමට අවසන් වරට කළ යුතු ගණන.

විධානය භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ විස්තර DOC හි ඇත

UPD
මෙන්න ඔබට ඒවා අදාළ කර ගත හැකි ආකාරය සොයාගත හැකිය.

UPDformat-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 .

cjcarballo: මම පිළිතුර යාවත්කාලීන කර ඇත. ඔබට ඇති ඕනෑම දැන්වීමක් මා අතහැර දැමීමට නිදහස් වන්න.
ඉයුජන් කොන්කොව්

2
කැපවීමක් සහ එකඟතාවයක් ඇති කිරීමට වඩා සරල ක්‍රමයක් තිබේ. git diff --cached --binary
ගෞරව් අගර්වාල්

9

ඔබට ද්විමය කිරීමට අවශ්‍ය නම්, --binaryඔබ ධාවනය වන විට විකල්පයක් දෙන්න git diff.


0

සාපේක්ෂ වෙනස්කම් සහිත ලිපිගොනු පමණක් ඇතුළත් කිරීම සඳහා අපට ලිපිගොනු නියම කළ හැකිය, විශේෂයෙන් ඒවා බහු බහලුම් වලින් විහිදෙන විට

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

මෙය පිළිතුරු හා අදහස් වල නිශ්චිතව දක්වා නොමැති බව මට පෙනී ගියේය, ඒවා සියල්ලම අදාළ සහ නිවැරදි ය, එබැවින් එය එක් කිරීමට තෝරා ගත්තේය. ව්‍යංගයට වඩා පැහැදිලිය!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.