එකම ශාඛාවේ එකම කොමිස් දෙකක් අතර එකම ගොනුව වෙනස් කරන්නේ කෙසේද?


1167

Git හි, එකම ශාඛාවේ එකම ගොනුව වෙනස් කොමිස් දෙකක් (පරස්පර නොවේ) අතර සංසන්දනය කරන්නේ කෙසේද (උදාහරණයක් ලෙස මාස්ටර්)?

දෘශ්‍ය මූලාශ්‍ර සුරක්‍ෂිත (වීඑස්එස්) හෝ කණ්ඩායම් පදනම් සේවාදායකයේ (ටීඑෆ්එස්) වැනි සංසන්දනාත්මක අංගයක් මම සොයමි . Git හි එය කළ හැකිද?

Answers:


1502

සිට git-diffmanpage:

git diff [--options] <commit> <commit> [--] [<path>...]

නිදසුනක් ලෙස, "main.c" ගොනුවක් සඳහා දැන් සහ නැවත කොමිට් දෙකක් අතර වෙනස බැලීමට, සමාන විධානයන් තුනක් මෙන්න:

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c

45
මෙම ..(සමහර විට, සාධාරණව පැරණි අනුවාද හැර) එය සමග වැඩ කරන්නම් නමුත් තමයි, අවශ්ය වේ. කොමිස් දෙක ඉතා දුරින් තිබිය යුතු නම් ඔබට භාවිතා කිරීමට git logහෝ භාවිතා gitkකිරීමට SHA1 සොයා ගත හැකිය. gitkඑහි සන්දර්භය මෙනුවෙහි "diff select -> this" සහ "diff this -> select" ද ඇත.
කැස්කබෙල්

17
කොමිස් 2 අතර ගොනු නාමය වෙනස් කළද මෙය ක්‍රියාත්මක වේද?
reubenjohn

27
ඉතින් "-" හි අරමුණ කුමක්ද
user64141

31
64 user64141 --ප්‍රයෝජනවත් වේ. ඔබට ගොනුවක් ඇති විට -p. ස්ක්‍රිප්ට් භාවිතා කිරීම හොඳයි, ප්‍රායෝගිකව අවශ්‍ය වන්නේ දුර්ලභ අවස්ථාවන්හිදී පමණි.
පැලේක්

13
සටහන: ඔබ repo හි මූලයට සාපේක්ෂව මාර්ග භාවිතා කළ යුතුය. වත්මන් වැඩ කරන නාමාවලියට සාපේක්ෂව මාර්ග ක්‍රියා නොකරනු ඇත.
කෙවින් වීලර්

287

ඔබට වෙනස් සංශෝධන දෙකකින් විවිධ ගොනු දෙකක් සංසන්දනය කළ හැකිය, මේ ආකාරයට:

git diff <revision_1>:<file_1> <revision_2>:<file_2>


26
එය නම්, වගේ බවයි සටහන් <file_1>හා <file_2>වත්මන් නාමාවලියේ නොව ඉහල මට්ටමේ GIT කළමනාකරණය බහලුම මත වන අතර, එක් prepend යුතු ./: Unix මත<revision_1>:./filename_1
ඇන්ඩෘ Holzner

7
<revision>: ඉවත් කළ හැකිය, එබැවින් ඔබට තවමත් බැඳී නොමැති ගොනුවක් සමඟ වෙනස් විය හැකිය.
යාරොස්ලාව් නිකිටෙන්කෝ

2
වින්ඩෝස් හි එක් අයෙකු '\' නොව ගොනු මාර්ග සඳහා '/' භාවිතා කළ යුතු බව සලකන්න.
np8

89

ඔබ "difftool" වින්‍යාස කර ඇත්නම් ඔබට භාවිතා කළ හැකිය

git difftool revision_1:file_1 revision_2:file_2

උදාහරණය: ගොනුවක් එහි අන්තිම බැඳීමේ සිට එකම ශාඛාවේ පෙර කැපවීම සමඟ සංසන්දනය කිරීම: ඔබ ඔබේ ව්‍යාපෘති මූල ෆෝල්ඩරයේ සිටී නම්

$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java

ඔබගේ ~ / .gitconfig හෝ project / .git / config ගොනුවේ පහත සඳහන් ප්‍රවේශයන් තිබිය යුතුය. P4merge ස්ථාපනය කරන්න [මෙය මා වඩාත් කැමති වෙනස හා ඒකාබද්ධ කිරීමේ මෙවලමයි]

