Скажіть, я змінив зміни у своєму робочому каталозі. Як я можу зробити виправлення з тих, не створюючи комітку?
Скажіть, я змінив зміни у своєму робочому каталозі. Як я можу зробити виправлення з тих, не створюючи комітку?
Відповіді:
git diff
для нестандартних змін. git diff --cached
для поетапних змін.
git format-patch
також включає в себе двійкові відмінності та деякі метаінфо. Насправді це було б найкращим варіантом для створення виправлення, але afaik це працює лише для перевірених у джерелах / змінах, правда?
git diff --relative
Якщо ви ще не внесли зміни, то:
git diff > mypatch.patch
Але іноді трапляється, що частина того, що ви робите, - це нові файли, які не відслідковуються і не будуть у вашому git diff
виході. Отже, один із способів зробити виправлення - це встановити все для нової фіксації ( git add
кожного файлу чи просто git add .
), але не виконувати комісію, а потім:
git diff --cached > mypatch.patch
Додайте опцію "двійкові", якщо ви хочете додати біткові файли до патчу (наприклад, mp3-файли):
git diff --cached --binary > mypatch.patch
Пізніше ви можете застосувати виправлення:
git apply mypatch.patch
Примітка. Ви також можете використовувати --staged
як синонім --cached
.
git diff --no-color
. Інакше це виглядає як проблема кодування.
git diff
і git apply
буде працювати для текстових файлів, але не працюватиме для двійкових файлів.
Ви можете легко створити повний бінарний патч, але вам доведеться створити тимчасову комісію. Після того як ви зробили тимчасові зобов'язання, ви можете створити виправлення за допомогою:
git format-patch <options...>
Після того як ви зробили патч, запустіть цю команду:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Це відкине ваші тимчасові зобов'язання. Остаточний результат залишає вашу робочу копію (навмисно) забрудненою тими самими змінами, що ви були спочатку.
На стороні, що приймає, ви можете використовувати той самий трюк, щоб застосувати зміни до робочої копії, не маючи історії комісій. Просто застосуйте патчі (и) та git reset --mixed <SHA of commit *before* the patches>
.
Зауважте, що, можливо, вам доведеться добре синхронізувати цю функцію. Я бачив деякі помилки при застосуванні патчів, коли людина, яка їх робила, не знищила стільки змін, скільки я. Напевно, є способи змусити його працювати, але я не заглядав далеко в це.
Ось як створити ті самі патчі в Tortoise Git (не те, що я рекомендую використовувати цей інструмент):
Tortoise Git
->Create Patch Serial
Since
: FETCH_HEAD
спрацює, якщо ви добре синхронізовані)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
варіантІ як їх застосувати:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
варіантЩоб створити виправлення з модифікованими та новими файлами (поетапно), можна запустити:
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
не працює.
file_name.patch
бути використана patch
команда? Чи сумісні вони між собою?
Мені подобається:
git format-patch HEAD~<N>
де <N>
кількість останніх зобов’язань зберегти як патчі.
Деталі використання команди знаходяться у DOC
UPD
Тут ви можете дізнатися, як потім їх застосувати.
UPD Для тих, хто не здогадувався format-patch
додати псевдонім:
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
Потім у будь-якому каталозі вашого сховища проекту запустіть:
git make-patch
Ця команда буде створена 0001-uncommited.patch
у вашому поточному каталозі. Патч буде містити всі зміни та непотрібні файли, які видно наступній команді:
git status .
Ми також можемо вказати файли, включаючи лише файли з відносними змінами, особливо коли вони охоплюють декілька каталогів, наприклад
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
Я виявив, що це не вказано у відповідях чи коментарях, які є всіма актуальними та правильними, тому вирішив додати. Явне краще, ніж неявне!