Git中分支之间未跟踪的文件

43

我一直在这里搜索答案,但似乎我可能对 git 分支的工作方式有错误的假设。

我有我的master分支,并创建了一个名为 profiles 的功能分支,在其中对配置文件进行一些特定的工作。在处理配置文件时,我更改了5或6个文件并添加了其他5个或6个新文件。我需要切换回master分支来快速修复一个小 bug,发现所有新文件和修改后的文件也在此分支上。我想这是有道理的,因为 Git 不会从master分支中删除未被跟踪的文件,然后再将它们带回我的profiles分支,因为它们实际上是未被跟踪的。但是针对已存在的文件做出的更改却为什么会出现在主分支中呢?

这里的最佳实践应该是什么呢?我还没有准备好在本地提交更改。我应该只是暂存所有这些更改,切换到master,进行小修复,然后切换回profiles再应用暂存吗?

任何帮助都将不胜感激。谢谢

3个回答

42

"我还没有准备好在本地提交更改。"

在 Git 中,提交是本地的事情,可以随意撤销、重做和重新撤销。只有当你将提交推送到某个地方时,才需要注意。

此外,提交对于像 gitk 这样的本地工具是可见的,可以对其进行差异比较,并可以基于其他提交进行变基等操作。这是一个非常强大的工具。学会使用它。

我经常执行以下操作:

git add .; git commit -a -m 'WIP'

如果我觉得可能会被打断,我就把当前工作树中的所有东西都存储起来。如果我想再做一些更改,我会使用:

git add .; git commit --amend

我想就地更新我的“WIP”提交。当我最终准备好进行真正的提交时,只需执行以下操作:

git reset --soft HEAD~; git reset

现在我可以仔细地控制最终提交的内容。


1
我记性很差,喜欢使用git来查看我的工作进度(而且有了magit更方便了,还能与我的工作流程集成)。实际上,你的解决方案更有道理。只需要更频繁地提交即可。我只需要稍微调整一下我的工作流程。谢谢。 - Clarence
2
请澄清一下,“git reset --soft HEAD~; git reset”和“git reset HEAD^”之间是否有任何意图上的区别? 就我看来,它们都将HEAD和索引重置到“WIP”提交的父提交,准备使用工作树中的部分或全部更改进行真正的提交,但我可能会错过一些微妙之处。 - CB Bailey
2
@Charles Bailey:“--soft”选项不会对索引文件或工作树进行任何更改,但要求它们处于良好状态。这将使所有更改的文件都被标记为“Changes to be committed”,就像git status命令所显示的那样。如果您使用“git reset HEAD^”,则不会出现“fatal: Cannot do a soft reset in the middle of a merge”的错误提示。 - maletin
2
当我写这个答案时,“stash”是一个相对较新的东西。但现在我完全拥抱使用“git stash…”来保存和恢复正在进行中的工作,甚至可以通过编程实现。例如,“git stash; git pull --ff-only; git stash pop --index”几乎不需要任何干预就可以完成,并且它让我保持与上游的最新状态。 - Randal Schwartz

7

它们没有出现在主分支中 - 如果您进行了硬重置和清理,它们将消失。当您切换分支时,Git仅保留本地修改。

这通常很有用; 您可能已经意识到要将这些修改提交到与当前所在分支不同的分支。如果修改与两个分支之间的差异冲突,则git将拒绝切换分支。

您关于最佳方法的想法是正确的 - 干净地切换分支是我使用git stash最常见的用途之一。


5
似乎您是通过 git branch profiles 命令创建了分支,但没有切换到该分支上,所以一直停留在 master 分支上,当进行提交时,文件更改被合并到了 master 分支上。
在创建分支后,需要使用 git checkout 明确地切换到该分支(或者可以使用 git checkout -b 一步创建新的分支并切换到该分支)。
如果您有不想丢失(或提交到当前分支)的更改,而是要将其放入其他分支中,请执行以下操作:
git add -A
git stash
git checkout <other branch>
git stash pop

有关 git stash 的更多信息可在 git-scm.com 上找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接