Зафіксаваць толькі частка файла ў Git

Калі я ўношу змены ў файл у Git, як я магу выканаць толькі некаторыя з змяненняў?

Напрыклад, як я магу выканаць толькі 15 радкоў з 30 радкоў, якія былі зменены ў файле?

2394
06 июля '09 в 5:25 2009-07-06 05:25 зададзены freddiefujiwara 06 ліпеня '09 ў 05:25 2009-07-06 05:25
@ 22 адказаў

Вы можаце выкарыстоўваць git add --patch <filename> (або -p для сцісласці), і git пачне разбіваць ваш файл на тое, што ён лічыць разумнымі "порцыямі" (па частках файла). Затым ён падкажа вам гэтае пытанне:

 Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]? 

Вось апісанне кожнай опцыі:

  • y падрыхтаваць гэты кавалак для наступнага камітаў
  • n ня ставіць гэты кавалак для наступнага камітаў
  • q выхад; не стаўце гэты кавалак або любой з рэшты кавалкаў
  • a ставіць гэты кавалак і ўсе наступныя фрагменты ў файле
  • d ня ставіць гэты блок або якой-небудзь больш позні фрагмент у файле
  • g абярыце кавалак, каб перайсці да
  • / Пошук блока, адпаведнага зададзенаму рэгулярнаму выразу
  • j пакінь гэты кавалак нявырашаным, глядзі наступны нявырашанае кавалак
  • J пакінь гэты кавалак нявырашаным, глядзі наступны кавалак
  • k пакінуць гэты кавалак нявырашаным, см. Папярэдні нявырашанае кавалак
  • K пакінь гэты кавалак нявырашаным, глядзі папярэдні кавалак
  • s падзяліць бягучы кавалак на больш дробныя фрагменты
  • e ўручную рэдагаваць бягучы блок
  • ? даведка па раздрукоўцы

Калі файл яшчэ не знаходзіцца ў сховішча, вы можаце спачатку зрабіць git add -N <filename> . Пасля гэтага вы можаце працягнуць з дапамогай git add -p <filename> .

Пасля гэтага вы можаце выкарыстоўваць:

  • git diff --staged каб пераканацца, што вы паставілі правільныя змены
  • git reset -p каб расшпіліць памылкова дададзеныя фрагменты
  • git commit -v для прагляду вашага камітаў падчас рэдагавання паведамлення камітаў.

Звярніце ўвагу, што гэта моцна адрозніваецца ад каманды git format-patch , мэтай якой з'яўляецца аналіз дадзеных .patch файлах .patch .

Спасылка на будучыню: Git Tools - Інтэрактыўная пастаноўка

3149
06 июля '09 в 5:36 2009-07-06 05:36 адказ дадзены cloudhead 06 ліпеня '09 ў 05:36 2009-07-06 05:36

Вы можаце выкарыстоўваць git add --interactive або git add -p <file> , а затым git commit (не git commit -a ); см. інтэрактыўны рэжым у git-Add manpage або проста прытрымлівайцеся інструкцыям.

Сучасны Git таксама мае git commit --interactivegit commit --patch , які з'яўляецца ярлыком для параметру патча ў інтэрактыўнай фіксацыі).

border=0

Калі вы аддаеце перавагу рабіць гэта з графічнага інтэрфейсу, вы можаце выкарыстоўваць git-gui . Вы можаце проста адзначыць кавалкі, якія вы хочаце ўключыць у фіксацыю. Мне асабіста лягчэй, чым выкарыстоўваць git add -i . Іншыя Git GUI, такія як QGit або GitX, таксама могуць мець гэтую функцыянальнасць.

223
06 июля '09 в 14:49 2009-07-06 14:49 адказ дадзены Jakub Narębski 06 ліпеня '09 ў 14:49 2009-07-06 14:49

git gui прадастаўляе гэтую функцыянальнасць пад выглядам diff. Проста пстрыкніце правай кнопкай мышы цікавую для вас лінію, і вы ўбачыце пункт меню "Гэты радок для фіксацыі".

118
06 июля '09 в 5:41 2009-07-06 05:41 адказ дадзены Ionuţ G. Stan 06 ліпеня '09 у 5:41 2009-07-06 05:41

