Это действительно меняет файлы в вашем рабочем дереве, но не создает коммитов, поэтому, если вы действительно разберетесь, можете просто начать снова

у вернуть определенный коммит в git. К сожалению, наша организация все еще использует CVS в качестве стандарта, поэтому, когда я возвращаюсь к CVS, несколько git коммитов объединяются в один. В этом случае я хотел бы выделить оригинальный коммит git, но это невозможно.

Есть ли подход, похожий наgit add --patch что позволило бы мне выборочно редактировать различия, чтобы решить, какие части коммита вернуть?

 ntc227 авг. 2014 г., 01:02
Больше решенийВот, но сосредоточив внимание на ограничении частичного возврата к конкретным файлам.

Ответы на вопрос(6)

которая использует автоматически сгенерированное сообщение о коммите и дает пользователю возможность отредактировать и вставить слово «Частично» перед окончательной фиксацией.

# generate a revert commit
# note the hash printed to console on success
git revert --no-edit <hash to revert>

# undo that commit, but not its changes to the working tree
# (reset index to commit-before-last; that is, one graph entry up from HEAD)
git reset HEAD~1

# interactively add reversions
git add -p

# commit with pre-filled message
git commit -c <hash from revert commit, printed to console after first command>

# reset the rest of the current directory's working tree to match git
# this will reapply the excluded parts of the reversion to the working tree
# you may need to change the paths to be checked out
# be careful not to accidentally overwrite unsaved work
git checkout -- .

рсии, которую вы пытаетесь вернуть) - это получить хэшсовершать непосредственно перед тот, который вы хотите частично вернуть (изgit log). Тогда ваша команда становится:

$ git checkout -p <hash_preceding_commit_to_revert> -- file/you/want/to/fix.ext

Это действительно меняет файлы в вашем рабочем дереве, но не создает коммитов, поэтому, если вы действительно разберетесь, можете просто начать сноваgit reset --hard -- file/you/want/to/fix.ext.

Решение:

git revert --no-commit <commit hash>
git reset -p        # every time choose 'y' if you want keep the change, otherwise choose 'n'
git commit -m "Revert ..."
git checkout -- .   # Don't forget to use it.
 martin11 авг. 2014 г., 15:08
@Krzysztof Почему проверка в конце важна и почему это решение отличается от user1338062?
 CharlesB11 авг. 2014 г., 15:01
Это помогло бы людям, если бы вы сказали, чем оно отличается от принятого решения.
Решение Вопроса

Использовать--no-commit (-n) вариантgit revertзатем отмените изменения, затем используйтеgit add --patch:

$ git revert -n $bad_commit    # Revert the commit, but don't commit the changes
$ git reset HEAD .             # Unstage the changes
$ git add --patch .            # Add whatever changes you want
$ git commit                   # Commit those changes

Примечание. Файлы, которые вы добавляете с помощью git add --patch, - это файлы, которые вы хотите вернуть, а не файлы, которые вы хотите сохранить.

 Felipe Alvarez09 авг. 2017 г., 04:44
Я также хотел бы добавить (возможно) очевидное, чтосначала сохраните свою работу, Илиcommit во-первых, илиstashтогда попробуйrevert.
 tremby26 сент. 2012 г., 23:03
Может быть стоит добавить последнюю требуемую команду для тех, кто не очень знаком с git: после коммитаgit reset --hard отменить другие изменения, которые вы не хотели отменять.
 Kaz31 мар. 2017 г., 16:33
Что за зияющее упущение вgit; git revert следует просто взять--patch аргумент.
 mipadi31 мар. 2017 г., 20:52
@Kaz:git revert используется для возврата целых коммитов. Вы можете использоватьgit checkout -p интерактивно выбирать биты для возврата.
 Tino16 июл. 2013 г., 12:30
git reset --hard опасно для новичков, так как может потерять нужные изменения. Вместо этого привыкнутьgit statusэто намекает наgit checkout -- FILE.. чтобы вернуть вещи более безопасно.

а затем использовать add --patch для выбора блоков.

Сначала верните полный коммит (поместите его в индекс), но не коммитите.

git revert -n <sha1>  # -n is short for --no-commit

Затем в интерактивном режиме удалите отмененные ХОРОШИЕ изменения из индекса

git reset -p          # -p is short for --patch  

Затем совершите обратный дифференциал плохих изменений

git commit -m "Partially revert <sha1>..."

Наконец, отозванные ХОРОШИЕ изменения (которые были отменены с помощью команды сброса) все еще находятся в рабочем дереве. Они должны быть очищены. Если в рабочем дереве не осталось других незафиксированных изменений, это можно сделать с помощью

git reset --hard
 Steven Lu21 мая 2015 г., 17:04
Разве это не лучшая альтернатива принятому ответу (который используетreset HEAD .), потому что не требует окончательной очистки рабочего каталога?
 Chiel ten Brinke09 мар. 2016 г., 15:24
Этот ответ выше, потому чтоreset -p короче чемreset HEAD с последующимadd -p, Но это все еще требует очистки, так как «хорошие» блоки, которые были сброшены, все еще находятся в рабочем каталоге после фиксации.
 Kaz31 мар. 2017 г., 16:32
Этот ответ не лучше, потому что в интерактивном режиме удаляет изменения, которые выхотеть часто сбивает с толку и подвержен ошибкам, особенно если любой из них требует редактирования.

Ваш ответ на вопрос