我不了解清楚的蠢货。 这就是我得到:
git branch (outputs that I'm on master)
git checkout -b foo
echo "next line" >> file (file is an existing file)
git add file (stages)
git checkout master
git status (shows that file has "next line" and is staged!!)
git commit (commits the changes that were staged on branch foo!!)
git checkout foo
这里是踢球。 FOO现在不显示已在工作目录,或上演文件进行任何更改。
如此看来 - 你做任何修改,包括修改文件和分期,发生在所有分支机构。 当你承诺一个具体的分支,这些变化被丢弃的,除非你犯的一个所有其他分支。
这实际上是怎么回事? 有人可以使这个道理给我? 这听起来像完全扭曲行为,显然我没有得到的设计理念,使这是一个明智的做法。
编辑明显的例子:
$ mkdir element
$ cd element
$ git init
Initialized empty Git repository in /home/dan/element/.git/
$ echo "one" >> one
$ git add one
$ git commit -m msg
[master (root-commit) 36dc8b0] msg
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 one
$ git checkout -b fire
Switched to a new branch 'fire'
$ echo "next line" >> one
$ git checkout master
M one
Switched to branch 'master'
$ cat one
one
next line
$
这公然从混帐亲书此相矛盾:
This is an important point to remember: Git resets your working directory to look like the snapshot of the commit that the branch you check out points to. It adds, removes, and modifies files automatically to make sure your working copy is what the branch looked like on your last commit to it.
不要紧,你当你添加一个文件,只有当你提交它基于哪一个分支。 所以,如果你这样做:
git add file
git checkout master
git commit
你已经犯下的文件到主分支。
这里有一个完整的例子,具有输出。 我们先从一个新的版本库:
$ git init
Initialized empty Git repository in /home/lars/tmp/so/repo/.git/
在这一点上,我们的master
分支,我们还没有添加任何文件。 让我们添加一个文件:
$ date > file1
$ cat file1
Fri May 11 13:05:59 EDT 2012
$ git add file1
$ git commit -m 'added a file'
[master (root-commit) b0764b9] added a file
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 file1
太好了,我们现在有一个分支( master
)与一个承诺。 让我们创建新的分支:
$ git checkout -b foo
Switched to a new branch 'foo'
$ git branch
* foo
master
$ ls
file1
现在,我们将添加一行到file1
。
$ date >> file1
$ git status
# On branch foo
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: file1
#
no changes added to commit (use "git add" and/or "git commit -a")
这表明该文件已被修改,但尚未上演。 我们的舞台文件并提交:
$ git add file1
$ git commit -m 'made a change'
[foo 761bed9] made a change
1 files changed, 1 insertions(+), 0 deletions(-)
并重新运行git status
:
$ git status
# On branch foo
nothing to commit (working directory clean)
在这一点上,该文件是这样的:
Fri May 11 13:05:59 EDT 2012
Fri May 11 13:07:36 EDT 2012
如果我们切换回master
分支,我们将看到没有第二行的文件的早期版本:
$ git checkout master
Switched to branch 'master'
$ cat file1
Fri May 11 13:05:59 EDT 2012
对文件的更改被隔离到其所犯下的分支。
在更新后的例子,这个...
$ git checkout master
......因为在这一点上,在这两个“一”的版本不产生错误master
和fire
是相同的。 在工作目录的更改将同样适用于任一版本。