Я лічу, што git add -e myfile - самы просты спосаб (прынамсі, маё перавагу), паколькі ён проста адкрывае тэкставы рэдактар і дазваляе вам выбраць, якую радок вы хочаце выканаць, а якая радок у вас няма. Што тычыцца каманд рэдагавання:

даданыя кантэнт:

Дададзены змесціва прадстаўлена радкамі, якія пачынаюцца з "+". Вы можаце прадухіліць стварэнне любых ліній складання, выдаліўшы іх.

аддалены кантэнт:

Выдаленае змесціва прадстаўлена радкамі, якія пачынаюцца з "-". Вы можаце прадухіліць іх выдаленне шляхам пераўтварэння "-" у "" (прабел).

змененае тэкст быў:

Змененае змесціва прадстаўлена лініямі "-" (выдаленне старога змесціва), за якім ідуць радка "+" (даданне замяшчае змесціва). Вы можаце прадухіліць ўстаноўку мадыфікацыі шляхам пераўтварэння радкоў "-" у "" і выдаленні "+", ліній. Памятаеце, што змяненне толькі паловы пары, хутчэй за ўсё, прывядзе да заблытваецца зменаў індэкса.

Кожная інфармацыя аб git add даступная на git --help add

64
25 сент. адказ дадзены theFreedomBanana 25 сент. 2015-09-25 23:45 '15 а 23:45 2015/09/25 23:45

Калі вы выкарыстоўваеце vim, вы можаце паспрабаваць выдатны убудова пад назвай fugitive .

Вы можаце ўбачыць diff файла паміж рабочай копіяй і індэксам з дапамогай :Gdiff , а затым дадаць радкі або слупкі у індэкс, выкарыстоўваючы класічныя каманды vim diff, такія як dp . Захавайце змены ў індэксе і скапіруйце з дапамогай :Gcommit , і ўсё гатова.

Вельмі добрыя уступныя відэаролікі тут (гл. Частка 2 ).

42
23 февр. адказ дадзены François 23 февр. 2012-02-23 13:37 '12 у 13:37 2012-02-23 13:37

Я настойліва рэкамендую выкарыстоўваць SourceTree ад Atlassian. (Гэта бясплатна.) Гэта робіць гэта трывіяльным. Вы можаце хутка і лёгка ствараць асобныя кавалкі кода або асобныя радкі кода.

2019

29
12 авг. адказ дадзены user486646 12 жнів. 2014-08-12 16:32 '14 у 16:32 2014/08/12 16:32

Варта адзначыць, што для выкарыстання git add --patch для новага файла вам трэба спачатку дадаць файл у індэкс з дапамогай git add --intent-to-add :

 git add -N file git add -p file 
22
05 дек. адказ дадзены user1338062 05 снеж. 2014-12-05 20:29 '14 у 20:29 2014/12/05 20:29

Калі ў мяне будзе шмат змен і ў выніку створаць некалькі камітаў з змен, я хачу часова захаваць сваю пачатковую кропку, перш чым ствараць рэчы.

Вось так:

 $ git stash -u Saved working directory and index state WIP on master: 47a1413 ... $ git checkout -p stash ... step through patch hunks $ git commit -m "message for 1st commit" $ git checkout -p stash ... step through patch hunks $ git commit -m "message for 2nd commit" $ git stash pop master $ git stash -u Saved working directory and index state WIP on master: 47a1413 ... $ git checkout -p stash ... step through patch hunks $ git commit -m "message for 1st commit" $ git checkout -p stash ... step through patch hunks $ git commit -m "message for 2nd commit" $ git stash pop 

Адказ Whymarh - гэта тое, што я звычайна раблю, за выключэннем таго, што часам адбываецца мноства змен, і я магу сказаць, што магу зрабіць памылку падчас пастаноўкі рэчаў, і я хачу, каб нейкае стан я мог адступіць на другі праход .

19
07 июня '13 в 1:14 2013-06-07 01:14 адказ дадзены jdsumsion 07 чэрвеня '13 у 01:14 2013/06/07 01:14

Калі вы выкарыстоўваеце emacs, паглядзіце Magit , які дае інтэрфейс git для emacs. Ён добра падтрымлівае прамежкавых фрагментаў (часткі файлаў).

12
08 июля '09 в 10:00 2009-07-08 10:00 адказ дадзены Mark van Lent 08 ліпеня '09 а 10:00 2009-07-08 10:00

