2015-10-16 3 views
1

У меня есть одна ветвь («другая»), прикрепленная как поддеревка к другому («мастер»). Когда я выполняю сложение поддерева из «другого» в «мастер», он не удаляет файлы, которые были удалены в «другом».Почему git subtree merge не удаляет файлы?

шаги, чтобы воспроизвести на чистый репо:

$ touch master.txt 
$ git add master.txt 
$ git commit -m 'Initial master' 
[master (root-commit) e2f5ffd] Initial master 
1 file changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 master.txt 
$ git checkout --orphan other 
Switched to a new branch 'other' 
$ touch other.txt 
$ git add other.txt 
$ git status 
On branch other 

Initial commit 

Changes to be committed: 
    (use "git rm --cached <file>..." to unstage) 

     new file: master.txt 
     new file: other.txt 
$ git commit -m 'Initial other' 
[other (root-commit) 408ee95] Initial other 
2 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 master.txt 
create mode 100644 other.txt 
$ git checkout master 
Switched to branch 'master' 
$ git read-tree --prefix=other/ -u other 
$ git status 
On branch master 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

     new file: other/master.txt 
     new file: other/other.txt 
$ git commit -m 'Other subtreed' 
[master f9ba0db] Other subtreed 
2 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 other/master.txt 
create mode 100644 other/other.txt 
$ git checkout other 
Switched to branch 'other' 
$ git rm master.txt 
rm 'master.txt' 
$ git commit -m 'master.txt removed' 
[other 1feef18] master.txt removed 
1 file changed, 0 insertions(+), 0 deletions(-) 
delete mode 100644 master.txt 
$ git checkout master 
Switched to branch 'master' 
$ git merge --squash -s subtree --no-commit other 
Squash commit -- not updating HEAD 
Automatic merge went well; stopped before committing as requested 
$ git status 
On branch master 
nothing to commit, working directory clean 

Таким образом, после слияния удаляемого файла - нет ничего совершить. Это правильное поведение? И как сделать сливание с удаленными файлами?

ответ

1

Правильный способ объединить поддерево, чтобы иметь все слиты является:

git merge -s recursive -Xsubtree=other --no-commit other 

Таким образом, это не --squash и имеет немного другую форму (от мерзавца v2).

+0

Это не работает для меня, у меня есть файлы, которые были добавлены с помощью слияния поддерева, а позже после удаления ваша команда не удаляет их. Он правильно вводит остальные изменения – LovesTha