.git: извлечение и применение коммитов удаленной ветви

у меня есть некоторые старые изменения, которые я сделал, совершил и нажал на удаленное (bitbucket) РЕПО. Эти изменения не были объединены ни с какой другой ветвью. Сама ветка была удалена локально и из удаленного РЕПО.

но, как я вижу в bitbucket web, коммиты, включенные в удаленную ветку, все еще там (в репо). Я много гуглил, но не нашел способа, как получить совершает удаленных филиала от удаленных. Единственное, что я могу сделать, это увидеть их в bitbucket web и получить sha фиксации там.

Я видел несколько примеров, таких как

git checkout <sha>

или

git checkout -b <branch-name> <sha>

но всегда получите следующую ошибку

fatal: reference is not a tree: <sha>

Итак, возможно ли и как я могу получить (извлечь) эти коммиты из удаленной ветви, ветви ящика из них, объединить, чтобы освободить ветвь?

UPD:

чтобы быть более конкретным, я создал РЕПО, новую ветку, сделайте фиксацию в этой ветке ne и удалите ветку:

РЕПО https://github.com/yurybond/stackowerflow-rocks

ссылка на (автономную) фиксацию из удаленной ветви https://github.com/yurybond/stackowerflow-rocks/commit/a1c1540abd453773b3ce6445d01e51ad336bbe84

вопрос все тот же: как восстановить фиксацию (a1c1540abd453773b3ce6445d01e51ad336bbe84), которая принадлежит удаленной ветви?

6 ответов


вы можете вручную загрузить отсутствует совершает в mbox форматировать и применять их вручную с помощью git am. Для пример:

  • github (репозиторий, с которым вы связаны):

      $ wget https://github.com/yurybond/stackowerflow-rocks/commit/a1c1540abd453773b3ce6445d01e51ad336bbe84.patch && git am a1c1540abd453773b3ce6445d01e51ad336bbe84.patch
    
  • gitlab:

      $ wget https://git.weboob.org/weboob/devel/commit/bba7e1b8ffb0743b57f202cf9cdb43fda209fa43.patch && git am bba7e1b8ffb0743b57f202cf9cdb43fda209fa43.patch
    
  • bitbucket:

      $ wget https://bitbucket.org/Kasreyn/linux-3-9-rc3-moxart/commits/434e8f69db2c3effdc8741139adb722a68dfcccd/raw -O 434e8f69db2c3effdc8741139adb722a68dfcccd.patch && git am 434e8f69db2c3effdc8741139adb722a68dfcccd.patch
    

обратите внимание, что git am не только применять текстовый патч, но и воссоздать всю фиксацию на текущем отделение.

если вы удалили ветку из удаленного репозитория, нет способа получить его обратно с удаленного reposityr. Однако,обычно вы по-прежнему возможно, удастся восстановить удаленную ветку локально благодаря git reflog. Увидеть следующее образец.

во-первых, создать "голый" репозиторий:

$ git init
Initialized empty Git repository in /tmp/reflog-test/.git/

добавить file и создать новую фиксацию на master отрасли:

$ touch file
$ git add .
$ git commit -m 'Initial commit'
[master (root-commit) 81fc76d] Initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file

переключиться на новую ветку творчески названный new-branch:

$ git checkout -b new-branch
Switched to a new branch 'new-branch'

изменить file и сохранить изменения:

$ echo new-branch >> file
$ git commit -am 'commit on new-branch'
[new-branch 9c457c6] commit on new-branch
 1 file changed, 1 insertion(+)

вернуться в master:

$ git checkout -
Switched to branch 'master'
$ git branch
* master
  new-branch

удалить new-branch

$ git branch -D new-branch
Deleted branch new-branch (was 9c457c6).

его нет:

$ git branch
* master
$ git log new-branch
fatal: ambiguous argument 'new-branch': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

однако вы все равно должны иметь возможность ссылаться на фиксацию:

$ git show --stat 9c457c6
commit 9c457c69de8a54376a2614ca8cfc0f515c64676c
Author: Arkadiusz Drabczyk <adrabczyk@bigcorp.com>
Date:   Tue Apr 3 10:43:49 2018 +0200

commit on new-branch

 file | 1 +
 1 file changed, 1 insertion(+)

