`Git merge` සහ` git merge --no-ff` අතර වෙනස කුමක්ද?


1011

භාවිතා කරමින් gitk log, මට මේ දෙක අතර වෙනසක් හඳුනාගත නොහැකි විය. (Git විධානයක් හෝ යම් මෙවලමක් සමඟ) වෙනස නිරීක්ෂණය කරන්නේ කෙසේද?




Answers:


1118

මෙම --no-ffධජය කිරීම වළක්වා git mergeඇති "වේගයෙන් ඉදිරියට" ක්රියාත්මක සිට එය ඔබේ වත්මන් බව හඳුනාගන්නා නම් HEADඔබ ඒකාබද්ධ කිරීමට උත්සාහ දරන සිදු ක පිය වේ. වේගයෙන් ඉදිරියට යාම යනු ඒකාබද්ධ කිරීමේ බැඳීමක් ගොඩනඟනවා වෙනුවට, git මඟින් ඔබේ ශාඛා දර්ශකය ඉදිරියට එන බැඳීම වෙත යොමු කිරීමයි. git pullදේශීය වෙනස්කම් නොමැතිව එය සිදු කිරීමේදී මෙය බහුලව සිදු වේ .

කෙසේ වෙතත්, ඉඳහිට ඔබට මෙම හැසිරීම වළක්වා ගැනීමට අවශ්‍යය, සාමාන්‍යයෙන් ඔබට විශේෂිත ශාඛා ස්ථලකයක් පවත්වා ගැනීමට අවශ්‍ය නිසා (උදා: ඔබ මාතෘකා ශාඛාවකට ඒකාබද්ධ වන අතර ඉතිහාසය කියවීමේදී එය එසේ බව සහතික කිරීමට ඔබට අවශ්‍යය). ඒක කරන්න නියෝගයක්, ඔබ උරුම විය හැකි --no-ffධජය සහ git mergeඇත හැම විටම වේගයෙන් ඉදිරියට වෙනුවට ඇත්තටම සකස් කිරීම.

ඒ හා සමානව, ඔබට වේගයෙන් ඉදිරියට යාම සඳහා a git pullහෝ භාවිතා කිරීමට අවශ්‍ය නම් git merge, සහ වේගයෙන් ඉදිරියට යාමට නොහැකි නම් ඔබට ඇප දීමට අවශ්‍ය නම්, ඔබට --ff-onlyධජය භාවිතා කළ හැකිය . මේ ආකාරයෙන් ඔබට සිතීමකින් git pull --ff-onlyතොරව නිතිපතා යමක් කළ හැකි අතර, එය වැරදුනහොත් ඔබට ආපසු ගොස් ඔබට ඒකාබද්ධ කිරීමට හෝ නැවත ප්‍රතිස්ථාපනය කිරීමට අවශ්‍ය දැයි තීරණය කළ හැකිය.


91
OP හි ප්‍රශ්නයට වඩාත් directly ජුව පිළිතුරු සැපයීම සඳහා: ඒවා සැමවිටම වෙනස් නොවේ, නමුත් ඒවා නම්, එය පැහැදිලි ය, gitkනැතහොත් git log --graphවේගයෙන් ඉදිරියට යන ඒකාබද්ධ කිරීම ඒකාබද්ධ කිරීමේ බැඳීමක් ඇති නොකළ අතර වේගයෙන් ඉදිරියට නොගිය තැනැත්තා එසේ කළේය.
කැස්කබෙල්

12
Ff මඟ හැරීමට හේතුව පුළුල් කිරීම සතුටක් වනු ඇත: කතුවරයා “විශේෂිත ශාඛා ස්ථල විද්‍යාව” සඳහන් කළේ --no-ff නඩුවේදී අතිරේක ඒකාබද්ධ කිරීමේ බැඳීමක් ඒකාබද්ධයේ සලකුණ ලෙස සේවය කරන බවයි. වාසි වන්නේ කතුවරයාගේ නම් සහ ඒකාබද්ධ කිරීම සමඟ පැහැදිලිව ඒකාබද්ධ කිරීමේ සලකුණයි. අවාසි යනු රේඛීය නොවන ඉතිහාසයක් වන අතර එය රේල් පාරවල් අභිසාරී කරයි. දීර් review සමාලෝචන ක්‍රියාවලියක් හේතුවෙන් දායකයින්ගේ උනන්දුව නැතිවීම ඒකාබද්ධයේ ඇති විය හැකි මානසික අතුරු ආබාධයකි
ව්ලැඩ්

6
එය බව කීම සාධාරණ වනු ඇත --no-ffවිශේෂාංග සිට ස්වාමියා සංවර්ධනය හෝ සංවර්ධනය කිරීම සඳහා අදින්න ඉල්ලීම ඒකබද්ධ සමාන ද?
merlinpatt

