为什么一个分支中的更改在另一分支中可见?

Rom*_*man 5 git git-add git-commit

我执行以下命令序列:

git init rep
cd rep/
echo '111' > 1.txt
git add 1.txt 
git commit -m '1'
git checkout -b dev
echo '222' > 1.txt 
git checkout master
more 1.txt 
Run Code Online (Sandbox Code Playgroud)

作为这些命令的结果,我看到了

222
Run Code Online (Sandbox Code Playgroud)

而且我不明白为什么。如您所见,我创建并进入'dev'分支。我在那里做了一些更改,但是我没有添加也不提交它们。从“ dev”回到“ master”后,为什么还能看到我在“ dev”中所做的更改?在我添加,提交并将它们合并回master之前,他们不应该留在dev中吗?

小智 14

当您在不同分支之间移动时,所有未跟踪的文件都不会受到影响。由于它们属于您的文件系统,GIT 不知道这些文件属于哪个分支。所以当你提交这些文件时,GIT 知道哪些文件属于哪个分支。并且可以根据您的分支在工作区中删除或添加文件。


sme*_*ung 13

这是因为您没有将更改提交到分支 dev。所以未提交的更改还没有绑定到父提交。

git checkout dev
git add .
git commit -m "changed 1.txt"
Run Code Online (Sandbox Code Playgroud)

如果要删除更改,请执行

git reset --hard master
Run Code Online (Sandbox Code Playgroud)

编辑

dev 和 master 分支指向相同的提交哈希。查看文件夹 .git/refs/heads 内部,这是分支存储在单独文件中的地方。内容是特定分支指向的提交哈希。所以分支只是一个指向提交的指针。

在您结帐 master 或 dev 的特定情况下,它们都指向同一个提交,因此该操作不会更改工作树。否则你会得到一个错误。现在尝试更改 dev 分支上的某些内容,然后您应该会收到错误消息git checkout master

  • 你的指示效果很好。现在,两个分支具有不同版本的文件,并且“dev”分支中所做的更改在主分支中不可见(正如我所期望的那样)。但是,我仍然不明白为什么我在“dev”中所做的更改迁移到“master”。未提交的更改是否应该消失或保留在原始分支中? (3认同)

HMS*_*HMS 8

正如其他人所指导的,要么提交您的更改,要么隐藏它们。一种简单的解决方案是在结帐前隐藏您的更改(即临时保存)。例子

git checkout -b dev
echo '222' > 1.txt 
git stash
git checkout master
# on return to dev, restore changes via following
git stash pop
Run Code Online (Sandbox Code Playgroud)

现在您处于文档的旧状态。