如何放弃对单个文件的更改并使用最新的HEAD副本覆盖它?我想只对一个文件执行git reset --hard
。
HEAD~1
来引用先前的提交,以表示倒数第二个提交。 - RyanmtHEAD
- 参见 http://www.norbauer.com/rails-consulting/notes/git-revert-reset-a-single-file.html。 - cxwreset
命令(如其所说)"无法重置带路径的硬重置",以及为什么 checkout
命令不能(或不应该)用于整个设置的硬重置?(我的意思是为什么它被设计成这样。) - Sz.git checkout
的man页面中可以看到:“通过使用索引或<tree-ish>中的内容替换工作树中的路径来覆盖它们。”也就是说,如果省略了<tree-ish>,则会使用索引中的任何内容来更新工作树。这可能与HEAD相同,也可能不同。 - tuntap从 Git 2.23(2019年8月)开始,您可以使用restore
命令进行操作(更多信息):
git restore pathTo/MyFile
以上命令将会在当前分支的最新提交HEAD
上恢复MyFile
。
如果您想要获取来自其他提交的更改,可以在提交历史记录中向后查找。下面的命令将获取比最后一个提交早两个提交的MyFile
。由于您现在使用的是master~2
而不是默认的master
,因此需要使用-s
(--source
)选项以恢复源文件:
git restore -s master~2 pathTo/MyFile
你也可以从其他分支获取文件!
git restore -s my-feature-branch pathTo/MyFile
若要将单个文件硬重置为最新版本:
git checkout @ -- myfile.ext
请注意,@
表示HEAD
的缩写。旧版本的git可能不支持这种简写形式。
为了将单个文件硬重置到索引,假设索引非空,否则重置到HEAD
:
git checkout -- myfile.ext
重点是为了安全起见,除非你特别想要重置到索引,否则不要在命令中遗漏@
或HEAD
。
man bash
页面。也在此答案中提到:https://unix.stackexchange.com/a/187548/142855 - boweeb--
用于告诉程序:“我已经完成了所有 '选项' 的设置,从现在开始,接下来的所有内容都将是位置参数。”传统上,“选项” 是像 --recursive
这样的标记,它们可以以任何顺序出现,甚至可以在简短形式中组合在一起,例如 rm -rf
。相反,“位置参数” 更像是在编程语言中传递给函数的参数:它们在标记列表中的位置定义了程序要如何使用它们(通常是文件名)。--
消除了哪个是哪个的歧义。 - iono要还原到上游/主分支,请执行以下操作:
git checkout upstream/master -- myfile.txt
fatal: invalid reference: upstream/master
- vsyncupstream
是他们远程仓库的名称。很可能你的是 origin
。 - marcelocra不必引用HEAD。
git checkout -- file.js
就足够了。
您可以使用以下命令:
git checkout filename
如果您有一个与文件名相同的分支,您必须使用以下命令:
git checkout -- filename
您可以使用以下命令重置单个文件
git checkout HEAD -- path_to_file/file_name
path_to_file/filename
。git status
my-file.txt
的工作副本。如果你对git不太熟悉,那么这是一个简单、易学、实用的方法,可以帮助你轻松摆脱困境:
查看文件日志
git log myFile.js
提交 1023057173029091u23f01w276931f7f42595f84f 作者:kmiklas 日期:2018年8月7日,星期二 -0400
JIRA-12345 - 使用新架构进行重构。
注意文件哈希值:
1023057173029091u23f01w276931f7f42595f84f
使用哈希值显示文件。确保它是你想要的:
git show 1023057173029091u23f01w276931f7f42595f84f:./myFile.js
将文件重定向到本地副本
git show 1023057173029091u23f01w276931f7f42595f84f:./myFile.js > myFile.07aug2018.js
备份当前文件。
cp myFile.js myFile.bak.js
在您喜欢的文本编辑器中打开两个文件。
vim myFile.js
vim myFile.07aug2018.js
从myFile.07aug2018.js复制并粘贴代码到myFile.js,并保存。
提交并推送myFile.js
再次查看日志,并确认您的文件已正确放置。
告诉您的客户拉取最新版本,高兴地看着它与旧版本一起工作。
这不是最性感或最 git 中心的解决方案,肯定是一个“手动”重置/回滚,但它有效。它需要对 git 的最少知识,并且不会干扰提交历史记录。
特定情况
是指什么? - touch my body
git checkout
的答案。在git中,“revert”是你对提交进行的一种操作。 “Revert”会将历史提交的反向重现到您的工作目录中,因此您可以创建一个新提交来“撤消”已经回滚的提交。我发现这是那些从svn转到git的人们经常困惑的地方。 - Dan Raygit restore -s main pathTo/MyFile
- guettli