10
@merlinpatt ෂුවර්. ඔබ අදින්න ඉල්ලීමක් GitHub හි ඒකාබද්ධ කරන්නේ නම් එය සමාන වේ --no-ff.
ලිලී බැලාර්ඩ්

2
මෙය හොඳ පැහැදිලි කිරීමකි. මචං, පිරිසිදු git ඉතිහාසය සැබවින්ම වැදගත් වන්නේ ඇයිද යන්න තේරුම් ගැනීමට මිනිසුන්ට ප්‍රමාණවත් තරම් හොඳ පැහැදිලි කිරීම් නොමැත (මා ඇතුළත්!)
dudewad

1069

මෙම ප්‍රශ්නයට ග්‍රැෆික් පිළිතුර

භාවිතා කිරීම පිළිබඳ පැහැදිලි පැහැදිලි කිරීමක් සහ චිත්‍රක නිදර්ශනයක් සහිත වෙබ් අඩවියක් මෙන්නgit merge --no-ff :

git merge --no-ff සහ git merge අතර වෙනස

මෙය දකින තුරු මට සම්පූර්ණයෙන්ම ගිටාර් නැති විය. භාවිතා කිරීම --no-ffමඟින් ඉතිහාසය සමාලෝචනය කරන කෙනෙකුට ඔබ වැඩ කළ ශාඛාව පැහැදිලිව දැකගත හැකිය . (එම සබැඳිය ගිතූබ්ගේ “ජාල” දෘශ්‍යකරණ මෙවලම වෙත යොමු කරයි) තවද මෙහි නිදර්ශන සහිත තවත් විශිෂ්ට සඳහනක් ඇත. මෙම යොමුව පළමු එක මනාව සම්පුර්ණ කරන්නේ git ගැන අඩු දැනුමක් ඇති අය කෙරෙහි වැඩි අවධානයක් යොමු කරමිනි.


මා වැනි නවකයන් සඳහා මූලික තොරතුරු

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


උදාහරණ වැඩ ප්‍රවාහය

මම මගේ වෙබ් අඩවියට පැකේජයක් යාවත්කාලීන කළ අතර මගේ කාර්ය ප්‍රවාහය බැලීමට මගේ සටහන් වෙත ආපසු යාමට සිදු විය; මෙම පිළිතුරට උදාහරණයක් එකතු කිරීම ප්‍රයෝජනවත් යැයි මම සිතුවෙමි.

Git විධානවල මගේ කාර්ය ප්‍රවාහය:

git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am  "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master

පහළ: පැහැදිලි කිරීම් ඇතුළුව සත්‍ය භාවිතය.
සටහන: පහත ප්‍රතිදානය කපා ඇත; git තරමක් වාචික ය.

$ git status
# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   ecc/Desktop.php
#       modified:   ecc/Mobile.php
#       deleted:    ecc/ecc-config.php
#       modified:   ecc/readme.txt
#       modified:   ecc/test.php
#       deleted:    passthru-adapter.igs
#       deleted:    shop/mickey/index.php
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       ecc/upgrade.php
#       ecc/webgility-config.php
#       ecc/webgility-config.php.bak
#       ecc/webgility-magento.php

ඉහළින් කරුණු 3 ක් සැලකිල්ලට ගන්න:
1) ප්‍රතිදානයේදී ඔබට නව ලිපිගොනු එකතු කිරීම ඇතුළුව ECC පැකේජයේ උත්ශ්‍රේණිගත කිරීමේ වෙනස්කම් දැකිය හැකිය.
2) මෙම /eccවෙනසෙන් ස්වාධීනව මා මකා දැමූ ලිපිගොනු දෙකක් ( ෆෝල්ඩරයේ නැත) ද ඇති බව සැලකිල්ලට ගන්න . එම ගොනු මකාදැමීම් සමඟ පටලවා ගැනීම වෙනුවට, එම ලිපිගොනු මකාදැමීම පිළිබිඹු eccකිරීම සඳහා මම cleanupපසුව වෙනත් ශාඛාවක් සාදමි.
3) මම මගේ කාර්ය ප්‍රවාහය අනුගමනය කළේ නැත! මම නැවත වැඩ කිරීමට උත්සාහ කරන අතරතුර මට git ගැන අමතක විය.

පහළ: git commit -am "updated ecc package"මම සාමාන්‍යයෙන් සියල්ල ඇතුළත් කරනවාට වඩා , මට අවශ්‍ය වූයේ /eccෆෝල්ඩරයේ ගොනු එක් කිරීම පමණි . එම මකාදැමූ ලිපිගොනු විශේෂයෙන් මගේ කොටසක් නොවේ git add, නමුත් ඒවා දැනටමත් git මගින් සොයාගෙන ඇති හෙයින්, මෙම ශාඛාවේ කැපවීමෙන් ඒවා ඉවත් කිරීමට මට අවශ්‍යය:

