Фиксирайте само част от файла в Git

Когато правя промени в даден файл в Git, как мога да направя само някои от промените?

Например, как мога да изпълня само 15 реда от 30 реда, които са били променени във файл?

2394
06 июля '09 в 5:25 2009-07-06 05:25 freddiefujiwara е настроен на 06 юли в 5:25 ч. 2009-07-06 05:25
@ 22 отговора

Можете да използвате git add --patch <filename> (или -p за кратко), а git ще започне разделяне на файла на това, което смята за разумно "chunks" (части от файла). Тогава той ще ви каже този въпрос:

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

Ето описание на всяка опция:

  • y подгответе това парче за следващия ангажимент
  • n не поставяйте това парче за следващия коммит
  • q изход; не поставяйте това парче или останалите парчета
  • a поставя тази част и всички следващи фрагменти във файла
  • d не поставяйте този блок или по-късен фрагмент от файла
  • g изберете парче, на което да отидете
  • / търсене на блок, който съответства на посочения регулярен израз
  • j оставете тази част нерешена, вижте следващото неразрешено парче
  • J остави тази част нерешена, виж следващото парче
  • k оставете това парче неразрешено, вижте неразкритото предишно парче
  • К остави тази част нерешена, виж предишното парче
  • Разделя текущото парче на по-малки фрагменти
  • 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 в 5:36 2009-07-06 05:36

Можете да използвате git add --interactive или git add -p <file> и след това git commit ( не git commit -a ); вижте интерактивния режим в страницата на git-add или просто следвайте инструкциите.

Съвременният Git също има git commit --interactivegit commit --patch , който е пряк път към параметъра за корекция в интерактивен ангажимент).

border=0

Ако предпочитате да правите това от GUI, можете да използвате git-gui . Можете просто да маркирате парчетата, които искате да включите в коммита. Аз лично го намирам за по-лесно, отколкото да използвам git add -i . Други GI 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 е достъпна на 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 февр. Отговорът е даден от Франсоа на 23 февруари. 2012-02-23 13:37 '12 в 1: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 

Отговорът на Whymarh е това, което обикновено правя, с изключение на факта, че понякога се случват много промени и мога да кажа, че мога да направя грешка, докато определям нещата, и искам някои държави да се оттеглят до втория пропуск. ,

19
07 июня '13 в 1:14 2013-06-07 01:14 отговорът е даден jdsumsion 07 '13 в 1:14 2013-06-07 01:14

Ако използвате emacs, проверете Magit , който осигурява git интерфейс за emacs. Той добре поддържа междинни фрагменти (части от файлове).

12
08 июля '09 в 10:00 2009-07-08 10:00 Отговор, даден от Марк ван Лент 08 юли 2009 в 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 

Използването на метода на скривалището ви дава възможност да тествате дали вашият код все още работи, преди да го изпълните.

8
07 авг. отговори даден derhoch 07 авг. 2013-08-07 16:25 '13 в 16:25 2013-08-07 16:25

Intellij IDEA (и аз вярвам, че всички останали продукти от серията) изградиха подкрепа за частични ангажименти, тъй като v2018.1

2019

28 марта '18 в 10:00 2018-03-28 10:00 Отговорът е даден от Holger Brandl на 28 март 18:00 в 10:00 часа 2018-03-28 10:00 часа

За тези, които използват Git разширения :

В прозореца "Копиране" изберете файла, който искате частично да се извърши, след това изберете текста, който искате да поправите в десния прозорец, след това щракнете с десния бутон върху селекцията и изберете "Генериране на избрани линии" в контекстното меню.

7
27 июля '15 в 12:52 2015-07-27 12:52 отговорът е даден srgstm 27 юли '15 в 12:52 2015-07-27 12:52

Приставката за vim-gitgutter може да създаде парчета, без да напуска редактора на vim, като използва

 :GitGutterStageHunk 

В допълнение, той предоставя и други интересни функции, като например колона с различен знак, както в някои съвременни IDE.

Ако само част от парчето трябва да се достави вим-беглец

 :Gdiff 

ви позволява да изберете обхвата на видимия диапазон, след това :'<,'>diffput или :'<,'>diffget за промяна / промяна на отделни линии.

6
09 янв. отговорът е даден c0ffeeartc 09 jan. 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 Aug. 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. В някои случаи обединяването е по-лесно / по-бързо от git add -p. Това е така, защото meld ви позволява, например:

  • вижте повече контекст
  • виж вътрешните различия
  • редактирайте го ръчно и вижте актуализациите „на живо“ (актуализирани след всяко натискане на клавиш)
  • отидете на промяната, без n за всяка промяна, която искате да пропуснете.

Използване на

В хранилището на git изпълнете:

 git meld-index 

Ще видите, че обединението (или конфигурираната git diffftool) се показва от

НАЛЯВО : временни файлове с директории, копирани от работното дърво

RIGHT : временна директория с индексно съдържание. Това включва и файлове, които все още не са в индекса, но се променят или не се проверяват в работното копие - в този случай ще видите съдържанието на файла от 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

Emacs също има гицум

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 авг. Отговорът е даден Бето Авегага 24 август. 2018-08-24 18:24 '18 в 18:24 ч. 2018-08-24 18:24

За потребителите на Atom , пакетът github включва интерактивна настройка на git gui стил. За етикети вижте документацията за опаковката.

Използването на Atom ви позволява да работите с тема с тъмен фон (по подразбиране git gui има бял фон).

1
10 апр. Отговор, даден от Йоанис Филипидис 10 април 2018-04-10 05:31 '18 в 17: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 отговорът е даден от Самюел Лампа на 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. Hank мъдър:

  • Изберете файл от секцията 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

Други въпроси относно тагове или Ask a Question