Просто комментарий:
git revert aCommit
делает Возвратить все совершить (как в «всех файлов частью фиксации»):
вычисляет обратный патч, применяет его на ГОЛОВЫ и совершить.
Так две проблемы здесь (первый один легко решается):
- он всегда совершает, так что вы можете добавить
-no-commit
вариант: «git revert --no-commit aCommit
»: это полезно при отмене более один эффект совершает ваш индекс в строке.
- он не применяется к определенному файлу (что, если вы a.py были частью коммита с 1000 другими изменениями, которые вы, возможно, не захотите возвращать)?
Для этого, если вы хотите, чтобы извлечь определенные файлы, как они были в другой коммит, вы должны увидеть git-checkout
, в частности синтаксис git checkout <commit> <filename>
(это не совсем то, что вам нужно в этом случае, хотя)
Easy Git (Elijah Newren) попытался принести больше «полного возврата» на Git Mailing list; но без особого успеха:
Люди иногда хотят «вернуть изменения».
Теперь, это может быть:
- изменения между 32 и 29 пересмотры назад,
- это может быть все изменения с момента последней фиксации,
- это может быть изменения, так как 3 совершает назад , или
- это может быть только одна конкретная фиксация.
- пользователь может захотеть подмножество таких реверсии, чтобы только конкретные файлы,
(eg revert
является documented here, но я не уверен, что она является частью текущего распределения, например, хотя)
, но все это сводится к «возвращению изменений» в конце.
eg revert --since HEAD~3 # Undo all changes since HEAD~3
eg revert --in HEAD~8 # much like git revert HEAD~8, but nocommit by default
eg revert --since HEAD foo.py # Undo changes to foo.py since last commit
eg revert foo.py # Same as above
eg revert --in trial~7 bar.c baz. # Undo changes made in trial~7 to bar.[ch]
Являются ли эти виды «возвращаясь данных» действительно настолько различны, что должны должны быть разные команды, или что некоторые из этих операций не должна поддерживаться простой командой REVERT?
Конечно, большинство пользователей большую часть времени, вероятно, будут использовать форму «» , но я не вижу вреда в поддержке дополнительных возможностей.
Также ... есть ли что-нибудь фундаментальное, что бы сохранить ядро git от принятия такого поведения?
Илия
Примечание: совершает по умолчанию не имеет смысла для обобщенной revert
команды, и «git revert REVISION
» ошибка будет с инструкциями (говорит пользователю добавить --in флаг).
Допустим, у вас есть, из 50 совершенных, 20 файлов вы понимаете, что старые совершить X внесены изменения, которые не должны происшедшие.
Небольшая сантехника в порядке.
Что вам нужно это способ перечислить все конкретные файлы, необходимые для вернуться
(как в «чтобы отменить изменения, сделанные в фиксации X, сохраняя при этом все последующие изменения»),
, а затем, для каждого из них:
git-merge-file -p a.py X X^
проблема здесь, чтобы восстановить утраченную функцию без облитерирующего всех последующих изменений a.py вы можете захотеть сохранить.
Этот метод когда-то называется «отрицательным слиянием».
С git merge-file <current-file> <base-file> <other-file>
means:
включает в себя все изменения, которые ведут от <base-file>
к <other-file>
в <current-file>
, вы можете восстановить удаленные функции, говоря, вы хотите, чтобы включить все изменения)
.
- из: X (где функция была удалена)
- в: X^(предыдущая фиксация Перед X, где функция была все еще там)
Примечание: в «-p
» аргумент, который позволяет просматривать первые изменения, ничего не делая на текущий файл. Когда вы уверены, удалите эту опцию.
Примечание: git merge-file
является not that simple: вы не можете ссылаться на предыдущие версии файла так же, как это.
(вы бы снова и снова фрустрирующего сообщение: error: Could not stat X
)
Вы должны:
git cat-file blob a.py > tmp/ori # current file before any modification
git cat-file blob HEAD~2:a.py > tmp/X # file with the function deleted
git cat-file blob HEAD~3:a.py > tmp/F # file with the function which was still there
git merge-file a.py tmp/X tmp/F # basically a RCS-style merge
# note the inversed commit order: X as based, then F
# that is why is is a "negative merge"
diff -u a.py tmp/ori # eyeball the merge result
git add a.py
git commit -m "function restored" # and any other changes made from X are preserved!
Если это будет сделано для большого количества файлов в предыдущей фиксации ... некоторые сценариев в порядке;)
Ой, это «осознано», а не «осознано»! (Я не американец ..) – dbr
Ваше правописание было исправлено людьми, которые используют ярды и ноги для измерения вещей ... ха-ха – FaddishWorm