Питання Припустити лише частину файлу в Git


Коли я вношу зміни до файлу в Git, як я можу здійснити лише деякі зміни?

Наприклад, як я можу зробити лише 15 рядків з 30 рядків, які були змінені у файлі?


2242
2017-07-06 02:25


походження




Відповіді:


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

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

Ось опис кожного з варіантів:

  • у Ступінь цей кут для наступної фіксації
  • н не сформулюйте цей пристрій для наступної фіксації
  • q кинути; не виставляйте цей гурток або жодного з решти погонів
  • a Ступінь цей гуркот, і все пізніше потягує в файл
  • д не виставляйте цю групу або жодні з пізніших підказок у файлі
  • г виберіть пункт, щоб перейти до
  • / шукати підказку, що відповідає заданому регулярному виразу
  • j залиште це незрозуміле рішення, дивіться наступний невизначену позицію
  • J залиште цей кусок невирішеною, дивіться наступний рекорд
  • к залиште це незрозуміле рішення, подивіться на попередній невизначений випадок
  • К. залиште це незрозуміле рішення, подивіться на попередній рекорд
  • с розбити поточний хук на менші гудки
  • е вручну змінити поточний запис
  • ? роздрукувати довідку допомогти

Якщо файл ще немає в сховищі, спочатку ви можете зробити це git add -N <filename>. Пізніше ти можеш продовжувати git add -p <filename>.

Після цього ви можете використовувати:
git diff --staged щоб перевірити, чи правильно ви внесли зміни
git reset -p щоб не завантажити помилково додані гудки
git commit -v щоб переглянути вашу помилку під час редагування повідомлення про порушення.

Зауважте, що це набагато відрізняється від git format-patch команда, яка призначена для аналізу даних в a .patch файли

Посилання на майбутнє: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging


2939
2017-07-06 11:49



Це може бути корисно відзначити це -p/--patch це ярлик для дії патча всередині -i/--interactive команда, яка ініціює корисне Інтерактивний режим. - tutuDajuju
> Що станеться, якщо цей файл уже встановлений? Вона покаже лише невстановлені зміни. Такий же, як git diff робить - Eugen Konkov
Як я можу редагувати поточний пристрій вручну? Я не знаю, що робити після того, як я введу e. - Hunsu
Після натискання eВи можете відредагувати пристрій вручну, замінивши його + або - по # - veksen
робить s не існує більше? - tam5


Ви можете використовувати git add --interactive або git add -p <файл>, і потім git commit (ні  git commit -a); побачити Інтерактивний режим в git-add сторінку, або просто дотримуйтесь інструкцій.

Також є сучасний гіт git commit --interactive (і git commit --patch, що є ярликом для опції патча в інтерактивній фіксації).

Якщо ви віддаєте перевагу робити це за допомогою графічного інтерфейсу, ви можете використовувати гіт-гуй. Ви можете просто відзначити фрагменти, які ви хочете включити в commit. Особисто я знаю, що це простіше, ніж використовувати git add -i. Інші графічні інтерфейси git, такі як QGit або GitX, також можуть мати цю функціональність.


216
2017-07-06 02:41



Цікаво, що windows.github.com підтримує часткову передачу файлів, але, здається, недавно знизив його .. - Juri
@ Juri Я думаю, що підтримка часткових файлів виконує знову. - Ela782
@ Ela782 ой..веже, ти маєш рацію. Thx для того, щоб вказувати на це. - Juri
@ Юрі, ласкаво просимо. Я насправді ніколи не помічав, що це було там раніше - я бачив це минулого тижня і подумав "о, яка чудова новинка"! :-) - Ela782
В даний час windows.github.com переспрямовує на ребрендинг GitHub Desktop, який краще, ніж Git GUI, і підтримує часткові дії ... але не підтримує підписування. Зітхає - hacksalot


Гіт Гуі надає цю функцію під переглядом diff. Просто клацніть правою кнопкою миші на потрібних вам лініях, і вам слід побачити пункт меню "етап цієї лінії для здійснення".


115
2017-09-25 20:45



для складних патчів це, як правило, найшвидший підхід для мене. - hochl
Це дуже ефективний та інтуїтивно зрозумілий спосіб додавати зміни до області обробки в дрібнозернистому режимі. Також можна вибрати декілька рядків і всі зміни в межах цього вибору будуть додані. - jox


Я вірю, що git add -e myfile це найпростіший спосіб (як мінімум, мої уподобання), оскільки він просто відкриває текстовий редактор і дозволяє вам вибирати, яку лінію ви хочете створити, і яку рядок у вас немає. Що стосується команд редагування:

доданий вміст:

