我是Git的新手。它似乎是一个非常棒的非线性工作流程,基于有向无环图。
git checkout
<branch>
要准备工作,请通过更新索引切换到它 和工作树中的文件,并将HEAD指向分支。 保留对工作树中文件的本地修改,以便 他们可以致力于
<branch>
。
我有两个分支:
这两个分支都很干净,最新。
我这样做了:
git checkout dev
<change a tracked file>
git checkout master
然后我收到了这个错误:
错误:您对以下文件的本地更改将被覆盖 结帐时: readme.txt请在切换分支之前提交更改或存储它们。中止
这与文档的大胆部分有冲突吗?
感谢所有评论和回复。我可以理解Git避免数据丢失的良好意图。我只是想指出一个潜在的文档模糊/错误。
答案 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 commit
或git 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