Я хотел получить больше опыта в git, поэтому я решил поэкспериментировать самостоятельно.
Я в основном хотел увидеть различное поведение между слиянием и перебазированием, когда дело доходит до перемещения / удаления / редактирования файлов.
Итак, я создал структуру файла, например:
├── a
│ ├a.txt
│ ├aa.txt
├── b
│ ├b.txt
│ ├bb.txt
├── c
│ ├c.txt
│ ├cc.txt
Содержимое каждого .txt
- это просто имя файла.Затем я сделал три ветви
MoveATXT
DeleteATXT
EditATXT
В каждом из них я соответственно переместил / удалил / отредактировал файл a.txt
, находящийся в / a. Для перемещения я переместил /a/a.txt
в /b/a.txt
Все перемещение / удаление было сделанопо командам git git rm
git mv
Поведение git merge
было тем, что я ожидал и понял.Это было git rebase
, которое меня очень смутило.
Когда я сделал новую ветку BranchOne
, я решил сначала git rebase MoveATXT
, который прошел нормально, и движение появилось.Затем я решил git rebase DeleteATXT
, здесь все стало странно для меня.
Сначала он дал мне распечатку того, что было не так.Это было в значительной степени то, что я ожидал.
First, rewinding head to replay your work on top of it...
Applying: Move a.txt to b/
Using index info to reconstruct a base tree...
A a/a.txt
Falling back to patching base and 3-way merge...
CONFLICT (rename/delete): a/a.txt deleted in HEAD and renamed to b/a.txt in Move a.txt to b/. Version Move a.txt to b/ of b/a.txt left in tree.
error: Failed to merge in the changes.
Patch failed at 0001 Move a.txt to b/
Use 'git am --show-current-patch' to see the failed patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Однако, когда я сделал git status
$ git status
rebase in progress; onto 7a2c06d
You are currently rebasing branch 'test' on '7a2c06d'.
(fix conflicts and then run "git rebase --continue")
(use "git rebase --skip" to skip this patch)
(use "git rebase --abort" to check out the original branch)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: a/aa.txt -> b/aa.txt
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)
added by them: b/a.txt
Это сообщает мне, что a/aa.txt
было перемещено в b/aa.txt
Более того, когда я ls
показал мне, что a/
отсутствует
$ ls
b/ c/
Когда я проверяю b/
Он имеет оба a.txt
`aa.txt
$ ls b/
a.txt aa.txt b.txt bb.txt
Почему это происходит?Я никогда не двигался a/aa.txt
Почему Git перемещает это для меня?Почему каталог a/
был удален?