Мои старые коммиты git не отображаются в BitBucket, перезаписаны кем-то другим

#git #bitbucket

#git #bitbucket

Вопрос:

Я работаю над проектом с другим человеком, использующим git (на BitBucket)

Изначально у меня были мои коммиты:

 my_commit_4
my_commit_3
my_commit_2
my_commit_1
  

Теперь я пошел проверять BitBucket неделю спустя, и это показывает:

 his_commit_4
his_commit_3
his_commit_2
his_commit_1
  

his_commit_1 Включает в себя все коммиты my_commit_x , плюс некоторые из его собственных дополнений.

Я попытался просмотреть reflog , и у меня все еще есть мои коммиты локально. Я не могу извлечь из origin master , потому что я получаю следующую ошибку:

 From https://bitbucket.org/myaccount/myapp
 * branch            master     -> FETCH_HEAD
   1145d3e...fa3d2de master     -> origin/master  (forced update)
fatal: refusing to merge unrelated histories
  

Что именно произошло?

Есть ли способ заставить мои оригинальные коммиты снова отображаться в BitBucket?

Ответ №1:

У вас есть несвязанные истории, потому что, кем бы ни был другой человек, он удалил ваши коммиты полностью, заменив их все своими.

Вы можете удалить его коммиты и заменить их своими, взаимно. Вероятно, это не очень хорошая стратегия, но это вариант, при условии, что у вас есть разрешение на использование git push --force (которое он, должно быть, использовал, чтобы удалить ваши коммиты и заменить их своими).

Вы можете объединить, несмотря на несвязанные истории. Это может быть легко или сложно. Для объединения, несмотря на несвязанные истории, используйте git merge --allow-unrelated-histories . Git, по сути, добавит поддельный коммит непосредственно перед всеми своими коммит-ами и непосредственно перед всеми вашими коммит-ами, к которым подключаются все его и все ваши. Этот поддельный коммит полностью пуст. Следовательно, все файлы в его последнем коммите являются новыми, полностью созданными им; все файлы в вашем последнем коммите являются новыми, полностью созданными вами; и Git объединит эти файлы, взяв те файлы, которые уникальны для его коммита, и те файлы, которые уникальны для вашего коммита, и объявив конфликт слияния для всех оставшихся файлов, которые имеют одинаковое имя в обоих коммитах. Вам придется вручную объединить каждый из этих файлов.

Он может, конечно, затем использовать git push --force снова, чтобы отменить всю вашу работу. Вероятно, вам следует убедиться, что он этого не сделает.

В конечном счете, способ решить эту проблему — поговорить с ним и выяснить, почему он удаляет ваши коммиты. Вероятно, это непреднамеренно, но если это сделано намеренно, то нет технического решения: это политическая проблема.