Як і ў выпадку з jdsumsion, вы таксама можаце схаваць сваю бягучую працу, але затым выкарыстоўвайце difffool, напрыклад meld, каб выцягнуць выбраныя змены з патаемнага ходу. Такім чынам, вы можаце нават ўручную адрэдагаваць кавалкі, што трохі балюча, калі ў git add -p :

 $ git stash -u $ git difftool -d -t meld stash $ git commit -a -m "some message" $ git stash pop 

Выкарыстанне метаду stash дае вам магчымасць пратэставаць, калі ваш код ўсё яшчэ працуе, перш чым выканаць яго.

8
07 авг. адказ дадзены derhoch 07 жнів. 2013-08-07 16:25 '13 у 16:25 2013/08/07 16:25

Intellij IDEA (і я мяркую, што ўсе астатнія прадукты серыі) пабудавалі падтрымку частковых камітаў, паколькі v2018.1

2019

Для тых, хто выкарыстоўвае Git Пашырэньні:

У акне "Капіяваць" абярыце файл, які вы хочаце часткова здзейсніць, затым выберыце тэкст, які вы хочаце зафіксаваць, у правай панэлі, затым пстрыкніце правай кнопкай мышы на выдзеленым фрагменце і абярыце "Сфарміраваць выбраныя радкі" ў кантэкстным меню.

7
27 июля '15 в 12:52 2015-07-27 12:52 адказ дадзены srgstm 27 ліпеня '15 ў 12:52 2015/07/27 00:52

vim-gitgutter убудова можа ствараць Ханка, не выходзячы з рэдактара vim, выкарыстоўваючы

 :GitGutterStageHunk 

Акрамя гэтага, ён падае іншыя цікавыя функцыі, такія як слупок з розным знакам, як у некаторых сучасных IDE

Калі толькі частка hunk павінна быць пастаўлена vim-fugitive

 :Gdiff 

дазваляе выбіраць дыяпазон бачнага дыяпазону, затым :'<,'>diffput або :'<,'>diffget для змены / змены асобных радкоў.

6
09 янв. адказ дадзены c0ffeeartc 09 студз. 2015-01-09 20:11 '15 у 20:11 2015/01/09 20:11

