එක් ශාඛාවක් වෙනත් ශාඛාවකින් ලබා ගන්නේ කෙසේද


1293

මම git භාවිතා කර මාස්ටර් ශාඛාවේ වැඩ කරමි. මෙම ශාඛාවට ගොනුවක් app.jsඇත.

මා සතුව experimentශාඛාවක් ඇත, එහි මම වෙනස්කම් රාශියක් සහ ටොන් ගණනක් සිදු කළෙමි. දැන් මම පමණක් සිදු කළ සියලු වෙනස්කම් කිරීමට අවශ්ය වන app.jsසිට experimentගැනීමට masterශාඛා.

මම කොහොමද ඒක කරන්නේ?

නැවත වරක් මට ඒකාබද්ධ කිරීමක් අවශ්‍ය නැත. මට අවශ්‍ය app.jsවන්නේ experimentශාඛාවේ සිට masterශාඛාවට සියලු වෙනස්කම් ගෙන ඒමටයි.



1
හැරුණු විට පිළිතුර සහ අද වන විට අනෙක් අය ලිපිගොනු අන්තර්ගතය පිටපත් කරන්නේ කෙසේදැයි පිළිතුරු සපයයි, එය මට හමු වූ විට මට අවශ්‍ය වූයේ එයයි. කෙසේ වෙතත්, හරියටම කියවා ඇත්නම්, නික්ට අවශ්‍ය වූයේ වෙනස්කම් ගෙන ඒමට මිස සම්පූර්ණ පිටපතට නොව ගොනුවට masterවෙනස් විය හැකිය experiment, උදා: වෙනත් ශාඛා සමඟ ඒකාබද්ධ වූ වෙනස්කම් අඩංගු විය හැකිය. PS අනෙක් අතට ඔහුට ඒකාබද්ධ වීමට අවශ්‍ය නැත, නමුත් මා දන්නා පරිදි git mergeපදය ශාඛා සඳහා පමණි, නිශ්චිත ගොනුවක් සඳහා නොවේ, එබැවින් මෙහි කිසිදු ප්‍රතිවිරෝධතාවක් නොමැත.
ඇලෙක්සි මාර්ටිනොව්

Answers:


1633
git checkout master               # first get back to master
git checkout experiment -- app.js # then copy the version of app.js 
                                  # from branch "experiment"

එක් ගොනුවක වෙනස්කම් අහෝසි කරන්නේ කෙසේදැයි බලන්න.


යාවත්කාලීන කිරීම 2019 අගෝස්තු, Git 2.23

නව git switchසහ git restoreවිධාන සමඟ, එය වනුයේ:

git switch master
git restore -s experiment -- app.js

පෙරනිමියෙන්, වැඩ කරන ගස පමණක් ප්රතිෂ් .ාපනය වේ.
ඔබ මෙන්ම දර්ශකය යාවත්කාලීන කිරීමට අවශ්ය නම් (ගොනුව අන්තර්ගතයට නැවත අර්ථය හා එක් විධානය දර්ශකය එය එක් කරන්න):

git restore -s experiment --staged --worktree -- app.js
# shorter:
git restore -s experiment -WS -- app.js

ලෙස Jakub Narębski අදහස් සඳහන්:

git show experiment:path/to/app.js > path/to/app.js

Git හි නිශ්චිත සංශෝධනයෙන් එක් ගොනුවක් ලබා ගන්නේ කෙසේද? ” යන SO ප්‍රශ්නයේ විස්තර කර ඇති පරිදි හැර , ඔබ ද ක්‍රියා කරයි, ඔබ repo හි මූල නාමාවලියෙන් සම්පූර්ණ මාර්ගය භාවිතා කළ යුතුය.
එබැවින් ජකබ් ඔහුගේ උදාහරණයේ භාවිතා කළ මාර්ගය / to / app.js.

ලෙස සිහිවෙන්න එම ප්රකාශය තුළ සඳහන්:

ඔබට ලැබෙන්නේ app.js හි නවතම තත්වය පමණි

SO ප්‍රශ්නයේ “ git gui හි ගොනුවක් git checkout revision ” හි දක්වා ඇති පරිදි ඔබට අවශ්‍ය ඕනෑම සංශෝධනයක් සඳහා git checkoutහෝ git showසැබවින්ම ඔබට යොමු කළ හැකිය :

$ git show $REVISION:$FILENAME
$ git checkout $REVISION -- $FILENAME

