Питання Залишити лише один файл із декількох файлів, які змінилися з Git?


Як я можу приховати лише один з декількох змінених файлів у моєму відділенні?


2446
2018-06-14 20:52


походження


Я не думаю, що прийнята відповідь буксора є правильною відповіддю на запитання. git stash --keep-index не тримає індекс, але це стискає все - як в індексі, так і поза ним. - Raman
@Antonio Мені здається, що ваша щедрість насправді повинно бути окремим питанням, оскільки оригінальне запитання не має нічого спільного з TortoiseGit. - JesusFreke
@JesusFreke Так, враховуючи результат, я міг би заощаджувати 50 респ :) Це просто, що це питання ви отримуєте переадресацію, якщо ви намагаєтеся шукати "частковий витік черепахи". Tortoisegit, здається, не є популярною темою тут stackoverflow.com/questions/tagged/tortoisegit - Antonio
>>>>>>>>> git diff -- *filename* > ~/patch потім git checkout -- *filename* і пізніше ви можете знову застосувати патч git apply ~/patch - neaumusic
Більшість існуючих відповідей нижче застаріли. Оскільки Git 2.13 (Q2 2017) підтримується git stash push [--] [<pathspec>...]. - Ohad Schneider


Відповіді:


УВАГА

Як зазначалося в коментарях, це ставить все у прилавки, як поетапні, так і нестабілізовані. Індекс -keep-index просто залишає індекс тільки після того, як завершується замовлення. Це може призвести до злиття конфліктів, коли ви пізніше поп-стиш.


Це призведе до усунення всього, що ви раніше не додавали. Просто git add що ви хочете зберегти, а потім запустіть його.

git stash --keep-index

Наприклад, якщо ви хочете розділити стару фіксацію на більш ніж одну набір змін, ви можете скористатися цією процедурою:

  1. git rebase -i <last good commit>
  2. Позначте деякі зміни як edit.
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. Виправте ситуацію в міру необхідності. Не забувай git add будь-які зміни
  7. git commit
  8. git stash pop
  9. Повторіть, від # 5, коли це необхідно.
  10. git rebase --continue

1218
2017-11-30 21:28



Я вважаю цей підхід набагато простішим: stackoverflow.com/a/5506483/457268 - k0pernikus
Я не впевнений, чому це виправдано. Кожна людина повинна мати інше сподівання, ніж я. Оригінальний пост запитує "як я можу приховати лише частину нез'ясованих змін?" Коли я використовую git stash save -k, так індекс (зелений в git stat) зберігається, але цілийнабір змін (як зелений, так і червоний) переходить у прилавки. Це порушує запит ОП, "призупинити лише деякі зміни". Я хочу приховати лише частину червоного кольору (для майбутнього використання). - Pistos
Якщо ви більше зацікавлені в відповіді на питання, поставлене @ Pistos (як і я), то подивіться тут: stackoverflow.com/questions/5506339/... - Raman
@Раман: чудово! git stash -p саме те, що я шукав. Цікаво, чи був цей перемикач недавно доданий? - Pistos
УВАГА: git stash --keep-index зламаний. Якщо ви внесете більше змін, спробуйте git stash pop пізніше ви потрапляєте в конфлікти злиття, тому що утримувач включає змінені файли, які ви зберігали, а не тільки ті, які ви не зберігали. Наприклад: я змінюю файли A і B, потім натисніть B, тому що я хочу протестувати зміни в A; Я знаходжу проблему з A, яку я потім виправляю; Я здійснюю A; Тепер я не можу розбити, тому що стара версія А знаходиться у прилавку без вагомих причин, що призводить до конфлікту злиття. На практиці A та B можуть бути багато файлів, можливо, навіть бінарні зображення або щось, тому я в основному повинен відмовитися від Б. - rjmunro


Ви також можете використовувати git stash save -p "my commit message". Таким чином, ви можете вибрати, які гудки слід додати до стискання, також можуть бути вибрані цілі файли.

Вам буде запропоновано кілька дій для кожної гри:

   y - stash this hunk
   n - do not stash this hunk
   q - quit; do not stash this hunk or any of the remaining ones
   a - stash this hunk and all later hunks in the file
   d - do not stash this hunk or any of the later hunks in the file
   g - select a hunk to go to
   / - search for a hunk matching the given regex
   j - leave this hunk undecided, see next undecided hunk
   J - leave this hunk undecided, see next hunk
   k - leave this hunk undecided, see previous undecided hunk
   K - leave this hunk undecided, see previous hunk
   s - split the current hunk into smaller hunks
   e - manually edit the current hunk
   ? - print help

