git - 如果文件应该被删除,“git rm”是对“我们删除”的规范响应吗?
问题描述
让我们考虑一下这个简短的 git 场景:
(master)>echo 1 > a.txt
(master)>git add a.txt
(master)>git commit -m "Commit 0"
(master)>git checkout -b b
(b)>git rm a.txt
(b)>git commit -m "Deleted a.txt"
(b)>git checkout master
(master)>echo 2 > a.txt
(master)>git commit -am "Modified a.txt"
(master)>git checkout b
(b)>git merge master
CONFLICT (modify/delete): a.txt deleted in HEAD and modified in master. Version master of a.txt left in tree.
Automatic merge failed; fix conflicts and then commit the result.
此时的状态是:
(b|MERGING)>git status
On branch b
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add/rm <file>..." as appropriate to mark resolution)
deleted by us: a.txt
我解决这个问题的方法是git rm a.txt
. 这会给我我需要的东西,但是,这是处理这个问题的方法吗?换句话说,是否有一种更具表现力的方式(比如 git merge accept_delete)来处理这个问题?
(git checkout a.txt --ours
不起作用,因为our
旁边不存在 a.txt)
解决方案
git rm
是我的首选方法。不过, Git 本身并不关心你如何产生结果。它只关心您将正确的分辨率放入索引中。让你的工作树也反映你的索引通常很好,但 Git 并不关心这一点:这只是为了你自己的理智。
在这种特定状态下,文件a.txt
出现在索引槽 1 和 3 中,而不是索引槽 2 中a.txt
。槽 1 中的版本是从合并库中获取的副本。插槽 3 中的版本是从master
. 这个master
版本也a.txt
出现在工作树中。
使用:
rm a.txt
git add a.txt
将a.txt
首先从工作树中擦除,然后从索引槽 1 和 3 中擦除它,在索引中根本没有留下任何a.txt
内容,这是您想要的状态。但更简单:
git rm a.txt
将从工作树和索引槽 1 和 3 中擦除a.txt
,产生完全相同的结果。
Git关心的只是索引中的内容。零槽条目中的文件——你可以用 来查看它们git ls-files --stage
,尽管如果你有很多文件,打印出来的文本量会让人望而生畏——将在下一次提交中。插槽 1、2 和/或 3 中的文件处于“冲突”状态。这些需要在 之前清除git commit
,否则任何其他提交的内容都可以继续进行。
两者都git add
删除git rm
冲突状态条目,因此任何一种方法都可以,但是对于git add
不存在的文件对我来说感觉很奇怪-对于这种情况,您必须先将其删除,然后才感觉很奇怪。
推荐阅读
- javascript - 循环中的异步调用延迟
- python - 将包含其他列表和字典的列表转换为熊猫数据框
- javascript - PrimeNG p-table header 选择所有具有延迟加载和分页的持久性
- reactjs - 失败的道具类型:提供给“查询”的“数组”类型的无效道具“孩子”,预期的“功能”
- kubernetes - 是否可以在没有 PVC 的情况下直接安装 PV?
- c# - C# .NET - 是否有一种简单的方法可以通过单个 ZIP 文件中的 XML 文件集合查询相同的 XML 节点?
- php - PHP:来自xml的希腊字符串转换为ascii并且没有比较
- azure-devops - 未定义变量时如何优雅地使管道失败
- javascript - 如何写入父选项卡的localStorage而不是弹出窗口?
- python-3.x - 在 Keras 中使用功能 API 检查模型输入时出错