Подтвердить что ты не робот

Как восстановить только несколько строк из файла, записанного в данной фиксации?

Я хочу восстановить несколько строк из файла, записанного в более старой фиксации. Я вижу эти строки, запустив

git log -p

В крайнем случае, я готов просто скопировать эти строки из вывода этого журнала, но это повредит моему пуристскому сердцу и кажется довольно непрофессиональным.

Я не хочу просто запускать git checkout <file>, потому что это отбрасывает локальные изменения, сделанные в <file>, начиная с рассматриваемого коммита. Вместо этого я хотел бы объединить изменения из этого коммита в <file> в рабочем дереве, используя только чистые команды Git.

Как я могу это сделать?

4b9b3361

Ответ 1

Использовать интерактивную проверку

Следующий синтаксис git-checkout,

git checkout --patch <tree-ish> -- <paths>

или, что эквивалентно,

git checkout -p <tree-ish> -- <paths>

позволяет вам интерактивно проверять ханки из одного или нескольких файлов, перечисленных в <paths>, как записано в <tree-ish> (чаще всего, фиксация).

Подробнее см. git-checkout man page.

Пример

Чтобы исправить идеи, вот пример игрушек (нерелевантный stdout опущен):

# set things up
$ mkdir test
$ cd test
$ git init

# create some content and commit
$ printf "Hello, world.\n" > README.md
$ printf "foo\nbar\nbaz\n" > test.txt
$ git add .
$ git commit -m "initial commit"

# modify the working tree
$ printf "another line\n" >> README.md 
$ printf "foo\nfoo\n" > test.txt

# now restore stuff from test.txt as recorded in master tip
$ git checkout -p master -- test.txt
diff --git b/test.txt a/test.txt
index 0d55bed..86e041d 100644
--- b/test.txt
+++ a/test.txt
@@ -1,2 +1,3 @@
 foo
-foo
+bar
+baz
Apply this hunk to index and worktree [y,n,q,a,d,/,e,?]? y
error: patch failed: test.txt:1
error: test.txt: patch does not apply
The selected hunks do not apply to the index!
Apply them to the worktree anyway? y

# Sanity check: inspect the working tree
# (the hunk "bar\nbaz" from test.txt was restored, as desired)
$ cat test.txt
foo
bar
baz
# (README.md, on the other hand, was not affected, as desired)
$ cat README.md
Hello, world.
another line

Ответ 2

Если в старшей фиксации вы только изменили этот файл и хотите отменить все эти изменения, то просто выполните:

git revert SHA

Если было несколько файлов, здесь чистое git (и не большое) решение:

git revert SHA --no-commit
git reset
git add path/to/file
git checkout .
git commit

Или a git + patch решение (также не велико):

git diff -p SHA path/to/file > patch
patch -R < patch
git commit .