2619
2017-07-31 11:59



Це має бути на вершині, оскільки він безпосередньо відповідає на питання за допомогою найпростішого підходу. Я б хотів, щоб я побачив параметри "a" / "d" (і повністю прочитав цю відповідь перед тим, як намагатись), так як у мене було цілий файл, який потрібно додати до stash, а інший файл повністю виключити. Тим не менш, він працював добре для мене; У мене не було занадто багато погонів. (Можливо, це не було запропоновано ніким у 2010 році, коли було опубліковано оригінальне питання, оскільки в цей час ця функція не була в наявності?) - Liam
Це не так. Це було запозичено у дарків, приблизно через 7 років після цього. - nomen
Я TortoiseGit наркоман. Однак TortoiseGit не підтримує stash -p. Я нагороджу цю відповідь, оскільки вона залишається найбільш інтерактивною / зручною для користувачів. - Antonio
ви можете додати: git stash save -p my stash message; оскільки порядок аргументації не дуже інтуїтивно зрозумілий ... - Chris Maes
Між цим і git log -p, Я думаю, що -p прапор має означати "зробити цікаву річ, яку я хочу, але не вмію висловлювати". - Kyle Strand


Оскільки git принципово стосується управління всім сховищем зміст і індекс (а не один або кілька файлів) git stash не дивно, що з усіма робочими каталогами.

Насправді, оскільки Git 2.13 (Q2 2017), ви можете приховати окремі файли, з:

git stash push [--] [<pathspec>...]

Побачити "Збереження змін у конкретних файлах" для більш.


Оригінальна відповідь (нижче, червень 2010 р.) Полягала в тому, щоб вручну вибрати те, що ви хочете приховати.

Кейсбаш коментарі:

Це ( stash --patch оригінальне рішення), але я часто змінював багато файлів, тому використання патча дратує

Бушкорс відповісти (оновлено, листопад 2011 р.) пропонує більш практичне рішення, засноване на
git add + git stash --keep-index.
Подивіться і підведіть свою відповідь, яка повинна бути офіційною (замість моєї).

Про цей варіант Чхх вказує на альтернативний робочий процес у коментарях:

ти повинен "git reset --soft"після такого приятеля, щоб отримати чітке озвучення:
  Для того, щоб перейти до початкового стану, - це чітка смуга прокручування та лише деякі вибрані нестандартні модифікації, можна було б м'яко скинути індекс, щоб отримати (без вчинення нічого подібного до вас - буцзор).


(Оригінальна відповідь червня 2010 р .: ручне приховування)

Все-таки git stash save --patch міг би дозволити вам досягти часткового стискання ви після:

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

Однак це дозволить зберегти повний індекс (який може бути не те, що вам потрібно, оскільки може містити інші вже індексовані файли), а також частковий worktree (який може виглядати як той, який ви хочете прибрати).

git stash --patch --no-keep-index

може бути краще підходить.


Якщо --patchне працює, ручний процес може:

Для одного або декількох файлів проміжне рішення буде:

  • скопіюйте їх за межами Git repo
    (Фактично, Елоткрам пропонує а цікава альтернатива)
  • git stash
  • скопіюйте їх назад
  • git stash # на цей раз залишаються лише ті файли, які ви бажаєте
  • git stash pop stash@{1} # повторно застосувати всі модифікації ваших файлів
  • git checkout -- afile # скиньте файл до вмісту HEAD перед будь-якими локальними змінами

Після закінчення цього досить складного процесу, у вас буде лише один або кілька файлів.


238
2018-06-14 21:23



Це добре, але часто я змінював багато файлів, тому використання патча дратує - Casebash
@ VonC: Це хороший стиль мати одну відповідь на відповідь. Крім того, копіювання інших відповідей на ваші власні є поганими манерами. - bukzor
@bukzor: Мені шкода, якщо моя відредагована відповідь виглядатиме неправильною. Моїм єдиним наміром було дати вашу відповідь більше видимості. Я знову відредагував мій пост, щоб зробити це намір більш чітким. - VonC
@Кал: правда stackoverflow.com/a/13941132/6309 пропонує a git reset (змішаний) - VonC
git is fundamentally about managing a all repository content and index and not one or several files - це реалізація, що заважає вирішенню проблеми; це пояснення, але не виправдання. Будь-яка система керування вихідним кодом IS про "керування декількома файлами". Просто подивіться, які коментарі отримують найбільше. - Victor Sergienko


