git checkout<分支>本地更改失败

时间:2016-05-26 03:19:21

标签: git

我是Git的新手。它似乎是一个非常棒的非线性工作流程,基于有向无环图。

根据git checkout doc

  

git checkout <branch>

     

要准备工作,请通过更新索引切换到它   和工作树中的文件,并将HEAD指向分支。   保留对工作树中文件的本地修改,以便   他们可以致力于 <branch>

我有两个分支:

  • dev的

这两个分支都很干净,最新。

我这样做了:

git checkout dev
<change a tracked file>
git checkout master

然后我收到了这个错误:

  

错误:您对以下文件的本地更改将被覆盖   结帐时:           readme.txt请在切换分支之前提交更改或存储它们。中止

这与文档的大胆部分有冲突吗?

ADD

感谢所有评论和回复。我可以理解Git避免数据丢失的良好意图。我只是想指出一个潜在的文档模糊/错误。

5 个答案:

答案 0 :(得分:3)

您对readme.txt进行了更改,这一切都很好。

然后你要求Git将当前分支从dev更改为master,这也没关系,除了一个问题。

Git将dev的提示提交与master的提示提交进行了比较,发现readme.txt在这两个提交中有所不同。因此,为了切换提交,它“希望”删除当前readme.txt并将其替换为master之外的版本。

但是您对readme.txt进行了更改。如果Git删除readme.txt并将其替换为master中的版本,则您的更改将被销毁。

如果Git切换到master readme.txt获取master的不同版本,那可能没问题,但是没有编程来执行此操作。因此,您必须先将更改移开,然后才能切换,然后您可以随意恢复更改。使用git commitgit stash提供两种不同的方法来执行此操作。

(如果您更改了其他一些文件,或者两个提交中readme.txt都相同,Git可能或肯定不会遇到此问题,并且可能或肯定会切换您当前的分支。 )

答案 1 :(得分:2)

不,不是真的。如果切换分支,通常会保留本地更改,但在这种情况下的问题是您要检出的分支(主)对同一文件有其他更改。这些更改将覆盖您的本地更改。因此,它建议提交或存储。

答案 2 :(得分:0)

readme.text在当前分支中被修改。此文件在两个分支上都会更改。 您应该提交并将此文件推送到当前分支。

  

git add readme.text

     

git commit -m“您的留言”

     

git push <current branch>

并检查git status以查看文件更改。然后,结帐到另一个分支。

  

git checkout <another branch>

答案 3 :(得分:0)

是的,确实文档有点令人困惑。如果您将新文件添加到主分支然后检出开发分支,而不是更改跟踪文件,您将看到您在master中所做的本地更改(添加到工作树中的新文件)将保留,因为文档建议。

  

git checkout dev

     

触摸<some_new_file>

     

git checkout master

Master检出并且没有错误,ls在工作目录中显示some_new_file

如果修改了属于两个分支头部的文件,git会抛出错误。

  

git checkout dev

     

<change a tracked file>

     

git checkout master

会在结帐前提交或存储本地更改时出现错误

这是因为如果git只是从dev分支中检出文件,则可以覆盖本地未提交的更改。

当您向master添加一个新文件希望提交到主分支但尚未准备好并且必须仅检查dev分支以发现您的工作目录是dev的文件和您打算提交给master的文件。

为了避免这种混淆,建议在签出新分支之前存储,提交或放弃所有更改。

答案 4 :(得分:0)

这里的重点是git checkout的过程:

  • 仅删除当前分支中的文件,而不删除目标分支中的文件

  • 仅在目标分支中添加文件

因此,在您的情况下,既不保留dev也不包含master的文件。所以

  

对工作树中文件的本地修改

真正是指对工作树中文件的本地修改,而不是两次提交之间的切换。否则git无法完成结帐。

另外,重要的是要意识到git在签出时通过哈希决定git是否决定两个文件是否相同:

kakakali@cyber:/mnt/d/gitest$ git init
Initialized empty Git repository in /mnt/d/contents/test/gitest/test/.git/
kakakali@cyber:/mnt/d/gitest$ touch a.txt
kakakali@cyber:/mnt/d/gitest$ echo 'hi'>a.txt
kakakali@cyber:/mnt/d/gitest$ git add .
kakakali@cyber:/mnt/d/gitest$ git commit -m '.'
[master (root-commit) fab2485] .
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt
kakakali@cyber:/mnt/d/gitest$ git branch dev
kakakali@cyber:/mnt/d/gitest$ git checkout dev
Switched to branch 'dev'
kakakali@cyber:/mnt/d/gitest$ touch b.txt
kakakali@cyber:/mnt/d/gitest$ git add .
kakakali@cyber:/mnt/d/gitest$ git commit -m 'dev'
[dev d7613e8] dev
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 b.txt
kakakali@cyber:/mnt/d/gitest$ git checkout master
Switched to branch 'master'
kakakali@cyber:/mnt/d/gitest$ mv a.txt c.txt
kakakali@cyber:/mnt/d/gitest$ git checkout dev
D       a.txt
Switched to branch 'dev'
kakakali@cyber:/mnt/d/gitest$ ls
b.txt  c.txt