.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.
- перейдите в ветви -- > создайте новую ветвь в Bitbucket. Назовите это, что вы хотите
- при создании ветви нажмите кнопку Сравнить (меню три точки в правом верхнем углу)
- на экране сравнить выберите Изменить источник и вставьте ссылку фиксации. Если это даст результат, то Вам ПОВЕЗЕТ. Выбрать ее.
- выберите пункт изменить назначение и измените его на новую ветку.
- вы должны иметь возможность просматривать разницу, видя все изменения, которые вы хотите внести.
- выберите объединить, если вы счастливы.
теперь вот Кикер. Если вставка этой ссылки фиксации на Шаге 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, неясна.
в любом случае, попробовать посмотреть и, надеюсь, вы найдете один из коммитов, которые вы хотите там. В противном случае потребуется дополнительная информация. Я бы также сделал копию вашего текущего репо, чтобы избежать головных болей, которые могут прийти с силой, доставляющей удаленное рефпространство.