Коли git stash -p (або git add -p з stash --keep-index) було б надто громіздким, мені стало легше користуватися diff, checkout і apply:

Щоб "приховати" тільки певний файл / dir:

git diff path/to/dir > stashed.diff
git checkout path/to/dir

Потім потім

git apply stashed.diff

76
2018-02-12 13:44



Цікава альтернатива git add -p Я згадав у моїй власній відповіді вище. +1 - VonC
Зауважте, що якщо у вас є двійкові файли (наприклад, PNG), вони не будуть виводитися до файлу diff. Отже, це не 100% рішення. - void.pointer
@RobertDailey: Це цікава точка для мене, як git diff > file.diff і git apply це мої звичайні інструменти часткового притирання. Мені, можливо, доведеться розглянути перехід на git stash -pдля більших наборів змін. - thekingoftruth
@ thekingoftruth Ось псевдонім, який я використовую для створення патч-файлів, і це робить підтримка binaries: patch = log --pretty=email --patch-with-stat --reverse --full-index --binary. Зауважте, однак, для цього потрібні ваші зміни для патча. - void.pointer
Це не працювало чисто для мене, якщо файл для приглушення було чимось на кшталт ../../foo/bar.txt. Патч генерує ОК, але мені потрібно перейти до кореневого каталогу, щоб отримати патч для застосування. Отже, якщо у вас виникли проблеми з цим - просто переконайтеся, що ви робите це з кореневого каталогу репозиторію. - Michael Anderson


Скажімо, у вас є 3 файли

a.rb
b.rb
c.rb

і ви хочете залишити лише b.rb і c.rb, але не a.rb

ви можете зробити щось подібне

# commit the files temporarily you don't want to stash
git add a.rb
git commit -m "temp" 

# then stash the other files
git stash save "stash message"

# then undo the previous temp commit
git reset --soft HEAD^
git reset

І ти закінчиш! HTH


43
2017-10-31 07:10





Використовуйте git stash push, подобається це:

git stash push [--] [<pathspec>...]

Наприклад:

git stash push -- my/file.sh

Це доступно з Git 2.13, випущеного навесні 2017 року.


34
2017-08-15 13:10



Але я згадую git stash push вже в моя відповідь вище в минулому березні, 5 місяців тому. І я детально описав нову команду Git 2.13 тут: stackoverflow.com/a/42963606/6309. - VonC
Я щасливий, що Гіт просувається так швидко, довгий час це було неможливо, а потім випущено 2,13, і раптом існує просте рішення! - sandstrom


Інший спосіб це зробити:

# Save everything
git stash 

# Re-apply everything, but keep the stash
git stash apply

git checkout <"files you don't want in your stash">

# Save only the things you wanted saved
git stash

# Re-apply the original state and drop it from your stash
git stash apply stash@{1}
git stash drop stash@{1}

git checkout <"files you put in your stash">

Я придумав це після того, як я (ще раз) приїхав на цю сторінку і не сподобався першим двом відповідям (перша відповідь просто не відповідає на запитання, і мені зовсім не подобалося працювати з -p інтерактивний режим)

Ідея така сама, як і те, що @VonC запропонував використовувати файли за межами сховища, ви зберігаєте ті зміни, які хочете десь, вилучіть ті зміни, які ви не хочете, і повторно застосуйте ті зміни, які ви перемістили. Однак, я використовував стиль git як "десь" (і, як наслідок, в кінці є ще один крок: видалити каньйони, які ви вкладете у прилавки, тому що ви також видалили їх).


25
2018-02-05 10:16



Я більше віддаю перевагу цьому підходу. Він забезпечує легкий робочий процес у tortoisegit, використовуючи лише команди для стиснення та повернення команд. - Mark Ch
Посилаючись на відповіді на ЗП, використовуючи позиції, не рекомендується. Позиції змінюються, коли змінюються рейтинги. - Bryan Ash
@BryanAsh Ну, це не так, як це важливо тут. Я даю анекдот, а не дійсно посилаючись на інші відповіді. Повідомлення полягає в тому, що мені не подобаються відповіді, які сподобалося спільноті, а не те, що ці відповіді насправді містять. Крім того, розрив у 900 голосів між другою та третьою відповідями робить це навряд чи змінитися в найближчому майбутньому, і якщо він повинен колись мінятися, я завжди можу редагувати його, щоб сказати "вершина відповіді на той час". Дійсно, я не бачу, як це є якісь проблеми в цій ситуації. - Jasper