[merge]
    tool = p4merge
    keepBackup = false
[diff]
    tool = p4merge
    keepBackup = false
[difftool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
[mergetool]
    keepBackup = false
[difftool]
    keepBackup = false
[mergetool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
    cmd = p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"

52

පරීක්ෂා කරන්න $ git log, විවිධ කමිටු දෙකේ SHA-1 හැඳුනුම්පත පිටපත් git diffකර එම හැඳුනුම්පත් සමඟ විධානය ක්‍රියාත්මක කරන්න. උදාහරණයක් වශයෙන්:

$ git diff (sha-id-one) (sha-id-two)

21
ඔබට විශේෂිත ගොනුවක් සඳහා වෙනස අවශ්‍ය නම්, විධානය අවසානයේ එයට මාර්ගය එක් කරන්න.
hBrent

කොමිස් දෙක එකිනෙකට වෙනස් ශාඛා හරහා තිබේ නම් සම්පූර්ණ ගස් තොරතුරු බාගත කිරීම සඳහා "git pull" කරන්න. එසේ නොමැතිනම් ඔබට "මාරාන්තික: නරක වස්තුව" දෝෂයක් ලැබෙනු ඇත.
user238607

4
git diff (sha-id-one) (sha-id-two) -- filename.ext ගොනු නාමය නොමැතිව එම කොමිස් දෙකෙහි ඇති සියලුම ගොනු වල වෙනස්කම් ලැයිස්තුගත කරයි.
ෂෙරිල්හෝමන්

40

කොමිස් දෙක අතර ගොනුවේ ඇති සියලුම වෙනස්කම් කැපවීමෙන්-කැපවීමේ පදනම මත බැලීමට ඔබට අවශ්‍ය නම්, ඔබට ද එය කළ හැකිය

git log -u $start_commit..$end_commit -- path/to/file


"$ Start_commit" සහ "$ end_commit" යනු කුමක්ද? ඒවා වචනානුසාරයෙන්ද, නැතිනම් ඔබට උදාහරණයක් සැපයිය හැකිද?
පීටර් මෝර්ටෙන්සන්

ඒවා ආරම්භක සහ අවසාන සංශෝධනය අඩංගු ෂෙල් විචල්‍යයන් වන අතර ඒ වෙනුවට sha1 වචනාර්ථ හෝ refs විය හැකිය
cxreg

21

Git ලොග් විධානයක ඇති පරිදි දී ඇති ගොනුවක් සඳහා Git diff විධාන මුද්‍රණය කරන පර්ල් පිටපතක් මෙන්න.

උදා

git log pom.xml | perl gldiff.pl 3 pom.xml

අස්වැන්න:

git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml

ඒවා කපා ෂෙල් කවුළු සැසියක ඇලවිය /bin/shහැකිය.

සටහන්:

  1. අංකය (මෙම අවස්ථාවේ 3) පේළි කීයක් මුද්‍රණය කළ යුතුද යන්න නියම කරයි
  2. ගොනුව (මෙම අවස්ථාවේ දී pom.xml) ස්ථාන දෙකෙහිම එකඟ විය යුතුය (ස්ථාන දෙකෙහිම එකම ගොනුවක් සැපයීම සඳහා ඔබට එය ෂෙල් ශ්‍රිතයකින් ඔතා තැබිය හැකිය) හෝ එය ද්විමය නාමාවලියක ෂෙල් ස්ක්‍රිප්ට් එකක් ලෙස තැබිය යුතුය.

කේතය:

# gldiff.pl
use strict;

my $max  = shift;
my $file = shift;

die "not a number" unless $max =~ m/\d+/;
die "not a file"   unless -f $file;

my $count;
my @lines;

while (<>) {
    chomp;
    next unless s/^commit\s+(.*)//;
    my $commit = $1;
    push @lines, sprintf "%s:%s", substr($commit,0,6),$file;
    if (@lines == 2) {
        printf "git diff %s %s\n", @lines;
        @lines = ();
    }
    last if ++$count >= $max *2;
}

14

IPmipadi විසින් නිශ්චිතව දක්වා ඇති ක්‍රමය සමඟ එක් ගොනුවකට වඩා වැඩි ගණනක් සමඟ වෙනසක් කිරීමට ඔබට අවශ්‍ය නම්:

උදා : සියලුම ලිපිගොනු සොයා ගැනීමට HEADසහ ඔබේ අතර වෙනස :master.coffee

git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`

මෙය ඔබගේ your_search_folder/සියලුම .coffeeලිපිගොනු සඳහා පුනරාවර්තනයෙන් සොයනු ඇති අතර ඒවා සහ ඒවායේ masterඅනුවාද අතර වෙනසක් ඇති කරයි .


13

ඔබට ලිපිගොනු හෝ නාමාවලි කිහිපයක් තිබේ නම් සහ අඛණ්ඩ නොවන කොමිස් සංසන්දනය කිරීමට අවශ්‍ය නම්, ඔබට මෙය කළ හැකිය:

තාවකාලික ශාඛාවක් සාදන්න ( මෙම උදාහරණයේ "සංශෝධනය" )

git checkout -b revision

පළමු කැපවීමේ ඉලක්කයට පෙරළන්න

git reset --hard <commit_target>

උනන්දුවක් දක්වන අය චෙරි තෝරා ගැනීම

git cherry-pick <commit_interested> ...

වෙනස යොදන්න

git diff <commit-target>^

ඔබ කළ විට

git branch -D revision

2
මෙම විසඳුමට ස්තූතියි. එය මගේ භාවිත නඩුව සඳහා හොඳින් ක්‍රියාත්මක විය. මම යාවත්කාලීන කරන එකම දෙය නම් ඔබ කළ විට ඔබට ශාඛාව ක්‍රියා විරහිත වන තුරු මකා දැමිය නොහැක.
ස්ටීවන් ඩික්ස්

9

Git ගේ පුදුමාකාරකම භාවිතා කිරීමට තවත් ක්‍රමයක් ...

git difftool HEAD HEAD@{N} /PATH/FILE.ext

මෙම පිළිතුරෙන් අන්වර්ථයක් මම අර්ථ difftool-file = "!git difftool HEAD@{\"$2\"} HEAD \"$1\" #"
දැක්වුවෙමි

1

ඔබට දෘශ්‍ය මූලාශ්‍ර සුරක්ෂිතතාව හෝ කණ්ඩායම් පදනම් සේවාදායකය (ටීඑෆ්එස්) ලබා ගත හැකි වැනි වින්ඩෝස් හි සරල දෘශ්‍ය සංසන්දනයක් අවශ්‍ය නම් , මෙය උත්සාහ කරන්න:

  • ගොනු එක්ස්ප්ලෝරර් හි ගොනුව මත දකුණු-ක්ලික් කරන්න
  • 'Git History' තෝරන්න

සටහන: වින්ඩෝස් 10 වෙත යාවත්කාලීන කිරීමෙන් පසු මට Git සන්දර්භය මෙනු විකල්ප අහිමි වී ඇත. කෙසේ වෙතත්, විධාන කවුළුවක 'gitk' හෝ 'gitk ගොනු නාමය' භාවිතා කර ඔබට එයම සාක්ෂාත් කරගත හැකිය.

ඔබ 'Git History' ඇමතූ පසු, ඉහළ වම් කවුළුවෙහි ගොනුවේ ඉතිහාසයක් ඇති Git GUI මෙවලම ආරම්භ වේ. ඔබ සංසන්දනය කිරීමට කැමති අනුවාද වලින් එකක් තෝරන්න. ඉන්පසු දෙවන අනුවාදය මත දකුණු-ක්ලික් කර එක්කෝ තෝරන්න

මෙය වෙනස් කරන්න -> තෝරා ඇත

හෝ

වෙනස තෝරා ඇත -> මෙය

වර්ණ කේත කරන ලද වෙනස්කම් පහළ වම් කවුළුවෙහි දිස්වනු ඇත.


පහළට ඡන්ද දායකයින්ට සටහන: මෙය සරල විසඳුමක් වන අතර එය ක්‍රියාත්මක කිරීමට පහසු වන අතර OP හි ගැටලුව විසඳයි. OP පැහැදිලිව භාවිතා කරන වින්ඩෝස් මත එය ක්‍රියා කරයි (ප්‍රශ්නයේ TFS සහ VSS වෙත යොමු බලන්න).
සම්පත්
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.