I FILENAME යනු සංස්කරණය කරන ලද ගොනුවක සම්පූර්ණ මාවතකි .

$REVISIONපහත පරිදි විය හැකිය git rev-parse:

experiment@{yesterday}:app.js # app.js as it was yesterday 
experiment^:app.js            # app.js on the first commit parent
experiment@{2}:app.js         # app.js two commits ago

සහ යනාදි.

schmijos අදහස් දැක්වීමේදී එකතු කරයි :

ඔබට මෙය තොගයකින් කළ හැකිය:

git checkout stash -- app.js

ඔබ ශාඛා දෙකක වැඩ කරන අතර කැපවීමට අකමැති නම් මෙය ඉතා ප්‍රයෝජනවත් වේ.


13
එක් සටහනක්: ඔබට ලැබෙනුයේ නවතම app.js තත්වය පමණි, ඔබට පර්යේෂණ ඉතිහාසයෙන් කිසිදු ඉතිහාසයක් ලැබෙන්නේ නැත.
ෆ්‍රොස්ටි

2
H තෝමස්රෙගි ඔබට ඕනෑම ශාඛාවකින් ඕනෑම ශාඛාවකට ගොනුවක් ආනයනය කිරීමට (පිටවීම) හැකි විය යුතුය. ඔබට නොහැකි නම්, නිවැරදි දෝෂ පණිවිඩය සහ Git සහ OS වල අනුවාදය වැනි නිශ්චිත තොරතුරු සහිතව මෙහි ඇසීමට හොඳ ප්‍රශ්නයක් විය හැකිය.
VonC

2
උප නාමාවලියක, ඔබට ද භාවිතා කළ හැකිය experiment:./app.js. . ./file.xsl '? " ඔව්, මම කළා! මාරාන්තික දෝෂ පණිවිඩයකින් මා මෙතරම් සතුටට පත්ව ඇතැයි මම නොසිතමි.
ඉවාන් ලෙන්ස්

1
OmaTomaszGandor ඔව්, මම සඳහන් කරන්නේ stackoverflow.com/a/21066489/6309 හි , එහිදී git show දර්ශකය වෙනස් නොකරන නමුත් git checkout මඟින් දර්ශකය වෙනස් කරයි.
VonC

1
RiedFriedBrice මගේ පිළිතුර බලන්න: මේ දිනවල එය එසේ වනු ඇතgit restore -s new-feature path/to/app.js
VonC

372

සෑම දෙයක්ම වඩා සරල ය, ඒ සඳහා git checkout භාවිතා කරන්න.

you're on masterශාඛාව ලබා ගැනීමට app.js from new-featureශාඛාව යැයි සිතමු :

git checkout new-feature path/to/app.js

// note that there is no leading slash in the path!

මෙය ඔබට අපේක්ෂිත ගොනුවේ අන්තර්ගතය ගෙන එනු ඇත. ගොනුව ලබා ගැනීම සඳහා ඔබට සෑම විටම මෙන් නව විශේෂාංග ශාඛා නාමය වෙනුවට sha1 හි කොටසක් භාවිතා කළ හැකිය .

සටහන : දුරස්ථ ශාඛාවක් නොව දේශීය ශාඛාවක් new-featureවිය යුතුය .


81
මම හැම විටම සම්භවය නියම කිරීමට එය ප්රයෝජනවත් git checkout origin/source_branch path/to/fileඔබට ඔබගේ දේශීය ණයකට මූලාශ්රය ශාඛා යාවත්කාලීන කිරීමට අතපසු කර තිබෙනවා නම්, ඔබ ගොනුව පැරණි අනුවාදය ලබා ඇති නිසා ... මම දන්නේ කොහොමද මගෙන් අහන්න. ;)
තලරික්

3
Y මයිමෝසා ප්‍රශ්නයේ දුරස්ථ සටහන් සඳහන් නොවූ අතර, එය තනිකරම දේශීය
රෙපෝවක්

1
මෙම විධානය මඟින් ගොනුවේ ඉතිහාසය හෝ ගොනුවේ අවසාන අනුවාදය ගෙන එනු ඇත්ද?
user1366265

1
command user1366265 මෙම විධානය මඟින් ගොනුව ඔබ විසින් නියම කරන ලද විශේෂිත බැඳීම හෝ ඔබ සඳහන් කළ ශාඛාවේ ප්‍රධානියා මෙන් තබනු ඇත. "ගොනුවක ඉතිහාසය" වැනි දෙයක් නොමැත, සියලුම ඉතිහාස තොරතුරු ගබඩා කර ඇත්තේ අතු වල පමණි.
දිමිත්‍රි අව්ටනොමොව්