Доданий вміст представлений рядками, що починаються з "+". Ви можете запобігти встановленню будь-яких ліній додавання, видаляючи їх.

видалений вміст:

Видалений вміст представлений рядками, що починаються з "-". Ви можете запобігти встановленню їх видалення, перетворивши "-" на "" (пробіл).

змінений зміст:

Змінений вміст представлений лініями "-" (видалення старого вмісту), а потім рядків "+" (додавання вмісту заміни). Ви можете запобігти стадії модифікації шляхом перетворення ліній "-" до "" та видалення "+"              лінії Бережіться, що модифікація лише половини пари, ймовірно, введе заплутані зміни в індекс.

Кожна деталь про git add доступні на git --help add 


55
2018-02-23 10:37



Це було б більш корисним, якщо б десь чітке пояснення того, як фактично вибирати ті рядки (тобто фактичні команди для входу). Я не міг знайти його в документації. Не могли б ви додати посилання? - Alex
Для тих, хто не любить скорочення варіантів, -e є --edit. - Kolyunya
@Alex Оригінальні котировки, додані theFreedomBanana, знаходяться в розділі РЕДАГУВАННЯ PATCHES в git --help add - Randall
Це єдиний відповідь (що вимагає тільки git), який вирішує проблему додавання / видалення ліній мудрим, коли ви не можете зробити менші гудки s в інтерактивному патч-режимі. - cdosborn
Вибачте, я не хочу створювати нове запитання, але як використовувати підстановки під час виконання цієї команди? Я спробував це з git add -e - ** / * Activity.java але це не спрацювало. Проте git diff - ** / * Activity.java працює. Схоже, що у цьому варіанті потрібен спеціальний режим обробки. - ka3ak


Якщо ви використовуєте vim, ви можете спробувати відмінний плагін, який викликається втечу.

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

Дуже хороший вступний екран тут (див. сп. частина 2)


41
2017-08-12 13:32



Дякую вам за ці посилання. Точно те ж саме, що мені потрібно. Особливо :diffget/:diffput у візуальному режимі, де я можу вибирати певні рядки, які я хочу скинути / здійснити. Отже, переконайтеся ще раз: вім дуже приємний. - goodniceweb


Я настійно рекомендую використовувати SourceTree від Атлазіана. (Це безкоштовно.) Це робить це тривіальним. Ви можете швидко і легко створювати окремі рукописи коду або окремі рядки коду.

enter image description here


26
2017-12-05 17:29



Я згоден з тим, що SourceTree це хороший інструмент для цієї мети, тому що він дає вам більш точний контроль, ніж це можливо через командний рядок.
@cupcake Я б стверджував навпаки, бачачи, що SourceTree, ймовірно, використовує ці виконувані файли git командного рядка, по суті, завжди можна буде робити ті самі (або більше) дрібнозерні дії через "командний рядок". - tutuDajuju
Незалежно від того дрібнозернистий аргумент, який я дуже рекомендую SourceTree як постановка оркестрів та окремих ліній надзвичайно просто: i.imgur.com/85bNu4C.png - Michael Freeman
@tutuDajuju У цьому випадку я не впевнений, що це правда. SourceTree має можливість вибирати, які частини потрібно виставити лінія за чергою. Вам не доводиться робити повний постріл; ви можете виставити 2 рядки в середині губка. Я не маю ідеї як це досягає це, але. (На даний момент я намагаюсь усунути нездатність SourceTree виділити окремі лінії для невідслідуваного файлу.Я приїхав сюди, шукаючи шлях до вирішення проблеми, лише щоб виявити, що GIT, здається, не пропонує лінійних можливостей взагалі, принаймні, не просто.) - jpmc26
Ви могли б використовувати --patch (як показують інші відповіді), і розколювати кульки, поки ви не зможете створити потрібні вам лінії. Існує також багато інших обгортків та розширень, які забезпечують інтерфейс користувача (як правило, у вигляді різниці), що дозволяє apply патч із вибраних ліній; наприклад вбудований git gui і git-meld-index. Просто кажучи, джерельне дерево не так чудово (колишній користувач) - tutuDajuju


Варто відзначити, що використовувати git add --patch для новий файл вам спочатку потрібно додати файл для індексування git add --intent-to-add:

git add -N file
git add -p file

20
2018-06-06 22:14





Коли я змінюю багато змін, і в результаті створить кілька змін, я хочу тимчасово зберегти початкову точку до постановки речей.

Подобається це:

$ 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

Відповідь Whymarrh - це те, що я зазвичай роблю, за винятком, що іноді існує безліч змін, і я можу сказати, що помиляюсь під час постановки речей, і хочу, щоб я здійснив державу, я зможу повернутися на другий прохід.


17
2017-07-08 07:00