Как я могу откатить 1 изменение файла в моем предыдущем коммите - PullRequest
7 голосов
/ 30 июня 2010

Я сделал 2 коммита (и я не выдвинул) в git, где 'Commit 2' - самый последний ':

 git log -2
commit 791962d776f66253d656586b097b2677eaa983d1
Author: michael <michael@michael-laptop.(none)>
Date:   Tue Jun 29 23:20:58 2010 -0700

    Commit 2

commit b743075e81f6fe25fe48ddbef2b5e7cc06623533
Author: michael <michael@michael-laptop.(none)>
Date:   Tue Feb 16 23:09:53 2010 -0800

    Commit 1

И в моем коммите 1 b743075e81f6fe25fe48ddbef2b5e7cc06623533, я коснулся / изменилколичество файлов:

   dir1/file1.cpp
   dir1/file1.h
   dir1/file2.cpp
   dir1/file2.h

Мои вопросы: как мне откатить сделанные мной изменения в dir1 / file2.cpp, dir1 / file2.h коммита 1?И все остальное так же?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 30 июня 2010

Самое простое решение - от вашего последнего коммита (HEAD) до:

  • оформить заказ эти два файла в более старой версии,
  • добавить их,
  • и затем коммит.
    git checkout b743075e81 -- dir1/file2.cpp
    git checkout b743075e81 -- dir1/file2.h
    git add dir1/file2.cpp # only if you made additional changes
    git add dir1/file2.h   # only if you made additional changes
    git commit -m "revert dir1/file2.cpp and dir1/file2.h"

Как Крис Джонсен упоминает в комментариях:

git checkout с помощью pathspecs обновляет индекс (например, git reset с pathspecs) и рабочее дерево, поэтому git add не требуется, если после внесения дополнительных изменений не сделано.

3 голосов
/ 30 июня 2010

Если вы уже выдвинули свои коммиты к источнику, то другие решения, описанные здесь (с использованием git reset или git checkout, за которыми следует git commit), являются вашим единственным вменяемым вариантом.

Однако, , если вы еще не отправили свои изменения, и , если вы хотите удалить все следы, которые когда-либо были зафиксированы в файлах, хорошим вариантом является интерактивная перебазировка. Используйте следующую команду для отмены двух последних коммитов:

git rebase --interactive HEAD~2

Откроется редактор, показывающий ваши два коммита. Вы хотите отредактировать файл, чтобы показать следующее, затем сохранить; в частности, вы хотите изменить pick перед первым коммитом на edit:

edit b743075 Commit 1
pick 791962d Commit 2

Затем Git переведет нас в состояние, в котором мы можем редактировать первый коммит (не касаясь второго). В нем говорится, что вы можете изменить коммит с помощью git commit --amend, но мы на самом деле хотим сбросить коммит перед заголовком и полностью отменить его:

git reset HEAD^

Это поместит изменения из Commit 1 обратно в ваше рабочее дерево. Затем git add только те файлы, которые вы хотите сохранить, и повторите их, используя git commit:

git add dir1/file1.cpp
git add dir1/file1.h
git commit -m "Commit 1"

Наконец, сделайте полный сброс, чтобы удалить файлы, которые вы не хотите сохранять из рабочего дерева, и завершите ребаз:

git reset --hard
git rebase --continue

Когда перебазирование будет завершено, ваш репозиторий будет иметь обе фиксации, но никаких следов file2.* файлов не будет.

0 голосов
/ 30 июня 2010

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

 git reset <commit hash> <filename>

Для ваших требований используйте

 git reset b743075e81f6fe25fe48ddbef2b5e7cc06623533 dir1/file2.cpp

 git reset b743075e81f6fe25fe48ddbef2b5e7cc06623533 dir1/file2.h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...