Git 当从一个分支切换到另一个分支时,目标分支是否应该继承索引和更改的文件?

Git 当从一个分支切换到另一个分支时,目标分支是否应该继承索引和更改的文件?,git,Git,在Git中,我有一个实验分支(EXP-12)。我在那里做了一些更改,但我还没有准备好提交。我需要对master进行调整 我去找师父 可能有两种情况: 如果我在EXP-12上将更改包含到索引中,它们也将出现在主分支的索引中 如果在EXP-12上未将更改包含到索引中,则这些文件也将显示为未在主分支上提交的更改 我的问题是,我希望master和EXP-12上的所有内容都是分开的。我想在EXP-12上做一些“实验性”更改转到master>do changes on master>stage everyt

在Git中,我有一个实验分支(
EXP-12
)。我在那里做了一些更改,但我还没有准备好提交。我需要对master进行调整

我去找师父

可能有两种情况:

  • 如果我在
    EXP-12
    上将更改包含到索引中,它们也将出现在主分支的索引中
  • 如果在
    EXP-12
    上未将更改包含到索引中,则这些文件也将显示为未在主分支上提交的更改
  • 我的问题是,我希望master和
    EXP-12上的所有内容都是分开的。我想在EXP-12上做一些“实验性”更改转到master>do changes on master>stage everything for commit(
    git add-A
    )>commit>切换回EXP-12并继续实验。现在,如果我这样做,我在主分支的提交将包括在
    EXP-12
    上所做的所有更改


    这背后的逻辑是什么?还是我遗漏了什么?

    这个问题的经典解决方案是使用
    git stash
    ——当您在
    EXP-12上时,您可以执行以下操作:

    git stash save --keep-index "Some work-in-progress on EXP-12"
    
    。。。然后像往常一样将分支更改为master,做一些工作,再更改回来,并应用最新的存储:

    git checkout master
    
    [... do some stuff ...]
    
    git checkout EXP-12
    
    git stash pop
    
    但是,我个人更喜欢创建“正在进行的工作”提交,然后:

    • 使用git commit修改它
    • 将分支移回上一次提交,但将所有工作保留为未过时的更改:
      git reset HEAD^
    • 。。。或者使用
      git-rebase-i
      将几个正在进行的提交挤在一起

    与使用隐藏相比,创建实际提交的优势在于,您可以在任何提交上应用隐藏,而不仅仅是在保存它的提交上,而正常的提交会向前移动该分支,并与以前的提交绑定。

    非常感谢!!我仍然不明白为什么git会实现我上面描述的逻辑。对我来说,每个分支都应该是原子的,并与其他分支分开。我错了吗?事实上,我发现git的行为非常有用,特别是因为我经常开始进行更改,然后意识到我更喜欢在不同的(通常是新的)分支上提交这些更改。(如果签出一个分支会导致对您进行本地修改的文件进行更改,git不会允许您切换分支。)我想这只是因为,在您实际提交一些更改之前,它们可以“浮动”——提交是将它们记录在历史记录中的行为。好的。这很有帮助!谢谢你的帮助!!