2017-01-09 9 views
1

Я работал над веткой, и случайно я сделал git reset HEAD~1, потому что думал, что я перезагружу свой последний коммит.Как вернуть программный сброс Git?

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

develop branch: commitA -> commitB -> commitC 

my branch: commitA -> commitB -> myCommit 

Есть ли способ, чтобы вернуть эти изменения и вставить commitC перед моим совершить?

+0

'мерзавец фиксации -a -s -c ORIG_HEAD', но она не будет включать в себя добавленных файлов, вы должны запустить 'git ad d ... <список файлов> ... 'заранее. – 0andriy

ответ

2

Вы можете увидеть свое рабочее дерево на git reflog. Сначала вернитесь к commitC и заберите свой myCommit наверху git log стек. Затем просто обновите удаленный доступ.

$ git reflog 
# copy the commit-hash of 'commitC' 

$ git checkout <commitC-hash> 
$ git reflog 
# copy the 'myCommit-hash' 

$ git cherry-pick <myCommit-hash>   # take the 'commitC' top 
$ git checkout -b 'new-my-branch'   # create 'new-my-branch' from current stage 

# Replace 'my-branch' with 'new-my-branch' 
$ git branch -D my-branch     # delete 'my-branch' 
$ git checkout -b my-branch    # create new 'my-branch' from 'new-y-branch' 
$ git push -f origin HEAD     # replace remote/my-branch by local/my-branch 
+0

Это слишком далеко от простого решения, которое вы можете предложить. – 0andriy

0

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

Я не знаю точно, что вы сделали на месте, чтобы в конечном итоге с отраслевыми схемами вы показали нам, но я думаю, что вы можете просто перебазировать свой филиал на отдалении develop тянуть в commitC, а затем повторить свой myCommit на нем:

git fetch origin   # bring origin/develop up to date 
git checkout develop  # checkout local develop branch 
git rebase origin/develop # rebase your local branch on the remote one 

Теперь вы должны быть в состоянии просто быстро вперед удаленного филиала через:

git push origin develop 
+0

Слишком сложно. 'git rebase --onto origin/develop HEAD ~ 1' – 0andriy

+0

@ 0andriy Вы говорите, что мой ответ слишком сложный, когда тот, кто получает upvotes, является более сложным. Кроме того, я не думаю, что нам нужно «rebase -onto» здесь. –