2010-08-20 2 views
0

Я новичок в ветвях в git, и меня немного смущает поведение на ветвящихся ветвях. Последующие шаги:Почему git merge изменяется автоматически при переключении ветвей?

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 автоматически переходят в master при оформлении заказа? Разве это не цель «слияния»? Я думал, что работа на ветке, а затем переключение на другую будет изолировано ...

ответ

6

Вы не запускали git add a.txt после его модификации. Git автоматически не отслеживает изменения, внесенные вами в файлы, даже в файлы, которые вы уже добавили в репозиторий. (Например, это отличается от SVN). Каждый раз при каждом изменении вы должны указывать git add каждый файл, если вы хотите, чтобы изменения были версией.

В качестве альтернативы вы можете использовать опцию -a для git commit, которая автоматически добавит и зафиксирует любые изменения, внесенные в файлы, которые git уже отслеживает. Так что самое близкое к svn commit будет git commit -a.

3

Вы не добавили a.txt к вашему фиксации, поэтому он по-прежнему является модифицированным рабочим файлом. Когда вы проверяете мастер, он не хочет перезаписывать ваши изменения, поэтому изменение в a.txt все еще существует в вашем рабочем каталоге.

2

Проблема, с которой вы сталкиваетесь, заключается в том, что изменение не было совершено.

Это то, что M a.txt означает, что вы снова проверили хозяина.

Если вы делаете commit -a, вместо того, чтобы совершать транзакции, он будет передавать все измененные файлы. Кроме того, вам необходимо добавить все измененные файлы, которые вы хотите совершить.

Если все правильно сделано, вы увидите, что ветви хорошо изолированы.

Смежные вопросы