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 &lt;hash&gt; 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 提交添加/删除未暂存提交的文件的主要内容,如果未能解决你的问题,请参考以下文章

提交后将 git 存储库和工作目录复制到另一个位置,在检查状态时给出“未暂存的更改”

常用git命令总结

Git 提交转储随机文件

git checkout 将未暂存的文件带到新分支

source tree 使用心得

3_git基础