Как это возможно в Git, что файлы молча теряются между 2 коммитами? - PullRequest
2 голосов
/ 10 мая 2019

Я и коллега столкнулись с этим сценарием в Git, где файлы пропадали между 2 коммитами, но мы не видим никакого вида «пути удаления / файла / файла в режиме 100644».Основываясь на моем понимании Git, я не понимаю, как это возможно.

Вот упрощенная информация трассировки.Дайте мне знать, если какой-либо дальнейший вывод поможет расследованию, и я с радостью добавлю.

Мы нашли 2 последовательных коммита в одной ветви:

git log --oneline

Это дает:

enter image description here

Примечание 1423249 и 341c603.Теперь я проверю каждый из этих коммитов, чтобы показать, что один файл примера (их больше) присутствует в предыдущем коммите 341c603, но отсутствует в следующем коммите 1423249.

341c603

➜ git checkout 341c603
Note: checking out '341c603'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 341c603 v0.1.230
➜ git log  --stat --summary --  app/components/BreadcrumbNav/index.js
commit f88f71e4bec82a004626d2e1326bb1a1544675b3
Author: panguoliang <panguoliang@dae.org>
Date:   Wed May 8 13:31:05 2019 +0800

    ADD fiat module

 app/components/BreadcrumbNav/index.js | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
 create mode 100644 app/components/BreadcrumbNav/index.js
➜ ls -l  app/components/BreadcrumbNav/index.js
-rw-r--r--  1 wang.boyang  staff  888 May 10 10:10 app/components/BreadcrumbNav/index.js

Это есть в 341c603.Он был создан в старом коммите.Теперь переходим к 1423249

1423249

➜ git checkout 1423249
Previous HEAD position was 341c603 v0.1.230
HEAD is now at 1423249 fix websocket, subscribe to current symbol
➜ git log --stat --summary --  ./app/components/BreadcrumbNav/index.js
(empty output)
➜ ls -l  app/components/BreadcrumbNav/index.js
ls: app/components/BreadcrumbNav/index.js: No such file or directory

Его там нет!Итак, каковы изменения в 1423249?Был ли удаленный файл app/components/BreadcrumbNav/index.js удален в 1423249?

➜ git show --stat 1423249

commit 1423249134941968692d2094c64369017838d393 (HEAD)
Author: Wang Boyang <boyang@dae.org>
Date:   Thu May 9 12:59:59 2019 +0800

    fix websocket, subscribe to current symbol

 .eslintrc.js                       |   2 ++
 .prettierrc                        |  14 ++++++---
 app/containers/BarBox/actions.js   |  24 ++++++--------
 app/containers/BarBox/constants.js |   8 ++---
 app/containers/BarBox/index.js     |  22 ++++++-------
 app/containers/BarBox/reducer.js   |  18 ++++-------
 app/containers/BarBox/saga.js      |  20 ++++++------
 app/containers/BarBox/selectors.js |   5 ++-
 app/containers/BarBox/styles.js    |   5 ++-
 app/containers/TradePage/index.js  | 116 ++++++++++++++++++++++++++++----------------------------------------
 10 files changed, 102 insertions(+), 132 deletions(-)

Абсолютно нет изменений, связанных с отсутствующим файлом, app/components/BreadcrumbNav/index.js.Итак, что происходит?

Редактировать

Ниже приведен упрощенный вывод из git log --graph:

