Git 如何将分支中旧提交的文件中所做的更改部分还原到该分支的头部?
情况是这样的Git 如何将分支中旧提交的文件中所做的更改部分还原到该分支的头部?,git,git-merge,git-checkout,Git,Git Merge,Git Checkout,情况是这样的 ---1---2---3---4---5---6---(HEAD -> master) | fix 在提交2之后,我做了一些更改,后来意识到我希望将提交2的某些部分重新放回代码中。具体来说,我删除了函数f()和g(),并在commit 3的源文件中添加了函数a()和b()我想在master中保留a()和b(),同时取回f()和g()。。请注意,我不想将master中的整个文件恢复为提交2时的状态 因此,我在提交2时创建了一个分支修复程序,并尝试将其
---1---2---3---4---5---6---(HEAD -> master)
|
fix
在提交2之后,我做了一些更改,后来意识到我希望将提交2的某些部分重新放回代码中。具体来说,我删除了函数f()和g(),并在commit 3的源文件中添加了函数a()和b()我想在master中保留a()和b(),同时取回f()和g()。。请注意,我不想将master中的整个文件恢复为提交2时的状态
因此,我在提交2时创建了一个分支修复程序,并尝试将其合并到master中
git checkout 3
git checkout -b fix
git checkout master
git merge fix
我明白了
Already up to date.
这是问题的重复:,但我遵循了答案中建议的步骤。这并没有导致f()和g()在master中被还原-事实上,它并没有触发任何合并冲突
这是我多次面临的问题。我理解,因为commit 2已经是master历史的一部分,在某种意义上它已经合并到master中了。存储库的状态在2和HEAD处不同,我希望有选择地在HEAD处返回2的一部分。据我所知,git merge manual页面没有指定如何执行此操作。如果您问题中的命令是我们执行的唯一git命令,那么我们所做的就是从commit
3
创建一个新分支,并尝试将其合并到master
中。这不起任何作用的原因是,在git
中,分支只是一个标签,一个标签。要对存储库进行任何更改,我们必须创建一个新的提交
如果我正确理解您的问题,我们只想“撤消”对其中一个文件的部分更改(因为在一次提交中添加了a和b,并且删除了f和d)
一种方法是git restore
:
git restore -s <commit> <path> // Restore the file to how it was before the chanes.
git add -e // Stage changes you want to keep. May use a GUI tool instead.
git diff --cached // Optional: confirm that your changes are correct.
git commit
git restore . // Drop all the changes we didn't want to keep.
git restore-s//将文件还原到chanes之前的状态。
git add-e//阶段更改您想要保留的内容。可以使用GUI工具代替。
git diff--cached//可选:确认更改是否正确。
git提交
git还原删除所有我们不想保留的更改。
一步一步
如果现在运行
git diff
,您应该会看到a和b被重新添加,而f和d被删除git提交提交
,并删除您决定不使用git还原保留的所有更改。
如果您问题中的命令是我们执行的唯一git命令,那么我们所做的就是从commit
3
创建一个新分支,并尝试将其合并到master
。这不起任何作用的原因是,在git
中,分支只是一个标签,一个标签。要对存储库进行任何更改,我们必须创建一个新的提交
如果我正确理解您的问题,我们只想“撤消”对其中一个文件的部分更改(因为在一次提交中添加了a和b,并且删除了f和d)
一种方法是git restore
:
git restore -s <commit> <path> // Restore the file to how it was before the chanes.
git add -e // Stage changes you want to keep. May use a GUI tool instead.
git diff --cached // Optional: confirm that your changes are correct.
git commit
git restore . // Drop all the changes we didn't want to keep.
git restore-s//将文件还原到chanes之前的状态。
git add-e//阶段更改您想要保留的内容。可以使用GUI工具代替。
git diff--cached//可选:确认更改是否正确。
git提交
git还原删除所有我们不想保留的更改。
一步一步
如果现在运行
git diff
,您应该会看到a和b被重新添加,而f和d被删除git提交提交
,并删除您决定不使用git还原保留的所有更改。
你在学什么语言?如果是java。有一种非常酷的方法来处理这种情况。仅仅创建分支而不进行任何代码更改不会神奇地恢复代码。创建分支后,必须进行更改以恢复代码,然后在分支上提交更改。然后你就可以把它合并成师父了。嗨,@j6t,我试过了。创建了一个虚拟文件,并承诺推进分支。但当我将该分支合并到master中时,只添加了新文件,旧文件中的更改保留了下来。@surajs1n不,是Python。@brick,当然了。您只能合并所做的更改。(因为您所做的只是添加一个文件,所以您只会得到添加的文件。)如果y