繁体   English   中英

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

[英]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]
  1. git checkout branch2 ,您在其中进行了修改。

  2. git add .

  3. git commit -m "message"

  4. git push -u origin branch2

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM