[英]Why are changes in one branch visible in another branch?
我执行以下命令序列:
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”返回到“master”后,我确实看到了我在“dev”中所做的更改? 在我添加、提交并将它们合并回 master 之前,它们不应该留在 dev 中吗?
当您在不同分支之间移动时,所有未跟踪的文件都不会受到影响。 由于它们属于您的文件系统,GIT 不知道这些文件属于哪个分支。 所以当你提交这些文件时,GIT 知道哪些文件属于哪个分支。 并且可以根据您的分支在工作区中删除或添加文件。
这是因为您没有将更改提交到分支 dev。 所以未提交的更改还没有绑定到父提交。
做
git checkout dev
git add .
git commit -m "changed 1.txt"
如果要删除更改,请执行
git reset --hard master
编辑
dev 和 master 分支指向相同的提交哈希。 查看文件夹 .git/refs/heads 内部,这是分支存储在单独文件中的地方。 内容是特定分支指向的提交哈希。 所以分支只是一个指向提交的指针。
在您结帐 master 或 dev 的特定情况下,它们都指向同一个提交,因此该操作不会更改工作树。 否则你会得到一个错误。 现在尝试在 dev 分支上更改一些东西,然后当git checkout master
时你应该得到一个错误
正如其他人所指导的,要么提交您的更改,要么隐藏它们。 一种简单的解决方案是在结帐前隐藏您的更改(即临时保存)。 例子
git checkout -b dev
echo '222' > 1.txt
git stash
git checkout master
# on return to dev, restore changes via following
git stash pop
现在您处于文档的旧状态。
git checkout -b dev
echo '222' > 1.txt
git checkout master
您在上面1.txt
行中对1.txt
文件进行的更改不在任何分支上,因为它们没有提交(它们甚至没有添加到索引中)。
Git 分支只是一个指向提交的指针。 当您将分支从dev
更改为master
时,实际上并没有更改当前检出的提交。 这就是为什么 Git 不需要更新工作树中1.txt
的索引或内容的原因。
同样的事情发生在我身上,但添加和提交文件没有帮助。 然后我发现在使用checkout -b
在本地创建分支后,我还必须远程推送分支:
git push origin [name_of_your_new_branch]
git checkout branch2
,您在其中进行了修改。
git add .
git commit -m "message"
git push -u origin branch2
检查本地存储库,您将仅在branch2
看到修改,而在 master 分支中看不到。 您的主分支将不受影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.