$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M       passthru-adapter.igs
M       shop/mickey/index.php

$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"

$ git checkout master
D       passthru-adapter.igs
D       shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
   8a0d9ec..333eff5  master -> master



ඉහත ස්වයංක්‍රීය කිරීම සඳහා පිටපත

මෙම ක්‍රියාවලිය දිනකට 10+ වතාවක් භාවිතා කර ඇති අතර, විධාන ක්‍රියාත්මක කිරීම සඳහා කණ්ඩායම් ස්ක්‍රිප්ට් ලිවීමට මම කටයුතු කර ඇත්තෙමි, එබැවින් git_update.sh <branch> <"commit message">ඉහත පියවරයන් කිරීම සඳහා මම නිසි පරිදි පාහේ ස්ක්‍රිප්ට් එකක් සෑදුවෙමි. මෙන්න එම පිටපත සඳහා සාරාංශ මූලාශ්‍රය .

ඒ වෙනුවට git commit -amමම නිෂ්පාදනය කරන්නේ “වෙනස් කරන ලද” ලැයිස්තුවෙන් ගොනු තෝරාගෙන git statusමෙම ස්ක්‍රිප්ට් එකේ අලවන්න. මෙය සිදු වූයේ මා විසින් සංස්කරණ දුසිම් ගණනක් කළ නමුත් වෙනස්කම් සමූහගත කිරීමට විවිධ ශාඛා නාම අවශ්‍ය වූ බැවිනි.


11
--no-ffවිකල්පය සමඟ ඒකාබද්ධ වූ පසු ඔබට තවමත් ශාඛාවක් ආරක්ෂිතව මකා දැමිය හැකිද ?
ඇන්ඩි ෆ්ලෙමින්

17
EsDesignerGuy ඔව් ඔබට පැරණි ශාඛාව ආරක්ෂිතව මකා දැමිය හැකිය. ශාඛා එස් නිශ්චිත බැඳීමකට යොමු කරන්නන් ලෙස සිතන්න.
සයිෆ්‍රැක්ස්

2
සම්බන්ධිත පිටුවෙන් මෙම පා text ය ප්‍රයෝජනවත් බව මට පෙනී ගියේය: --no-ff නොමැතිව "කැපවූ වස්තූන් කවරක් විසින් අංගයක් ක්‍රියාත්මක කර ඇත්දැයි Git ඉතිහාසයෙන් දැකිය නොහැක - ඔබට සියලු ලොග් පණිවිඩ අතින් කියවිය යුතුය."
ලෝර්න් ලලිබර්ට්

එක් රූපයක් සෑම විටම වචන දහසකට වඩා හොඳය!
රුප්ස්

1
ග්‍රැෆික් දෙවන රූපයේ විශේෂාංග ශාඛාව පෙන්වන්නේ නැත, ඇයි නැත්තේ? එය තවමත් පවතී නේද?
ADJenks

296

උපාය මාර්ග ඒකාබද්ධ කරන්න

පැහැදිලි ඒකාබද්ධ කිරීම : නව ඒකාබද්ධ කිරීමේ බැඳීමක් නිර්මාණය කරයි. (ඔබ භාවිතා කළහොත් ඔබට ලැබෙන්නේ මෙයයි --no-ff.)

රූප විස්තරය මෙහි ඇතුළත් කරන්න

වේගයෙන් ඉදිරියට යාම ඒකාබද්ධ කිරීම: නව බැඳීමක් ඇති නොකර වේගයෙන් ඉදිරියට යන්න:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ප්‍රතිස්ථාපනය : නව මූලික මට්ටමක් ඇති කිරීම:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ස්කොෂ්: සමතලා වන පරිදි (යමක්) බලයෙන් පොඩි කරන්න හෝ මිරිකා ගන්න:

රූප විස්තරය මෙහි ඇතුළත් කරන්න


12
සිත්ගන්නාසුලු ග්‍රැෆික් නමුත් එය සැබවින්ම --no-ff නඩුව නොපෙන්වන අතර එම නිසා මෙහි ඇති ප්‍රශ්නයට එතරම් පිළිතුරු සපයන්නේ නැත
Vib

24
පළමුවැන්න, “පැහැදිලි ඒකාබද්ධ කිරීම”, මෙහි “ඒකාබද්ධ කිරීම” ලෙස නම් කර ඇති අතර එය එෆ්එෆ් නොවන ඒකාබද්ධ කිරීමකි.
bkribbs

4
ඒ ග්‍රැෆික්ස් මට ඇත්තටම උදව් කළා
exexzian

