当前位置: 首页 > 知识库问答 >
问题:

隐藏对特定文件的更改

龙德润
2023-03-14

我有一个大型git项目,我愚蠢地将其导入eclipse并运行了自动格式化。现在,项目中的每个文件都显示为已修改。与其提交我的格式化文件,我宁愿恢复所有我只格式化过且没有其他更改的文件。例如:

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)

#     modified: dir/file1.cpp
#     modified: dir/file1.h
#     modified: dir/file2.cpp
#     modified: dir/file2.h
#     modified: dir/file3.cpp
#     modified: dir/file3.h
#     modified: dir/file4.cpp
#     modified: dir/file4.h

我知道那是文件2。cpp文件2。h和文件3。已使用内容(即,不只是格式化)修改了cpp。我想隐藏对这三个文件的更改,然后签出一个旧版本,这样我就可以在之后重新应用对这些文件的更改。我宁愿避免这样的事情:

$ cp file2.cpp ~/tmp
$ git checkout blahblahblah
$ cp ~/tmp/file2.cpp .

如果有一种明显的方法不涉及藏匿,请告诉我。无论什么都能完成任务。

共有3个答案

卞琨
2023-03-14

一个不错的选择是使用交互式隐藏模式。

git stash --patch

它的工作方式主要类似于交互式添加模式:您将看到一系列差异,显示您在工作树中所做的更改,并且您必须选择要隐藏的文件(或仅文件的某些部分!),其余部分将保持不变。

从man git stash:

使用--patch,您可以从头部和工作树之间的差异中交互选择要隐藏的大块。隐藏项的构造使其索引状态与存储库的索引状态相同,其工作树仅包含您以交互方式选择的更改。然后从工作树中回滚选定的更改。请参阅git add(1)的“交互模式”部分,了解如何操作--patch模式。

在您的情况下,您将能够只看到大块的格式并将其单独隐藏,而不会丢失有意义的更改。

柴磊
2023-03-14

我知道file2.cppfile2. hfile3.cpp已经被修改了内容(即,不仅仅是格式化)。
我想隐藏对这三个文件的更改,然后签出旧的修订,这样我就可以在之后重新应用对这些文件的更改。

使用Git 2.13(Q2 2017),git stash将正式有一种方法来存储特定文件的更改

git stash push [--] [<pathspec>...]

请参阅Thomas Gummer的commit 9e14090、commit 1ada502、commit df6bba0(2017年2月28日)和commit 9ca6326、commit 6f5ccd4、commit f5727e2(2017年2月19日)(tgummerer)
(由Junio C Hamano--gitster在commit 44c3f09中合并,2017年3月10日)

如现在记录的:

为了快速制作快照,可以省略“推送”<在这种模式下,不允许使用非选项参数来防止拼写错误的子命令进行不必要的隐藏
这有两个例外,分别是用作隐藏推送的别名的隐藏-p和路径规范,它们可以在双连字符后进行消歧。

当路径规范被赋予“git stash ush”时,新存储仅为与路径规范匹配的文件记录修改后的状态。
索引条目和工作树文件随后也仅为这些文件回滚到HEAD中的状态,保留与路径规范不匹配的文件完好无损。

注意,正如medmunds在评论中指出的那样,git stash将使用相对于git repo根文件夹的路径。

使用Git 2.26(2020年第2季度),“Git rm”和“Git stash”学习新的“--pathspec from file”选项。

如果您有一个文件列表要保存在filesToStash中。txt,那么这就足够了:

git stash --pathspec-from-file=filesToStash.txt` is enough.

南门正业
2023-03-14

您可以添加带有要保留更改的文件,然后隐藏其余文件并清除隐藏:

git add file2.cpp file2.h file3.cpp
git stash --keep-index

此时,您已经隐藏了不需要的更改。如果您想永久摆脱它们,请运行:

git stash drop

现在您有了file2.cppfile2. hfile3.cpp暂存以供提交。如果您想隐藏这些文件(而不是提交它们):

git reset
git stash

现在您将处于之前的提交中,只有这三个文件被隐藏。

更新:

正如VonC在他的回答中解释的那样,Git 2.13及更高版本包括一种更直接的方法来使用git stash ush隐藏特定文件。

 类似资料:
  • Linux 下,名称中第一个字符为 . 的文件或者文件夹,系统会将它们隐藏起来。传统上,这种文件大多是用户的配置文件。 您可以尝试以下操作: cd ~ #进入您的用户目录 ls #查看当前目录下的文件列表 ls -a #查看所有文件的文件列表(包括隐藏文件)。 如果您只想查看隐藏文件,而不包括这两个特殊目录,您可以使用 ls 命令的选项 -A (ls -A) 每个目录下都包含

  • 新反应: 我有一个 组件,我只想在用户访问特定页面时隐藏该组件。 App.JS: main.js:

  • 我确实有一些独特的要求,我想隐藏要从特定角色用户中选择的角色。 例如,我有一个角色名称admin、部门1、部门2和部门3。作为管理员,我应该只能在门户中看到部门1、部门2和部门3的角色管理。 但如果我为管理员定义权限,他/她可以管理角色。管理员用户可以查看Liferay中可用OOTB的所有角色。 有人能帮我配置一下吗?

  • 我想对@everyone隐藏一个频道,然后向某些特定成员授予权限,这些成员可以访问该频道。如何将该权限/规则添加到频道?

  • 我有一个bat文件,它启动了一个程序,并且已经输入了我的用户名和密码,我必须让cmd打开,程序才能运行。我想隐藏cmd窗口,以防止我意外关闭,下面是代码: 我需要把这个藏起来,但是在我想要的时候出现在任务管理器中关闭...谢谢

  • 我目前正在使用Java服务包装器。它工作得很好,我可以使用我的可执行jar将其作为服务安装,甚至在将其作为服务安装时传递VM参数。 但由于这将在这里和那里部署,我想知道如何防止人们检索Jar文件中的源文件。这可能吗?我正在考虑将jar文件转换为。exe文件,并将其作为这样的服务安装,因为我发现有几个工具能够做到这一点。但他们似乎不允许我传递VM参数。 有人知道我该怎么做吗?