如何在“git checkout”上更新工作目录?

时间:2011-10-26 11:47:00

标签: git git-branch git-checkout

考虑以下“故事”:

$ mkdir my_project
$ cd my_project
$ git init
Initialized empty Git repository in /home/misha/misha/my_project/.git/

$ echo "first line" > hello.txt
$ git add hello.txt
$ git commit -m "first commit"
[master (root-commit) 9c913a1] first commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 hello.txt

$ git branch new_feature
$ git checkout new_feature
Switched to branch 'new_feature'
$ echo "second line" >> hello.txt
$ cat hello.txt
first line
second line

$ git checkout master
M    hello.txt
Switched to branch 'master'
$ cat hello.txt
first line
second line

为什么hello.txt在分支上有两行? (我认为git checkout会将工作目录恢复到之前的状态,即hello.txt只有一行。)

幕后实际发生在git checkout工作目录上的情况是什么?如何更新?

4 个答案:

答案 0 :(得分:16)

您的git checkout to master可以防止您丢失未提交的更改。这就是为什么你的hello.txt文件中还有第二行的原因。如果您确实想要丢失未提交的更改,则必须使用-f参数。

最后,您的结帐将如下所示:

git checkout -f master

答案 1 :(得分:2)

Git checkout(松散地)将使用指定的提交中的存储库内容更新工作副本。您的new_feature分支没有您添加到文件中的第二行(因为您还没有提交它)。现在,这个额外的行只是工作副本中未经修改的更改,它将被添加到您提交它的分支中。

答案 2 :(得分:0)

如果已将第二行添加到new_feature中,Git将按预期方式签出。 未提交的更改通常会阻止检出,但此处是合并。

答案 3 :(得分:0)

Git checkout 不会替换文件系统中的文件。 Git checkout 会更改您所在的分支。 更改分支不会更改文件系统上的内容。 我喜欢认为这棵树看起来像这样:

  1. 远程仓库
    1.a.大师
    1.b.功能
  2. 本地仓库
    2.a.大师
    2.b.功能
  3. 未提交的代码/文件系统

结帐 -> 在 a 和 b 之间切换

Pull -> 将当前分支中未同步的新东西从 1 复制到 2

push -> 从当前分支的新东西从 2 复制到 1

提交 -> 将新的东西从 3 复制到 2