2016-09-11 2 views
1

Рассмотрим следующие шаги:разъяснения по мерзавца вернуться и перебазироваться

git init 
touch foo.txt 
git add . 
git commit -m 'initial commit' 

Теперь мы создадим новую ветку и добавить файл с именем foo2.txt:

git checkout -b new_branch 
touch foo2.txt 
git add . 
git commit -m 'added foo2.txt' 

Теперь мы вернитесь к главной ветке и верните начальную фиксацию, которую мы сделали (обратите внимание: вы можете узнать хеш фиксации «initial commit» с помощью команды git log).

git checkout master 
git revert <commit hash of initial commit> 

На данный момент у нас нет ни foo.txt, ни foo2.txt в главной ветке. Теперь, давайте объединить new_branch освоить

git merge new_branch 

На данный момент, foo2.txt теперь объединены в мастера, но foo.txt не существует.

Итак, вопрос в том, как мне вернуть foo.txt в мастер? Я пробовал сделать это:

git rebase new_branch 

Но это не возвращает его. Итак, в общем случае, если мы вернем фиксацию на master, тогда нам нужно объединить другую ветку назад к master, как бы мы вынудили ее перенести все «отсутствующие» файлы (foo.txt в этом примере)?

Единственным обходным решением, которое я нашел, было довольно радикально, было удаление мастера и переименование new_branch для освоения.

ответ

1

Сделайте новую фиксацию, чтобы вернуть foo.txt. Вы можете либо git revert <revert commit>, либо git cherry-pick <init commit>, либо добавить foo.txt вручную и совершить.

или удалите <revert commit> из истории. Сброс master на <add foo2 commit> через git reset <add foo2 commit> --hard. Его также можно было сделать через git rebase --onto <init commit> <init commit> <add foo2 commit>, но он заканчивается на detached HEAD state, поэтому вам нужно сбросить master на эту новую головку.

+0

Можете ли вы прояснить, как это сделать: «так что вам нужно сбросить мастер на этот новый HEAD», может быть, с примером? – dcp

+1

@ dcp 'git branch -D master, git branch master' или записать текущий SHAD1 HEAD и' git checkout master, git reset --hard'. – ElpieKay

+0

Благодарим вас за полезную информацию и показываем различные способы сделать это в git, действительно хороший ответ. – dcp

1

Вы можете восстановить foo.txt с помощью git cherry-pick с хешем первоначальной фиксации.

git revert добавляет фиксацию, которая удаляет строки, добавленные первоначальной фиксацией, когда вы rebase new_branch на master, все изменения, сделанные в этой ветке, применяются после этого возврата.

Смежные вопросы