3
මෙය ස්වයංක්‍රීයව පරීක්ෂා කළ ගොනුව වේදිකා ගත කරන බව පෙනේ. වේදිකා ගත නොකර එය කළ හැකිද?
bluenote10

46
git checkout branch_name file_name

උදාහරණයක්:

git checkout master App.java

ඔබේ ශාඛා නාමයේ කාල සීමාවක් තිබේ නම් මෙය ක්‍රියා නොකරනු ඇත.

git checkout "fix.june" alive.html
error: pathspec 'fix.june' did not match any file(s) known to git.

HPhilipRego මෙම පිළිතුර නිවැරදි ය. මම හිතන්නේ ඔබේ ශාඛාවේ වෙනස් ප්‍රාග්ධනීකරණයක් හෝ විරාම ලකුණු තිබේ, නැතහොත් ඔබට ඇත්තේ දුරස්ථ ශාඛාවක් මිස දේශීය ශාඛාවක් නොවේ. Git checkout doc බලන්න: git-scm.com/docs/git-checkout#Documentation/…
බ්‍රෙට්

Ret බ්‍රෙට් ශාඛාවේ නමට කාල සීමාවක් ඇති විට එය ක්‍රියාත්මක නොවන බව මට පෙනී ගියේය. මම සංස්කරණය කිරීමට යෝජනා කළෙමි
පිලිප් රෙගෝ

මෙය හොඳම පිළිතුරයි. මෙම පිළිතුර ඉහළම ශ්‍රේණිගත කිරීම යැයි මම ප්‍රාර්ථනා කරමි. වර්තමාන ඉහළම එක ඉතා ව්‍යාකූල සහ සරල නැත
රසල් ලෙගෝ

41

VonC සහ chhh හි පිළිතුරු වලට අතිරේක වේ.

git show experiment:path/to/relative/app.js > app.js
# If your current working directory is relative than just use
git show experiment:app.js > app.js

හෝ

git checkout experiment -- app.js

2
සිසිල්! දිගු මාර්ග නියම කිරීමට මම අකමැතියි. --ශාඛා නම සහ මාර්ග අතර ඇති ද්විත්ව ඉර ( ) විකල්පයක්ද? ඉරකින් ආරම්භ වන මාර්ග විකල්ප / ස්විච ලෙස සැලකීම වැළැක්වීම පමණක්ද?
ටොමාස් ගන්ඩෝර්

අවංකවම මම දන්නේ නැහැ. ඔබ මෙය පෙන්වා දෙන තුරු මට ඩබල් ඩෑෂ් අමතක වී ඇති බව මා දුටුවේ නැත.
ඇලෙක්ස්ලෝඩ් තෝර්සන්

6
@TomaszGandor --මෙය විකල්පයකි, නමුත් ශාඛා නාම සමඟ ගැටුම් වළක්වා ගැනීම වඩාත් ප්‍රයෝජනවත් වේ. උදාහරණයක් ලෙස, git checkout -- foo"HEAD වෙතින් ගොනු foo පරීක්ෂා කරන්න" (එනම් , foo හි දේශීය වෙනස්කම් නැවත ලියන්න , එනම් උප කුලකයක් git reset --hard), නමුත් git checkout fooඑයින් අදහස් කළ හැක්කේ හෝ "අපි ශාඛා foo වෙත යමු " යන්නයි.
ඇලෝයිස් මහඩාල්

8

නැතහොත් ඔබට වෙනත් ලිපිගොනු වෙනත් ලිපිගොනු වලින් අවශ්‍ය නම්:

git checkout <branch name> -- .

25
ආරම්භක ගවේෂණයේ "එක් ගොනුවක්" අඩංගු වේ.
greatvovan

1
මෙය ඒකාබද්ධ කිරීමට වඩා පවතින ලිපිගොනු ප්‍රතිස්ථාපනය කරයි
අමරේ

3
මෙය .විශාල වෙනසක් ඇති කරයි: වෙනත් ශාඛාවකට යාම වෙනුවට එය දැනට පවතින වෙබ් අඩවියෙන් ඔබව තබන අතරම එහි සිට සියලුම ලිපිගොනු පිටපත් කරයි. ඔබට වෙනත් ශාඛාවකින් ඇතුල් නොවී අන්තර්ගතය ලැබේ.
Xeverous

