gpt4 book ai didi

Git:放弃自某个提交以来对单个文件的所有更改

转载 作者:太空狗 更新时间:2023-10-29 14:27:16 25 4
gpt4 key购买 nike

我想“撤消”对一个特定文件的所有本地更改,即返回到该文件在 origin/master 的状态:

  • 如果它存在并被修改 => 恢复到旧版本。
  • 如果已添加 => 删除文件。
  • 如果已删除 => 重新添加文件。
  • 如果已重命名 => 重命名回旧名称。
  • 等等

git checkout origin/master -- path/to/file.txt 适用于修改后的文件,但对于添加的文件尤其失败,因此在 origin/master 中不存在(“没有这样的文件或目录”)。

如果需要,我可以依赖于仅更改一个文件的提交。 (然后也许我可以从 git log --follow --oneline --decorate origin/master.. path/to/file.txt 解析 SHA,然后还原(或 rebase /删除)那些提交. 但这似乎是手动和 hacky,我更喜欢一个更具声明性的解决方案......)

更新:澄清一下,本地更改已经提交。可能会有多次提交更改文件。

最佳答案

除了重命名问题,您首先建议的一般方法 ( git checkout <rev> -- <path> ) 显然是正确的方法。如果失败,则文件必须已添加,因此您可以简单地将“失败”视为“删除的指示”。

重命名问题除外。

在这里,您可以使用 git log --follow你建议的方法。跟随,观察重命名操作,并将它们收集起来。您可以使用 --name-status观察重命名,例如:

$ git log --follow --oneline --name-status -- builtin/var.c
f9bc573 ident: rename IDENT_ERROR_ON_NO_NAME to IDENT_STRICT
M builtin/var.c
c2e86ad Fix sparse warnings
M builtin/var.c
2bc8c1a var: run setup_git_directory_gently() sooner
M builtin/var.c
81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
R100 builtin-var.c builtin/var.c
64778d2 Make 'git var GIT_PAGER' always print the configured pager
M builtin-var.c
9fabb6d Fix 'git var' usage synopsis
M builtin-var.c
55b6745 make "git var" a built-in
R096 var.c builtin-var.c
6361824 Teach git var about GIT_PAGER
M var.c
[snip]

(我自己在 git 源上运行了上面的代码)。这里有一个相当大的问题,因为您必须知道文件的名称,而不是旧名称,但也许这就是问题所在。

重命名后,您可以 git checkout <rev> -- <path-by-name-at-the-time> . --name-status部分还将显示文件是否是在历史版本之前的版本中创建的(状态将为 A,已添加),您将知道删除该文件。

这排除了“文件已删除”的情况,这与您知道文件的新名称的基本思想相冲突。当文件foo被删除,它首先只有一个旧名称。

据我所知,没有好的方法来处理最后一种情况。你可以假设如果foo存在于“旧”提交中并且您没有新名称,它必须已被删除;但是如果跟随重命名的想法是从一个 名称开始,这在 git 中不起作用:--follow该选项仅在从最近的历史开始并及时倒退时才有效。

关于Git:放弃自某个提交以来对单个文件的所有更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20127667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com