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
中,分支只是一个标签,一个标签。要对存储库进行任何更改,我们必须创建一个新的提交

如果我正确理解您的问题,我们只想“撤消”对其中一个文件的部分更改(因为在一次提交中添加了ab,并且删除了fd

一种方法是
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还原删除所有我们不想保留的更改。
一步一步
  • 切换到您的主分支,并确保您对工作树中有问题的文件没有任何更改
  • 将文件恢复到删除ab之前的状态:

    如果现在运行
    git diff
    ,您应该会看到ab被重新添加,而fd被删除
  • 手动放置你想要保留的帅哥。您可以使用自己喜欢的GUI或run,它允许您编辑用于登台的Hunk。如果使用后者,请记住它不会更改文件本身,而是只选择要添加到索引中的更改
  • 确认您选择保留的更改与您预期的一致:运行并确保您没有删除任何内容,也没有同时添加ab
  • 使用
    git提交提交
    ,并删除您决定不使用
    git还原保留的所有更改。

  • 如果您问题中的命令是我们执行的唯一git命令,那么我们所做的就是从commit
    3
    创建一个新分支,并尝试将其合并到
    master
    。这不起任何作用的原因是,在
    git
    中,分支只是一个标签,一个标签。要对存储库进行任何更改,我们必须创建一个新的提交

    如果我正确理解您的问题,我们只想“撤消”对其中一个文件的部分更改(因为在一次提交中添加了ab,并且删除了fd

    一种方法是
    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还原删除所有我们不想保留的更改。
    
    一步一步
  • 切换到您的主分支,并确保您对工作树中有问题的文件没有任何更改
  • 将文件恢复到删除ab之前的状态:

    如果现在运行
    git diff
    ,您应该会看到ab被重新添加,而fd被删除
  • 手动放置你想要保留的帅哥。您可以使用自己喜欢的GUI或run,它允许您编辑用于登台的Hunk。如果使用后者,请记住它不会更改文件本身,而是只选择要添加到索引中的更改
  • 确认您选择保留的更改与您预期的一致:运行并确保您没有删除任何内容,也没有同时添加ab
  • 使用
    git提交提交
    ,并删除您决定不使用
    git还原保留的所有更改。

  • 你在学什么语言?如果是java。有一种非常酷的方法来处理这种情况。仅仅创建分支而不进行任何代码更改不会神奇地恢复代码。创建分支后,必须进行更改以恢复代码,然后在分支上提交更改。然后你就可以把它合并成师父了。嗨,@j6t,我试过了。创建了一个虚拟文件,并承诺推进分支。但当我将该分支合并到master中时,只添加了新文件,旧文件中的更改保留了下来。@surajs1n不,是Python。@brick,当然了。您只能合并所做的更改。(因为您所做的只是添加一个文件,所以您只会得到添加的文件。)如果y