我的同事是如何设法让git checkout移动文件的呢?

时间:2011-12-22 23:36:24

标签: git

通常在你:

  1. git checkout foo
  2. 修改文件
  3. git checkout bar
  4. Git会告诉您,由于您未提交修改,因此无法更改分支。 (我没有在我面前的确切信息,但这是有效的)。然后,您通常会使用git stash来摆脱这些修改,并且您正在快乐地进行。

    我的同事(他是Git的新手,因此不是故意做任何先进的事情)没有这种行为。在她的机器上,当她git checkout bar时,它只会将她在foo上所做的修改移动到bar。这对我来说非常困惑,因为我已经使用Git至少一年了,从未见过它的行为。

    我的同事可能做了什么才能让Git简单地在分支之间移动未添加/未提交的修改文件,而不是抱怨并要求git stash

2 个答案:

答案 0 :(得分:4)

(我刚刚在这里为同事们写了以下文字,他们是Git的新手。希望有所帮助。)

如果您对分支A上的文件进行了更改并希望切换到分支B(这是不相关的),那么最好先将更改提交到分支A.这样,当您稍后再回到它时,更改仍将在分支A上。 (另一种选择称为“存储”,在某些情况下很有用 - 有关详细信息,请参阅http://schacon.github.com/git/git-stash.html。)

如果您不先提交更改,则可能会出现两种情况。考虑一个文件“file.txt”,分支A和B.两种情况是:

  1. 分支A和分支B上的最新版本的file.txt是相同的。在这种情况下,“git checkout B”将在成功切换到分支B后将对file.txt的更改继承到您的工作目录。这对于更改平台配置文件等内容非常有用。 Git将在“git checkout”命令的输出中列出以这种方式传输的文件。
  2. 分支A和分支B上的最新版本的file.txt是不同的。当您要求将分支切换到分支B时,git将拒绝切换分支,因为这样做会覆盖对file.txt的更改。您将从git收到一条消息,说您必须首先提交(或存储)冲突的文件。
  3. 如果您有多个已更改的文件,则情境(2)中的任何文件都将阻止分支切换。

    最后,如果要放弃对文件的修改,请使用“git checkout - file.txt”之类的命令。这将丢弃对file.txt的任何未提交的修改,并将其从当前分支恢复为最新提交的版本。

答案 1 :(得分:2)

“正常”实际上是你同事看到的。当您的工作目录中有一些修改并切换到另一个分支时,更改也将在该分支上可用。

当您收到无法切换的消息时,您所在的分支机构和您要切换的分支机构已经发生分歧(相对于在工作目录中修改的文件)只要您是分支机构在工作目录中修改的文件之间切换具有相同的版本,您将能够切换分支。

测试:

git init .
touch a
git add a
git commit -m "adding a"
git branch temp
vi a #add something
git checktout temp # allows you to change
git commit -am "content in a"
vi a #add more content
git checkout master #won't allow you to change!