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

Git 为什么一个分支中的更改在另一个分支中可见?,git,git-commit,git-add,Git,Git Commit,Git Add,我执行以下命令序列: 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 由于这些命令,我看到 222 我不明白为什么。如您所见,我创建并进入“dev”分支。我在那里做了一些更改,但我不添加也不提交它们。为什么在从“dev”返回到“master”

我执行以下命令序列:

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 
由于这些命令,我看到

222

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

这是因为您没有将更改提交到分支dev。因此,未提交的更改尚未绑定到父提交

如果要删除更改,请执行以下操作:

git reset --hard master
编辑

dev和master分支指向同一个提交散列。查看一下.git/refs/heads文件夹,分支存储在不同的文件中。内容是特定分支指向的提交散列。因此,分支只是指向提交的指针

在您签出master或dev的特定情况下,它们都指向相同的提交,因此该操作不会更改工作树。否则你会得到一个错误。现在尝试在dev分支上更改一些内容,那么当
git checkout master

git checkout -b dev
echo '222' > 1.txt 
git checkout master
您在上面几行中对
1.txt
文件所做的更改不在任何分支上,因为它们没有提交(甚至没有添加到索引中)


Git分支只是指向提交的指针。当您将分支从
dev
更改为
master
时,实际上您没有更改当前签出的提交。这就是为什么Git不需要更新工作树中
1.txt的索引或内容。

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

按照其他人的指导,提交或隐藏更改。一个简单的解决方案是在签出之前隐藏更改(即临时保存)。范例

git checkout -b dev
echo '222' > 1.txt 
git stash
git checkout master
# on return to dev, restore changes via following
git stash pop

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

同样的事情发生在我身上,但添加和提交文件没有帮助。然后我发现,在使用
checkout-b
本地创建分支后,我还必须远程推送分支:

git push origin [name_of_your_new_branch]
  • git签出分支2
    ,您在那里进行了修改

  • git添加。

  • git提交-m“消息”

  • git推送-u原点分支2


  • 检查本地存储库,您将只在
    branch2
    中看到修改,而不会在主分支中看到修改。您的主分支将不受影响。

    您的指示很有效。现在,这两个分支具有不同版本的文件,并且在“dev”分支中所做的更改在master中不可见(正如我习惯和预期的那样)。然而,我仍然不明白为什么我在“dev”中所做的更改迁移到“master”。未提交的更改不应该消失或保留在原始分支中吗?@Roman我编辑了这个问题以回答您的问题。更改是在工作树中进行的
    git add
    将更改阶段化到索引中
    git commit
    将索引中所有跟踪文件的快照作为提交。分支是指向提交的引用。在您的情况下,更改仍在工作树中。分支机构还不知道他们的情况。很容易忽视这一点——这很简单,但也很重要。非常感谢。但是git不应该警告您使用来自master branch的文件覆盖现有文件吗?
    git push origin [name_of_your_new_branch]