【问题标题】:What happens to changed files when I switch Git branches?当我切换 Git 分支时更改的文件会发生什么?
【发布时间】:2016-12-17 05:10:13
【问题描述】:

尽管使用 Git 已经有一段时间了,但我仍然无法理解它的分支机制。特别是,考虑一个新项目foo,其中包含一个由这些简单命令初始化的文件bar.txt

$ mkdir foo
$ cd foo
$ git init
$ touch bar.txt
$ git add .
$ git commit -m 'Initial commit'

现在当我创建一个分支foobargit branch 显示我仍在master

$ git branch foobar
$ git branch
  foobar
* master

但是当我对文件bar.txt进行更改时:

$ echo quux >> quux.txt
$ git status
modified: quux.txt

然后当我签出另一个分支时,我可以看到文件bar.txt 也已在那里修改:

$ git checkout foobar
$ git status
modified: quux.txt

我已经知道这种行为允许我选择要将更改提交到哪个分支,但我觉得这很烦人。我怀疑我无法理解 Git 分支背后的基本思想。有没有办法告诉 git,当我对 master 进行更改时,我不希望它们在我可能选择结帐的任何其他分支中可见?

【问题讨论】:

  • 我的问题是,为什么我会因此而削弱 git?为什么当我结帐分支b 时,我在分支a 中所做的更改是可用的,这是一个好主意。这是什么理想的功能?
  • 因为需要做什么和应该提交到哪个分支是两个独立的问题。

标签: git sh


【解决方案1】:

在您提交之前,您在工作目录中所做的更改不会成为任何分支的一部分。因此,您出错的地方是认为当您签出分支然后修改文件时,您已经“在分支上”进行了修改。你还没有这样做,你已经修改了工作目录。

因此,您有一个基于一个分支的脏工作目录,然后您签出另一个分支 - 未提交的更改保留在工作目录中,否则它们将不会保存在任何地方。您将无法再次签出第一个分支并重新出现本地更改。

在切换分支之前,您可能想要做的是git stash。这会将本地更改保存到临时分支,您可以稍后使用git stash pop 来返回。

【讨论】:

  • git stash popgit stash apply 的同义词吗?
  • 否; git stash pop 只是丢弃stash 的顶部项目。但是,您可以将git stash drop 视为git stash apply + git stash pop(如果应用成功)。
  • 我认为是另一种方式:pop = apply + drop
【解决方案2】:

如果签出影响dirty 的文件,通常不允许切换分支。在您的情况下,对文件的修改不会影响 foobar 的检出。如果要签出的分支的本地修改文件中有更改,则签出将中止。没有在切换分支时为单个分支保留修改文件的概念。如果您不想在签出foobar时进行这些本地修改,您有以下几种可能:

  • stash save您的更改并清除您的本地修改。这允许在您切换回 master 时重新应用更改。 (git stash save --include-untracked 也捕获新的和尚未暂存的文件)
  • reset --hard 你当前的分支到HEAD 在签出之前(当然会丢弃更改)
  • checkout -f foobar 也丢弃本地更改(与重置相同)。

【讨论】:

    【解决方案3】:

    您可以使用stash 来存储暂存/未提交的更改:

    git stash
    

    现在您可以使用新的工作目录切换分支:

    git branch master
    git status
    # On branch master
    nothing to commit, working directory clean
    

    应用隐藏的更改:

    git branch foobar
    git stash apply
    

    【讨论】:

    • 当我执行git stash 时,新创建/删除的文件是否也会被隐藏(未创建/取消删除)?
    • 这适用于 --include-untracked 但你需要注意不要错过这个。见git-scm.com/docs/git-stash(保存)
    • @BorisStitnicky 是的,他们做到了!他们git stash apply --index 从这些命令中获得相同的原始输出。
    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2014-04-15
    相关资源
    最近更新 更多