存储对特定文件的更改

问题描述 投票:0回答:6

我有一个大型 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

我知道

file2.cpp
file2.h
file3.cpp
已被修改内容(即,不仅仅是格式化)。 我想存储对这三个文件的更改,然后签出旧版本,以便之后可以重新应用对这些文件的更改。 我宁愿避免类似的事情:

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

如果有一种不涉及隐藏的明显方法可以做到这一点,请告诉我。 不管怎样都能完成工作。

git git-stash
6个回答
78
投票

您可以

add
包含要保留的更改的文件,然后
stash
其余文件并清除存储:

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

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

git stash drop

现在您已经准备好

file2.cpp
file2.h
file3.cpp
进行提交。如果您想隐藏这些文件(而不是提交它们):

git reset
git stash

现在您将处于之前的提交状态,仅隐藏这三个文件。

更新:

Git 2.13 及更高版本包含一种更直接的方法来使用

git stash push
存储特定文件,VonC 在他的回答中解释


73
投票

我知道

file2.cpp
file2.h
file3.cpp
已被修改内容(即,不仅仅是格式化)。
我想存储对这三个文件的更改,然后签出旧版本,以便之后可以重新应用对这些文件的更改。

在 Git 2.13(2017 年第 2 季度)中,

git stash
将正式拥有一种方法来存储特定文件 (pathspec) 的更改:

git stash push [--] [<pathspec>...] # Example git stash push -m "named-stash" -- file2.cpp file2.h # you can then easily reapply that stash with: git stash apply stash^{/named-stash}
参见 

commit 9e14090commit 1ada502commit df6bba0(2017 年 2 月 28 日)和 commit 9ca6326commit 6f5ccd4commit f5727e2(2 月 2 日) 017) 作者:托马斯·古默勒 (tgummerer

) )
.
(由 Junio C Hamano -- gitster
 --
合并于
commit 44c3f09,2017 年 3 月 10 日)

现在记录

为了快速制作快照,可以省略“push”。

在此模式下,不允许使用非选项参数以防止拼写错误 子命令避免创建不需要的存储。
两个例外是
stash -p

,它充当 
stash push -p
 和路径规范的别名,在双连字符 
--
 之后允许使用它们以消除歧义。

当将路径规范赋予“git stash push

”时,新的存储记录了
仅针对与路径规范匹配的文件修改状态
然后索引条目和工作树文件回滚到状态
HEAD
 也仅适用于这些文件,留下与
路径规范完好无损。

注意,正如

medmunds评论中指出的那样,git stash

将使用相对于git存储库根文件夹的路径


Git 2.26(2020 年第 2 季度)中,“

git rm”和“

git stash
”学习新的“
--pathspec-from-file
”选项
如果您有要存储的文件列表

filesToStash.txt

,那么这就足够了:

git stash --pathspec-from-file=filesToStash.txt



28
投票

git stash --patch

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

来自

man git-stash


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

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

您还可以使用 git stash -p。通过这种方式,您可以选择应将哪些帅哥添加到存储中,也可以选择整个文件。

13
投票
系统会提示您为每个帅哥执行一些操作:

y - stash this hunk n - do not stash this hunk q - quit; do not stash this hunk or any of the remaining ones a - stash this hunk and all later hunks in the file d - do not stash this hunk or any of the later hunks in the file g - select a hunk to go to / - search for a hunk matching the given regex j - leave this hunk undecided, see next undecided hunk J - leave this hunk undecided, see next hunk k - leave this hunk undecided, see previous undecided hunk K - leave this hunk undecided, see previous hunk s - split the current hunk into smaller hunks e - manually edit the current hunk ? - print help

这对 

4
投票

git apply

 IMO 来说很有用:
git diff file2.cpp file2.h file3.cpp > ../my-changes.patch
git checkout ...
git apply ../my-changes.patch

diff
之后,您可以检查补丁文件以确保所有更改都在那里。

请注意,您可能需要使用 
--reject

选项来应用,以防补丁应用不干净。另请参阅

手册页以了解 apply

很棒的提示。这里唯一不明显的是你需要使用

0
投票
git stash pop

一旦您希望将“搁置”的更改放回到您的更改集中。
    

© www.soinside.com 2019 - 2024. All rights reserved.