*   commit 47750dc0059d503dcd73de767fe9a1914070b6b9
|\  Merge: d1a0f6e 2115249
| | Author: justinji <justin5562587@gmail.com>
| | Date:   Thu May 9 17:40:01 2019 +0800
| | 
| |     resolve conflicts
| |   
| *   commit 2d8835e30a9a27f9eec687de573e4a77e66ed69a
| |\  Merge: 324857a 341c603
| | | Author: Wang Boyang <boyang@dae.org>
| | | Date:   Thu May 9 13:06:22 2019 +0800
| | | 
| | |     Merge remote-tracking branch 'origin/test' into test
| | | 
| | * commit 341c60334919930ee5f731cae3660c80aefb2ca1
| | | Author: panguoliang <panguoliang@dae.org>
| | | Date:   Thu May 9 12:03:01 2019 +0800
| | | 
| | |     v0.1.230
| | | 
| | |   
| | *   commit 66eaf470248a01b6d7861f1b319335255363195c
| | |\  Merge: 5ec1650 63e528b
| | | | Author: panguoliang <panguoliang@dae.org>
| | | | Date:   Thu May 9 12:00:48 2019 +0800
| | | | 
| | | |     lint
| | | | 
| | * | commit 9f8b93645851d98b1ab08264de8700a0e0dff47c
| | | | Author: panguoliang <panguoliang@dae.org>
| | | | Date:   Thu May 9 11:58:41 2019 +0800
| | | | 
| | | |     ADD Fiat deposit
| | | | 
| | | | 
| * | | commit 1423249134941968692d2094c64369017838d393
| | | | Author: Wang Boyang <boyang@dae.org>
| | | | Date:   Thu May 9 12:59:59 2019 +0800
| | | | 
| | | |     fix websocket, subscribe to current symbol
| | | |   
| * | |   commit 6d2c1073689140b75758d0e008af183340f1842b
| |\ \ \  Merge: f730698 63e528b
| | | |/  Author: Wang Boyang <boyang@dae.org>
| | |/|   Date:   Thu May 9 10:39:23 2019 +0800
| | | |   
| | | |       Merge remote-tracking branch 'origin/test' into test
| | | | 

Выводы: в (и после) коммит слияния 2d8835e30a9a27f9eec687de573e4a77e66ed69a, файлы потеряны.вывод cat-файла:

➜ git cat-file commit 2d8835e30a9a27f9eec687de573e4a77e66ed69a
tree a46f997a76ff403d1ec0567913722787d72bf9f6
parent 324857aa9a26852a2c5699650366ac7797a85ac2
parent 341c60334919930ee5f731cae3660c80aefb2ca1
author Wang Boyang <boyang@dae.org> 1557378382 +0800
committer Wang Boyang <boyang@dae.org> 1557378382 +0800

Merge remote-tracking branch 'origin/test' into test

Edit2

Инструмент difflame дает следующий вывод:

➜ ~/Projects/difflame.py 341c603 2d8835e30a9a27f9eec687de573e4a77e66ed69a -- app/components/BreadcrumbNav/index.js
Processing line 48/48
diff --git a/app/components/BreadcrumbNav/index.js b/app/components/BreadcrumbNav/index.js
deleted file mode 100644
index bf18d9d..0000000
--- a/app/components/BreadcrumbNav/index.js
+++ /dev/null
@@ -1,41 +0,0 @@
    341c603: v0.1.230
-341c603 (panguoliang 2019-05-09 12:03:01  1  ) /**
-341c603 (panguoliang 2019-05-09 12:03:01  2  )  *
-341c603 (panguoliang 2019-05-09 12:03:01  3  )  * BreadcrumbNav
-341c603 (panguoliang 2019-05-09 12:03:01  4  )  *
-341c603 (panguoliang 2019-05-09 12:03:01  5  )  */

Есть ли способ узнать почему слияние было сделано таким образом (т.е. удаление файлов), чтобы его можно было избежать в будущем?

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Если ревизии идут одна за другой (их не видно ... они могут быть в двух разных ветвях, потому что вы не указали --graph), тогда git show --name-status 1423249 должен показывать файлы как удаленные.

PS, учитывая, что ревизии на самом деле находятся в двух отдельных ветвях, это означает, что возможное удаление могло произойти на любом из предков двух ревизий ... или что не было никакого реальногоудаление вовлечено.Это зависит от истории двух веток (у общего предка могут отсутствовать два файла, в одной из ветвей они все еще отсутствуют, они были добавлены в другую ветку .... в этом сценарии удаление не производится).

0 голосов
/ 10 мая 2019

Все комментарии и ответы чрезвычайно полезны.В конце концов я выяснил, почему.

Прежде всего, как упомянуто @meagar, удаление файла просто представлено файловым блобом, а не снимком коммита.Как оказалось, файлы исчезли во время слияния.

При любом нормальном слиянии, когда сталкиваешься с двумя родителями, где один добавил файл, а другой нет, он бы намекнул и, скорее всего, добавил файл или показалконфликт как modified in XXXX but deleted in XXX.

Этот не сделал.Потому что я ошибаюсь в следующем 2:

git merge -s recursive -X ours

git merge -s ours

Последний просто игнорирует других родителей.Таким образом, изменения оттуда ушли.После этого все работает не так, как ожидалось, и удаление файлов ошибочно сохраняется

...