Фиксирайте само част от файла в Git
Когато правя промени в даден файл в Git, как мога да направя само някои от промените?
Например, как мога да изпълня само 15 реда от 30 реда, които са били променени във файл?
Можете да използвате 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 - Интерактивно производство
Можете да използвате git add --interactive
или git add -p <file>
и след това git commit
( не git commit -a
); вижте интерактивния режим в страницата на git-add или просто следвайте инструкциите.
Съвременният Git също има git commit --interactive
(и git commit --patch
, който е пряк път към параметъра за корекция в интерактивен ангажимент).

Ако предпочитате да правите това от GUI, можете да използвате git-gui . Можете просто да маркирате парчетата, които искате да включите в коммита. Аз лично го намирам за по-лесно, отколкото да използвам git add -i
. Други GI GUI, като QGit или GitX, също могат да имат тази функционалност.
git gui осигурява тази функционалност като diff. Просто кликнете с десния бутон на мишката върху интересуващата ви линия и ще видите елемента от менюто „Тази линия за поправка“.
Считам, че git add -e myfile
е най-лесният начин (поне моите предпочитания), защото той просто отваря текстовия редактор и ви позволява да изберете кой ред искате да изпълните и кой ред не сте. Относно командите за редактиране:
Добавено съдържание:
Добавеното съдържание се представя с линии, започващи с "+". Можете да предотвратите създаването на редове от добавяне, като ги изтриете.
отдалечено съдържание:
Изтритото съдържание се представя с низове, започващи с „-“. Можете да предотвратите изтриването им, като конвертирате "-" в "" (интервал).
модифицирано съдържание:
Модифицираното съдържание е представено от редовете "-" (изтриване на старо съдържание), последвано от редове "+" (добавяне на заместващо съдържание). Можете да предотвратите инсталирането на модификация, като конвертирате низовете "-" в "" и премахнете линиите "+". Не забравяйте, че промяната само на половината от чифт вероятно ще доведе до объркващи промени в индекса.
Всяка git add
на git --help add
е достъпна на git --help add
Ако използвате vim, можете да опитате голям плъгин, наречен fugitive .
Можете да видите файл diff между работно копие и индекс с :Gdiff
и след това да добавите редове или колони към индекса, като използвате класически vim diff команди, като dp
. Запазете промените в индекса и го копирайте с :Gcommit
и сте готови.
Силно препоръчвам да използвате SourceTree на Atlassian. (Това е безплатно.) Това го прави тривиално. Можете бързо и лесно да създавате отделни парчета код или отделни редове от код.
2019
Струва си да се отбележи, че за да използвате git add --patch
за нов файл, първо трябва да добавите файла към индекса, използвайки git add --intent-to-add
:
git add -N file git add -p file
Когато имам много промени и в крайна сметка създам няколко ангажименти от промените, искам временно да запазя началната си точка, преди да създам неща.
Ето го:
$ 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 е това, което обикновено правя, с изключение на факта, че понякога се случват много промени и мога да кажа, че мога да направя грешка, докато определям нещата, и искам някои държави да се оттеглят до втория пропуск. ,
Ако използвате emacs, проверете Magit , който осигурява git интерфейс за emacs. Той добре поддържа междинни фрагменти (части от файлове).
Както и при jdsumsion, можете също така да скриете текущата си работа, но след това използвайте difffool, като meld, за да изтеглите избраните промени от кеша. Така че дори можете ръчно да редактирате парчетата, което е малко болезнено, когато в git add -p
:
$ git stash -u $ git difftool -d -t meld stash $ git commit -a -m "some message" $ git stash pop
Използването на метода на скривалището ви дава възможност да тествате дали вашият код все още работи, преди да го изпълните.
Intellij IDEA (и аз вярвам, че всички останали продукти от серията) изградиха подкрепа за частични ангажименти, тъй като v2018.1
За тези, които използват Git разширения :
В прозореца "Копиране" изберете файла, който искате частично да се извърши, след това изберете текста, който искате да поправите в десния прозорец, след това щракнете с десния бутон върху селекцията и изберете "Генериране на избрани линии" в контекстното меню.
Приставката за vim-gitgutter може да създаде парчета, без да напуска редактора на vim, като използва
:GitGutterStageHunk
В допълнение, той предоставя и други интересни функции, като например колона с различен знак, както в някои съвременни IDE.
Ако само част от парчето трябва да се достави вим-беглец
:Gdiff
ви позволява да изберете обхвата на видимия диапазон, след това :'<,'>diffput
или :'<,'>diffget
за промяна / промяна на отделни линии.
Опитах git add -p filename.x
, но на Mac открих, че gitx ( http://gitx.frim.nl/ или https://github.com/pieter/gitx ) е много по-лесно да направя точно тези линии, които исках ,
С TortoiseGit:
Щракнете с десния бутон върху файла и използвайте
Context Menu → Restore after commit
. Това ще създаде копие на файла, какъвто е. След това можете да редактирате файла, например. TortoiseGitMerge и отхвърлете всички промени, които не искате да направите. След като запазите тези промени, можете да фиксирате файла.
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, която току-що редактирахте.
Ако добавите предишния отговор, ако предпочитате да използвате командния ред, въведете git add -e myfile
ви дава възможност да изберете ред по ред, който искате да фиксирате, защото тази команда ще отвори редактор с разлики, например:
За потребителите на Atom , пакетът github включва интерактивна настройка на git gui
стил. За етикети вижте документацията за опаковката.
Използването на Atom ви позволява да работите с тема с тъмен фон (по подразбиране git gui
има бял фон).
Както показва един от горните отговори , можете да използвате 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 и т.н.), за да изберете линиите, които ще бъдат включени в коммита.
Ако на платформата на 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
Други въпроси относно git- git-commit тагове или Ask a Question