Паспрабаваў git add -p filename.x , але на Mac я выявіў, што gitx ( http://gitx.frim.nl/ або https://github.com/pieter/gitx ) значна прасцей здзейсніць сапраўды лініі, якія я хацеў .

5
16 авг. адказ дадзены jasongregori 16 жнів. 2011-08-16 02:43 '11 у 2:43 2011-08-16 02:43

З TortoiseGit:

пстрыкніце правай кнопкай мышы файл і выкарыстоўвайце Context Menu → Restore after commit . Гэта створыць копію файла, як ёсць. Затым вы можаце адрэдагаваць файл, напрыклад. у TortoiseGitMerge і адмяніце ўсе змены, якія вы не хочаце здзяйсняць. Пасля захавання гэтых зменаў можна зафіксаваць файл.

4
06 апр. адказ дадзены Fr0sT 06 крас. 2015-04-06 19:16 '15 у 19:16 2015/04/06 19:16

git-meld-index - цытаванне з вэб-сайта:

git -meld-index запускае meld - або любы іншы git diffftool (kdiff3, diffuse і г.д.) - каб вы маглі інтэрактыўна змяняць змены індэкса git (таксама вядомага як git).

Гэта падобна на функцыянальнасць git add -p і git add --interactive. У некаторых выпадках meld лягчэй / хутчэй выкарыстоўваць, чым git add -p. Гэта таму, што meld дазваляе вам, напрыклад ,:

  • см. больш кантэксту
  • см. внутрилинейные адрозненні
  • адрэдагуйце ўручную і паглядзіце 'live' diff updates (абнаўляецца пасля кожнага націску клавішы)
  • перайдзіце да змены, не паказваючы "n" на кожнае змяненне, якое вы хочаце прапусціць.

выкарыстанне

У рэпазітары git запусціце:

 git meld-index 

Вы ўбачыце, што meld (або наладжаны git diffftool) з'яўляецца з дапамогай

LEFT: файлы часовага каталога, скапіраваныя з працоўнага дрэва

НАПРАВА: часовы каталог з змесцівам азначніка. Гэта таксама ўключае файлы, якія яшчэ не знаходзяцца ў індэксе, але змененыя ці не правераны ў рабочай копіі - у гэтым выпадку вы ўбачыце змесціва файла з HEAD.

Адрэдагуйце індэкс (справа) да таго часу, пакуль ён не стане шчаслівым. Не забудзьцеся захаваць пры неабходнасці.

Калі вы скончыце, зачыніце meld і git -meld-index абновіць індэкс, каб ён адпавядаў змесціва часовага каталога ў правай частцы каманды meld, якую вы толькі што адрэдагавалі.

2
04 июля '15 в 23:26 2015-07-04 23:26 адказ дадзены Croad > 04 ліпеня '15 ў 23:26 2015/07/04 23:26
2
13 июля '09 в 0:52 2009-07-13 00:52 адказ дадзены zut 13 ліпеня '09 ў 0:52 2009-07-13 00:52

Дадаючы папярэдні адказ, калі вы аддаеце перавагу выкарыстоўваць камандную радок, увядзіце git add -e myfile дае вам выбар, каб выбраць радок за радком, якую вы хочаце зафіксаваць, таму што гэтая каманда адкрые рэдактар з адрозненнямі, напрыклад:

2019

24 авг. адказ дадзены Beto Aveiga 24 жнів. 2018-08-24 18:24 '18 у 18:24 2018/08/24 18:24

Для карыстальнікаў Atom пакет github ўключае інтэрактыўную пастаноўку ў стылі git gui . Для цэтлікаў см. Дакументацыю да ўпакоўкі.

Выкарыстанне Atom дазваляе працаваць з тэмай з цёмным фонам (па змаўчанні git gui мае белы фон).

1
10 апр. адказ дадзены Ioannis Filippidis 10 крас. 2018-04-10 05:31 '18 у 05:31 2018/04/10 05:31

Як адзін адказ вышэй паказвае, вы можаце выкарыстоўваць git add --patch filename.txt

або кароткая форма git add -p filename.txt

... але для файлаў, ужо знаходзяцца ў вашым рэпазітары, ёсць нашмат лепш выкарыстоўваць сцяг -patch для каманды commit (калі вы выкарыстоўваеце дастаткова нядаўнюю версію git): git commit --patch filename.txt

... ці, зноў жа, кароткая форма git commit -p filename.txt

... і затым выкарыстоўваючы названыя ключы (y / n і г.д.), для выбару радкоў, якія павінны быць уключаны ў фіксацыю.

1
30 июня '14 в 11:34 2014-06-30 11:34 адказ дадзены Samuel Lampa 30 чэрвеня '14 у 11:34 2014/06/30 11:34

git-cola - выдатны графічны інтэрфейс, а таксама убудаваная функцыя. Проста выберыце лініі для сцэны і націсніце S. Калі выбар не вырабляецца, выконваецца поўны кавалак.

0
27 авг. адказ дадзены AndiDog 27 жнів. 2015-08-27 14:28 '15 у 14:28 2015/08/27 14:28

Калі на платформе Windows , на мой погляд, git gui - лепшы інструмент для stage / commit некалькіх радкоў з unstaged файла

1. Хенк мудры:

  • Выберыце файл з падзелу unstagged Changes
  • Пстрыкніце правай кнопкай мышы код кода, які неабходна выканаць.
  • Выберыце Stage Hunk for commit

2. Радок:

  • Выберыце файл з падзелу unstagged Changes
  • Выберыце радок / радкі, якія будуць арганізаваны
  • Выберыце Stage Lines for commit

3. Калі вы хочаце стварыць поўны файл, акрамя пары радкоў:

  • Выберыце файл з падзелу unstagged Changes
  • Націсніце Ctrl+T (Stage file to commit)
  • Абраны файл цяпер перамяшчаецца ў Staged Changes Раздзел
  • Выберыце радок / радкі, якія будуць арганізаваны
  • Выберыце UnStage Lines for commit
0
28 мая '15 в 15:52 2015-05-28 15:52 адказ дадзены Anvesh Yalamarthy 28 мая '15 у 15:52 2015/05/28 15:52

Іншыя пытанні па пазнаках або Задайце пытанне