хотя его нельзя найти ни на одной ветке. Следующая команда ничего не возвращает:

$ git branch --contains  9c457c6

Reflog показывает все действия один сделал в репозитории:

$ git reflog
dbc721a HEAD@{0}: checkout: moving from new-branch to master
9c457c6 HEAD@{1}: commit: commit on new-branch
dbc721a HEAD@{2}: checkout: moving from master to new-branch
dbc721a HEAD@{3}: commit (initial): Initial commit

как вы видите, он также имеет 9c457c6 совершить мы сделали на new-branch. Только когда reflog истек, и сборщик мусора запускается 9c457c6 становится недостижимым:

$ git reflog expire --expire=all  --all
$ git gc --prune=now
Counting objects: 3, done.
Writing objects: 100% (3/3), done.
Total 3 (delta 0), reused 0 (delta 0)
$ git show 9c457c6
fatal: ambiguous argument '9c457c6': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

по умолчанию reflog записи истекают через 90 дней и git gc запускается автоматически после некоторых команд, поэтому, если вы удалили ветку сравнительно недавно, вы должны быть в состоянии восстановить его.


Если эта фиксация действительно существует в репозитории Bitbucket, вы можете объединить ее в другую ветвь с помощью веб-интерфейса Bitbucket.

  1. перейдите в ветви -- > создайте новую ветвь в Bitbucket. Назовите это, что вы хотите
  2. при создании ветви нажмите кнопку Сравнить (меню три точки в правом верхнем углу)
  3. на экране сравнить выберите Изменить источник и вставьте ссылку фиксации. Если это даст результат, то Вам ПОВЕЗЕТ. Выбрать ее.
  4. выберите пункт изменить назначение и измените его на новую ветку.
  5. вы должны иметь возможность просматривать разницу, видя все изменения, которые вы хотите внести.
  6. выберите объединить, если вы счастливы.

теперь вот Кикер. Если вставка этой ссылки фиксации на Шаге 3 не удалась, вам не повезло. Это означает, что фиксация не существует ни на удаленном, ни на локальном компьютере.

Если вы ненавидите навигацию и хотите прямой ссылка на сравнение (будет сравнивать с master, хотя):https://bitbucket.org/<user>/<repository>/branches/compare/<commit-reference>..master


Ну, потому что вы удалили ветку локально, вы не можете восстановить ее с помощью sha-1, как предлагали все остальные.

также reflog не работает на удаленной стороне(плюс он также удаляется с удаленной стороны.

Это оставляет вам один из двух вариантов. Либо напишите в поддержку Bitbucket, чтобы они восстановили то, что вам нужно.

или попробуйте предложение Майкла здесь:восстановление удаленной ветви с пульта ДУ на Bitbucket (git)

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


Я ничего не видел в переполнении стека о проверке фиксации, которая была удалена. Тем не менее, должно быть возможно выполнить жесткий сброс к удаленной фиксации через:

git checkout -b some_new_branch
git reset --hard <SHA-1 of deleted commit>

это сбросит ветку some_new_branch к удаленной фиксации, и, возможно,этого достаточно для продолжения.

Я предполагаю, что удаленные коммиты, которые вы видите в системе Bitbucket из reflog. Если да, то вы также должны иметь возможность просматривать удаленные коммиты via:

git reflog

Если вы не см. удаленные коммиты, тогда это также может объяснить ошибку, которую вы имеете. В этом случае, если удаленные коммиты действительно существуют только на Bitbucket, вам понадобится другой способ добраться до них.


если вы все еще видите фиксацию в Bitbucket(не в недавнем действии), то фиксация все еще доступна из какой-либо ветви или тега. Ты можешь бежать!--0--> чтобы получить последнюю версию этих ссылок, и эта конкретная фиксация также будет загружена, если она не существует в локальном репозитории. Однако ошибка fatal: reference is not a tree: <sha> означает sha не совершал. Это, наверное, самый большой двоичный объект. Если вы найдете правильный совершал, git checkout <commit> или git checkout -b <branch-name> <commit> должны работать.


есть ли в ветке какие-либо теги? Причина, по которой ветвь появится на bitbucket, но не будет извлечена с помощью команды fetch, неясна.

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