4

Github හි ඇති ගොනුව සමාලෝචනය කර එතැනින් අදින්න

මෙය ප්‍රායෝගික ප්‍රවේශයක් වන අතර එය OP ට සෘජුවම පිළිතුරු නොදෙන නමුත් සමහර ඒවා ප්‍රයෝජනවත් වී ඇත:

සැක සහිත ශාඛාව GitHub හි තිබේ නම්, ඔබට GitHub ඉදිරිපත් කරන බොහෝ මෙවලම් භාවිතා කර අපේක්ෂිත ශාඛාවට සහ ගොනුවට යා හැකිය, ඉන්පසු සරල පෙළ බැලීමට 'අමු' ක්ලික් කරන්න, සහ (විකල්පයක් ලෙස) පෙළ පිටපත් කර අලවන්න අපේක්ෂිත.

මම මෙම ප්‍රවේශයට කැමතියි එය ඔබගේ දේශීය යන්ත්‍රයට ඇද ගැනීමට පෙර දුරස්ථ ගොනුව සම්පූර්ණයෙන් බැලීමට ඉඩ සලසයි.


2
කෙසේ වෙතත් අමු ගොනුව පිටපත් කිරීම හා ඇලවීම ඔබගේ git වෙනසෙහි අනවශ්‍ය අක්ෂර වෙනස්වීම් වලට හේතු වේ. කිසිදු වෙනසක් සිදු නොවන බව සහතික කිරීම සඳහා ගොනුව කෙලින්ම ඔබේ ව්‍යාපෘතියට සුරැකීම ආරක්ෂිතයි.
පිලිප් රෙගෝ

1

තවත් ක්‍රමයක් නම් වෙනස්කම් සහිත පැච් එකක් සාදා එය ප්‍රධාන ශාඛාවේ යෙදීමයි. ඔබ app.js හි වැඩ කිරීමට පෙර අවසන් කැපවීම 00000aaaaa යැයි කියමු. ඔබට අවශ්‍ය අනුවාදය වෙනස් කිරීමේ කැපවීම 00000bbbbb වේ

ඔබ මෙය අත්හදා බැලීමේ ශාඛාව මත ධාවනය කරයි:

git diff 00000aaaaa 00000bbbbb app.js > ~/app_changes.git

මෙය ඔබට අවශ්‍ය ඕනෑම තැනක යෙදිය හැකි app.js සඳහා වන එම කොමිස් දෙක අතර ඇති සියලු වෙනස්කම් සහිත ගොනුවක් නිර්මාණය කරයි. ඔබට එම ගොනුව ව්‍යාපෘතියෙන් පිටත ඕනෑම තැනක තබා ගත හැකිය

එවිට, ඔබ දුවන්නේ:

git apply ~/app_changes.git

දැන් ඔබ ව්‍යාපෘති වල වෙනස්කම් ඔබ අතින් සාදා ඇති ආකාරයට දකිනු ඇත.


0

ඔබට විශේෂිත බැඳීමකින් (ඕනෑම ශාඛාවකින්) ගොනුව අවශ්‍ය නම්, 06f8251f කියන්න

git checkout 06f8251f path_to_file

උදාහරණයක් ලෙස, කවුළු වල:

git checkout 06f8251f C: \ A \ B \ C \ D \ file.h


1
පිළිතුරු දීමට කාලය ගැනීම ගැන ස්තූතියි! නමුත් මෙය ප්‍රශ්නයට පිළිතුරු නොදෙන අතර ඉතා සවිස්තරාත්මකව හොඳ පිළිතුරක් මීට වසර 9 කට පෙර පළ කර ඇත. ප්‍රශ්නය ගැසීමට අවශ්‍ය නැත.
නේතන්

මෙය වලංගු ප්‍රායෝගික අවස්ථාවකි. පිළිතුර ශාඛාව සමඟ නිවැරදිව ගනුදෙනු කරයි, නමුත් ශාඛාවේ විශේෂිත බැඳීමක් දෙස බැලීම ගැන කුමක් කිව හැකිද?
arupjbasu

-3
git checkout master               -go to the master branch first
git checkout <your-branch> -- <your-file> --copy your file data from your branch.

git show <your-branch>:path/to/<your-file> 

මෙය ඔබට උපකාරී වේ යැයි සිතමි. ඔබට කිසියම් විමසුමක් ඇත්නම් කරුණාකර මට දන්වන්න.

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.