Я хочу повернути зміни, внесені певним комітетом, лише до заданого файлу.
Чи можу я використовувати для цього команду повернення git?
Будь-який інший простий спосіб це зробити?
Я хочу повернути зміни, внесені певним комітетом, лише до заданого файлу.
Чи можу я використовувати для цього команду повернення git?
Будь-який інший простий спосіб це зробити?
Відповіді:
Найчистіша , як я бачив , робити це описано тут
git show some_commit_sha1 -- some_file.c | git apply -R
Схожа на відповідь VonC, але за допомогою git show
та git apply
.
fatal: unrecognized input
-3
прапор до git, щоб застосувати для тристороннього злиття, коли патч виходить з ладу, оскільки я зазвичай виправляю зміни трохи за часом.
some_file.c
включає шлях до файлу, якщо він є, інакше ви мовчки нічого не будете латати :)
Якщо припустити, що змінити історію фіксації нормально, ось робочий процес для відновлення змін у одному файлі на попередньому фіксації:
Наприклад, ви хочете відновити зміни в 1 файлі ( badfile.txt
) у коміті aaa222
:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Повторіть базу на базовому комітеті, внесіть зміни в проблему і продовжуйте.
1) Запустіть інтерактивну базу даних:
git rebase -i aaa111
2) Позначте проблеми редагування для редагування в редакторі, змінивши pick
на e
(для редагування):
e aaa222
pick aaa333
3) Відновити зміни до поганого файлу:
git show -- badfile.txt | git apply -R
4) Додайте зміни та внесіть зміни:
git add badfile.txt
git commit --amend
5) Закінчіть ребауз:
git rebase --continue
edit
не відображаються як змінені. Але відповідь git show -- badfile.txt | git apply -R
дав мені потрібну <3
git revert
є для всього вмісту файлу в комітах.
Для одного файлу ви можете його скриптувати :
#!/bin/bash
function output_help {
echo "usage: git-revert-single-file <sha1> <file>"
}
sha1=$1
file=$2
if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi
(З утиліт git-shell- script -скриптів від smtlaissezfaire )
Примітка:
тут описаний інший спосіб, якщо ви ще не здійснили поточну модифікацію.
git checkout -- filename
git checkout
є деякі параметри для файлу, модифікуючи файл із HEAD, замінюючи зміни.
Dropped.on.Caprica в коментарях згадує :
Ви можете додати псевдонім до git, щоб ви могли це зробити
git revert-file <hash> <file-loc>
і повернути цей конкретний файл.
Дивіться цю суть .
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
git revert-file <hash> <file-loc>
та повернути цей конкретний файл. Я відмовився від цієї відповіді (хоча мені довелося внести пару правок, щоб правильно працювати). Ви можете знайти копію мого .gitconfig
та відредагованого сценарію тут: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
Я б просто скористався --no-commit
опцією, git-revert
а потім видалити файли, які ви не хочете повернути з індексу, перш ніж остаточно зробити його. Ось приклад, який показує, як легко відновити лише зміни до foo.c у другій останній комісії:
$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD
Перші git-reset
"нестабільні" всі файли, щоб потім ми могли додати назад лише той файл, який ми хочемо повернути. Остаточне git-reset --hard
позбавлення від ревертованих файлів, які залишилися, які ми не хочемо зберігати.
Набагато простіше:
git reset HEAD^ path/to/file/to/revert
тоді
git commit --amend
і потім
git push -f
файл відсутній і введіть хеш, повідомлення тощо - те саме.
git checkout -- path/to/file/to/revert
крок? Також не вірно, що і хеш згодом той самий, правда? Останнє речення може бути кращим як щось на кшталт: "Результат полягає в тому, що остання команда замінюється новою, яка відрізняється лише тим, що не містить змін у поверненому файлі."
git reset HEAD^ path/to/file/to/revert/in/commit
Вищевказана команда зніме файл з комісії, але відображатиметься в git status
.
git checkout path/to/file/to/revert/in/commit
Наведена вище команда відновить зміни (в результаті ви отримаєте файл такий же, як HEAD).
git commit
(Перейдіть --amend
для внесення змін до комісії.)
git push
З цим файл, який вже знаходиться у коміті, видаляється та повертається.
Вищезазначені кроки слід виконувати з гілки, де здійснюється комісія.
Ви можете дотримуватися цієї процедури:
git revert -n <*commit*>
( -n
відновіть усі зміни, але їх не буде здійснено)git add <*filename*>
(назва файлу / файлів, який ви хочете відновити та ввести)git commit -m 'reverted message'
(додайте повідомлення для повернення)