Git 提交添加/删除未暂存提交的文件
Posted
技术标签:
【中文标题】Git 提交添加/删除未暂存提交的文件【英文标题】:Git commit adds/removes files not staged for commit 【发布时间】:2020-07-18 23:06:04 【问题描述】:我对使用 git 还很陌生,而且我已经把自己挖了好几次了,我的一个 git 提交最终修改了在执行 git status
时没有显示的文件。我很好奇是否有人知道可能会导致我的本地存储库进入这种状态,因为我似乎需要重新克隆存储库来解决我的问题。
带有一个未暂存文件的示例 git status。
User@User-DESKTOP:~/code/tap$ git status
On branch what-is-programming
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: exampleFile.cs
no changes added to commit (use "git add" and/or "git commit -a")
然后我添加文件
User@User-DESKTOP:~/code/tap$ git add .
warning: LF will be replaced by CRLF in exampleFile.cs
The file will have its original line endings in your working directory
然后我提交文件
User@User-DESKTOP:~/code/tap$ git commit -m "some message" [what-is-programming bd86d6b] some message
3 files changed, 88 insertions(+), 186 deletions(-)
create mode 100644 someFileIDontExpect.cs
delete mode 100644 anotherFileIDontExpect.cs
如果我对上一次提交进行比较,它会显示我的期望
User@User-DESKTOP:~/code/tap$ git diff --name-status HEAD~
M exampleFile.cs
如果我与大师不同,则相同
User@User-DESKTOP:~/code/tap$ git diff --name-status master
M exampleFile.cs
但是当我推送到 github 时,它显示我创建了 someFileIDontExpect.cs 并删除了 anotherFileIDontExpect.cs。
我看到我做“奇怪”事情的潜在地方,我有时会做一个git commit -m "WIP"
,然后是一个git reset --soft HEAD~
,以继续处理 WIP 提交。我发现工作流程比git stash
更好,但它可能会产生问题?我不确定如何找出问题所在,因为对我的提交进行差异化处理似乎很好,但是一旦它到达 github,它就处于非常意外的状态。
我们也在使用 git-lfs,但这发生在源文件中,所以我不确定它是否会产生影响。
感谢您提供的任何见解!我很好奇我是怎么弄坏东西的。
编辑
@mkrieger1 你说得对,git add .
添加了我工作目录中的所有文件,但git status
没有显示任何其他未暂存的文件。我提交的 git diff 也没有显示其他添加或修改的文件。
@matt 我不确定我是否跟随。 git diff --name-status HEAD~
应该列出上一次提交中添加或修改的文件,对吗?它仅显示 exampleFile.cs
正在修改,即使我的提交消息显示 someFileIDontExpect.cs
正在创建并且 anotherFileIDontExpect.cs
正在删除。我希望git diff --name-status master
向我展示我的分支what-is-programming
中不在master
中的更改,并且它们也仅显示exampleFile.cs
被修改。我的master
的本地副本与远程匹配,那么为什么当我推送其他两个文件时会出现在拉取请求中?有什么我应该比较的东西来看看我的拉取请求中会出现什么?
【问题讨论】:
git diff --name-status HEAD~
和 git diff --name-status master
不要做你认为他们做的事。我认为您认为他们将您刚刚提交的 what-is-programming
与某事进行了比较。他们没有。他们将工作树与某物进行比较。所以他们对你已经知道的东西没有任何补充。
git add .
在当前目录中添加 所有 个文件,而不仅仅是您想要的那个。
回复评论的方式是使用comment。当您这样做时,请按名称称呼评论者。否则我们不会听到你的声音。例如,如果您想让我听到您的声音,请评论“@matt ...”。
考虑在 GitHub 中找出您将与之比较的提交的原始哈希 ID,然后在执行 git commit
之后执行 git diff <hash> HEAD
,看看与该提交有什么区别- 由哈希 ID 指定 - 以及您刚刚创建的,由 HEAD 指定。
除此之外,请考虑运行git fetch
,然后运行git log --all --graph --decorate --oneline
,以查看您现在正在处理的提交图,以及您的Git 可以通过git fetch
从他们的Git 中获得的内容。或者,您可能更喜欢一些图形用户界面来查看提交。
【参考方案1】:
刚刚经历了同样的问题。我也和你一样,WIP 提交和reset --soft
继续工作,所以可能是同样的原因。
使用git reset --soft
,更改仍处于阶段。我使用git restore --staged *
删除暂存区域中的所有文件,然后进行较小的提交。发生了同样的问题,仅添加 2 个文件会导致提交包含更多更改,即使它们没有被列为暂存 git status
。
为我解决的问题是执行相同的步骤,但更改命令:
git restore --staged *
到
git restore --staged .
注意*
(全部)和.
(当前目录)之间的区别。
我怀疑不应该提交的文件以某种方式仍然添加到暂存区域,但未使用git status
列出,并且*
参数无法识别,因为它可能指的是所有暂存文件。只是猜测,不知道。
【讨论】:
以上是关于Git 提交添加/删除未暂存提交的文件的主要内容,如果未能解决你的问题,请参考以下文章