当我切换分支时,为什么git merge会自动更改?

时间:2010-08-20 18:04:42

标签: git

我刚开始使用git进行分支,我对切换分支的行为感到有点困惑。遵循以下步骤:

git init
Initialized empty Git repository in /Users/mads/Desktop/testing/.git/

echo 'hello a' > a.txt
echo 'hello b' > b.txt
git add *.txt
git commit -m "Initial commit"
[master (root-commit) 1ab870f] Initial commit
 2 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 a.txt
 create mode 100644 b.txt

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

git branch new_feature
git checkout new_feature
Switched to branch 'new_feature'

ls
a.txt   b.txt

echo "hello c" > c.txt
git add c.txt 

echo "hello a, new version" > a.txt

git status
# On branch new_feature
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   c.txt
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   a.txt
#

git commit -m "Added new feature"

[new_feature 1ccda31] Added new feature
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 c.txt

git checkout master
M   a.txt
Switched to branch 'master'

cat a.txt 
hello a, new version

为什么a.txt上的更改会在结帐时自动拉入主服务器?这不是'合并'的目的吗?我想在一个分支上工作,然后切换到另一个分支......

3 个答案:

答案 0 :(得分:6)

修改后你从未运行git add a.txt。 Git不会自动跟踪您对文件所做的更改,甚至也不会跟踪您已添加到存储库的文件。 (例如,这与SVN不同)如果您希望对更改进行版本控制,则每次更改时都必须明确git add每个文件。

或者,您可以使用-a选项git commit,它会自动添加并提交对git已经跟踪的文件所做的任何更改。因此,与svn commit最接近的是git commit -a

答案 1 :(得分:3)

您没有在提交中添加a.txt,因此它仍然是经过修改的工作文件。当您结帐主数据时,它不想覆盖您的更改,因此您的工作目录中仍然存在对a.txt的更改。

答案 2 :(得分:2)

您遇到的问题是未提交更改。

M a.txt 就是你再次检查主人的意思。

如果您执行 commit -a 而不是仅提交,它将提交所有已更改的文件。或者,您必须添加要提交的所有已更改文件。

如果一切都正确提交,你会发现分支机构已经很好地隔离了。