【问题标题】:GIT lets me checkout another branch with uncommitted changes, and alters files in that branch [duplicate]GIT让我签出另一个未提交更改的分支,并更改该分支中的文件[重复]
【发布时间】:2017-11-04 23:08:18
【问题描述】:

展示事件顺序的 GIF

我创建了一个分支foo,更改了一个文件,然后在不提交更改的情况下签出master。 GIT 让我进行结帐,然后进行修改。

我提交此更改。

切换回分支foo,更改一个文件——巧合的是,它与master 中的版本相同——然后不提交更改,我签出master。这次我收到一个错误“错误:您对以下文件的本地更改将被结帐覆盖:index.html 请提交您的更改或存储它们,然后才能切换分支。中止”

造成这种不一致行为的原因是什么?

【问题讨论】:

  • 答案有点偏离主题,这是重复的,所以我不会添加任何答案,但长话短说:masterfoo 指向相同的提交和您在测试中的更改。在foomaster 之间切换时,txt 不会与任何其他更改发生冲突,因此您可以切换并保留更改。
  • @ThibaultD。我不明白为什么我不能切换第二次。案例 #1:master 中没有未提交的更改,切换到 foo,更改文件,切换回 master。案例 #2:master 中没有未提交的更改,切换到 foo,更改文件,不会让我切换回 master。有什么不同?
  • 因为现在foomaster 不再指向同一个版本。此外,master 有一个更新的提交,包括对文件 test.txt 的更改,这与您在 test.txtwhile on 分支 foo 中未跟踪的更改冲突。 Git 只会帮助您合并已提交的更改,因此它不能也不会尝试解决由未处理的更改引起的冲突。
  • 在分支之间切换时,您不应该有未提交的更改。考虑一个事实,您实际上可以在分支之间切换作为一个例外。此例外要求两个分支共享一个共同的祖先,并且没有未提交的更改与您要签出的分支上的后续更改发生冲突。

标签: git


【解决方案1】:

由于master 获得了您的第一次提交,将另一个活动更改从foo 移动到master 将被阻止作为故障安全条件。如果您在 foo 中提交您的第二次更改,那将不是问题。

但是,作为一种更好的方法,我建议您将 foo 重新设置为 master 以使其相同,而不是尝试进行相同的修改。

【讨论】:

  • “将主动更改移动到 master 将被阻止作为故障安全条件”但这就是没有发生的情况。我在一个单独的分支 (foo) 中,我进行了更改,然后签出了 master。我没有收到任何警告,更改丢失在 foo 中,更改出现在 master(未提交)中。我第二次做了完全相同的事情:切换到单独的分支 (foo),进行更改,然后结帐 master。这次我收到警告。每种情况下的步骤都是相同的。
  • 即使您在foo 中进行了更改,在您提交之前,您的更改也是可移动的。所以你在技术上对master 分支进行了更改。它首先没有冲突,因为您的更改依赖于完全相同的内容。但是,第二次,您从 git 的角度开始使用不同的文件。
【解决方案2】:

这是对分支的作用及其工作方式的误解。

您签出一个分支,对与该分支相关的文件进行更改,但您没有在该分支中提交该更改。您所做的更改在您的 中未提交的文件空间。这意味着,只要您的文件不与另一个分支冲突,Git 将允许您随身携带未提交的更改。

如果将文件添加到索引中,则在切换分支时应该会收到这样的消息:

M   foo

这意味着文件foo被修改了,这是你的视觉提示。

现在您已经切换回另一个分支,并且您编辑了具有相同内容的同一个文件,Git 无法跟踪这一点,因为您并没有真正告诉它这样做。在 Git 的想法中,您已经为同一个文件创建了两个完全不同的修订版,这会导致冲突。

我的建议:

  • foo 分支中提交更改
  • 将更改合并到master

既然你处于这种状态……

  • 将 master 重新定位到 foo 以确保它们的历史记录一致

【讨论】:

  • “您签出一个分支,对与该分支相关的文件进行更改,但您没有在该分支中提交该更改。”这正是我第一次做的事情,当时它让我这样做了。第一次执行步骤(签出 Foo、编辑文件、不提交、签出 master)和第二次执行完全相同的步骤有什么不同是完全不明显的。我知道如何避免它,当然。但我不知道它为什么会发生,这意味着我不懂 GIT,这似乎与这个工具的课程相当。
【解决方案3】:

这不是不一致的行为。这是 GIT 非常期待的,它只是抱怨它试图将 test.txt 文件合并到它失败的主文件。

这明明是投诉please commit your changes while switiching to another branch.

建议在我们的本地分支中提交更改。当您切换分支时,如果您能够跟踪几个文件的更改就可以了,如果有 20 个文件呢?在这种情况下,最好提交更改并切换到另一个分支。

当您切换到另一个分支时,未提交的更改文件,而不是新文件。只有您在一个分支中更改的文件才会合并到另一个分支。

在这里,您将 text.txt 文件合并到 master 分支并在那里提交。后来你去了分支 Foo 并编辑了文件,你没有在本地分支中提交文件,你切换了分支,它没有让你这样做。由于更改,您无法跟踪。


建议是将更改提交到本地分支。

git checkout -b foo
echo random > test.txt
git add test.txt
git commit -m "random commit"
git rebase master
git checkout master
git merge foo

你已经完成了。

【讨论】:

  • “你去了分支 Foo 并编辑了文件,你没有在本地分支中提交文件,你切换了分支,它没有让你做”这就是我第一个做的时间也是,确切地:我去了分支 foo,我编辑了文件,我没有提交文件,我切换了分支。它让我做到了。我第二次对同一个文件重复这些相同的步骤时,它并没有让我这样做。那是不一致的。显然,根据 Makato 的回复,这是因为 GIT 如何检测 /test.txt 是从一个分支到另一个分支的同一文件的一些实现细节。
猜你喜欢
  • 2018-12-19
  • 2019-03-17
  • 2019-05-20
  • 2016-06-04
  • 2022-08-18
  • 2010-10-08
  • 2013-06-08
  • 2016-09-15
相关资源
最近更新 更多