【问题标题】:Why are changes in one branch visible in another branch?为什么一个分支中的更改在另一个分支中可见?
【发布时间】:2018-05-08 08:35:48
【问题描述】:

我执行以下命令序列:

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 add 将更改暂存到索引中。 git commit 将索引中所有跟踪文件的快照作为提交。分支是指向提交的 ref。在您的情况下,更改仍在工作树中。分支还不知道他们。

标签: git git-commit git-add


【解决方案1】:

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

【讨论】:

  • 很容易忽略这一点——这很简单,但也很重要。谢谢!
  • 但 git 不应该警告你用 master 分支覆盖现有文件吗?
【解决方案2】:

这是因为您没有将更改提交到分支 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 时收到错误

【讨论】:

  • 您的指示效果很好。现在这两个分支具有不同版本的文件,并且在“dev”分支中所做的更改在 master 中不可见(正如我所习惯和预期的那样)。但是,我仍然不明白为什么我在“dev”中所做的更改会迁移到“master”。未提交的更改是不是应该消失或留在原始分支中?
  • @Roman 我已编辑问题以回答您的问题
【解决方案3】:

按照其他人的指导,要么提交您的更改,要么将它们存储起来。一种简单的解决方案是在结帐前存储您的更改(即临时保存)。例子

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

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

【讨论】:

    【解决方案4】:
    git checkout -b dev
    echo '222' > 1.txt 
    git checkout master
    

    您在上面几行中对1.txt 文件所做的更改不在任何分支上,因为它们没有被提交(它们甚至没有被添加到索引中)。

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

    【讨论】:

      【解决方案5】:

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

      git push origin [name_of_your_new_branch]
      

      【讨论】:

        【解决方案6】:
        1. git checkout branch2,您在哪里进行了修改。

        2. git add .

        3. git commit -m "message"

        4. git push -u origin branch2

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-12
          • 2018-01-07
          • 2020-06-03
          相关资源
          最近更新 更多