2
එක් කියමනකට පිළිතුරු සපයන්නේ නැත, නමුත් මෙම ග්‍රැෆික් විශ්මයජනකයි, UPVOTE!
සෝවියට් ෆ්‍රොන්ටියර්

4
එසේනම් රීබේස් සහ වේගයෙන් ඉදිරියට යාම ඒකාබද්ධ කිරීම අතර වෙනස කුමක්ද?
තැනෝස් ෆිෂර්මන්

222

මෙම --no-ffවිකල්පය වගකීම උපවාසයක් ඉදිරියට ඒකාබද්ධ සිදු නොවන බව, ඒ හැම විටම නිර්මාණය කරනු ඇත, නව සිදු වස්තුව . විශේෂාංග ශාඛා වල ඉතිහාසය පවත්වා ගැනීමට ඔබට අවශ්‍ය නම් මෙය යෝග්‍ය වේ.             git merge --no-ff vs git merge ඉහත රූපයේ, වම් පැත්ත භාවිතා කිරීමෙන් පසු git ඉතිහාසයට උදාහරණයක් වන git merge --no-ffඅතර දකුණු පැත්ත git mergeff ඒකාබද්ධ කිරීමක් කළ හැකි තැන භාවිතා කිරීම සඳහා උදාහරණයකි .

සංස්කරණය කරන්න : මෙම රූපයේ පෙර සංස්කරණයේ දැක්වෙන්නේ ඒකාබද්ධ කිරීමේ කැපවීම සඳහා තනි මාපියෙකු පමණක් බවයි. ඒකාබද්ධ කිරීමේ කොමිට් වලට "විශේෂාංග ශාඛාවේ" සහ මුල් ශාඛාවේ ඉතිහාසය පවත්වා ගැනීමට git භාවිතා කරන බහු මාපිය කොමිස් ඇත. බහු මාපිය සබැඳි කොළ පැහැයෙන් දක්වා ඇත.


3
හරිත ඊතලය කළු ඊතලය එදිරිව ඇඟවුම් කරන්නේ කුමක්ද?
rtconner

11
හරිත ඊතලය මඟින් කැපවීමකට වඩා දෙමව්පියන් සිටින බැඳීමක් සහ දෙමාපියෙකු අතර සම්බන්ධයක් දක්වයි. සාමාන්‍ය කොමිස් (කළු) ඇත්තේ එක් දෙමාපියෙකු පමණි.
ඩැනියෙල් ස්මිත්

9
An ඩැනියෙල් ස්මිත් ඔබ මෙම අලංකාර ප්‍රස්ථාරය අඳින්නේ කෙසේද?
chancyWu

4
ඇඩෝබි ඉලස්ට්‍රේටර් සමඟ @chancyWu
ඩැනියෙල් ස්මිත්

මගේ සමාගම තුළ සියලු අදින්න ඉල්ලීම් --no-ff විකල්පය සමඟ ඒකාබද්ධ වී ඇති බව පෙනේ. එම තත්වයන් යටතේ, මම අදින්න ඉල්ලීමක් කිරීමට පෙර නැවත ප්‍රතිස්ථාපනය කිරීම අර්ථවත්ද?
නික්පික්

37

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


කරුණාකර ඉහත මගේ පිළිතුරෙහි කාර්ය ප්‍රවාහය සමාලෝචනය කරනවාද: මෙයින් අදහස් කරන්නේ මට දැන් ලැබී ඇති ප්‍රමාණය ඉක්මවා අමතර කොමිස් අවශ්‍යද? ස්තූතියි.
ක්‍රිස් කේ

3
H ක්‍රිස්ක් git merge --no-ff eccඔබට git logශාඛා මාස්ටර් සඳහා අතිරේක ඒකාබද්ධ කිරීමක් සිදු කරනු ඇත . මාස්ටර් විසින් ec ජු මුතුන් මිත්තෙකු වෙත යොමු වන්නේ නම් එය තාක්‍ෂණිකව අවශ්‍ය නොවේ. නමුත් --no-ff විකල්පය සඳහන් කිරීමෙන් ඔබ එම ඒකාබද්ධ කිරීමේ බැඳීම නිර්මාණය කිරීමට බල කරයි. එහි මාතෘකාව ඇත:Merge branch 'ecc'
අන්කූර් අගර්වාල්

නියම සාරාංශය! :)
එඩ්වඩ්

5

--No-ff ධජය මඟින් ඒකාබද්ධ කිරීම සෑම විටම නව කැපවීමේ වස්තුවක් නිර්මාණය කරයි, ඒකාබද්ධය වේගයෙන් ඉදිරියට ගෙන යා හැකි වුවද. විශේෂාංග ශාඛාවක historical තිහාසික පැවැත්ම පිළිබඳ තොරතුරු නැතිවීම මෙමඟින් වළක්වයි

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.