Нажмите, чтобы освоить коммит, сделанный на отдельной голове

Я хотел повторить изменения с предыдущего коммита.

Maxims-MacBook-Air:hellodebug.com maximveksler$ git log
commit 7f9dd753d39fd65b4272af713ef9c07a9f84f016
Author: Maxim Veksler <maxim@vekslers.org>
Date:   Sun Dec 28 09:12:17 2014 +0200

    Imagine a Supercomputer Helping You Fix Bugs Faster

commit 54561ed320633e72bb35a7ab668a9996e6ffca8f
Author: Maxim Veksler <maxim@vekslers.org>
Date:   Sun Dec 28 08:57:25 2014 +0200

    highcharts tweaks

commit d57144cbd004b3b9e893e8d50d7077634824ce9a
Author: Genady Okrain <genady@okrain.com>
Date:   Mon Dec 22 18:46:21 2014 +0200

    sash api

Поэтому я сломал его на 7f9dd753d39fd65b4272af713ef9c07a9f84f016 и решил убрать его с 54561ed320633e72bb35a7ab668a9996e6ffca8f

Maxims-MacBook-Air:hellodebug.com maximveksler$ git checkout 54561ed320633e72bb35a7ab668a9996e6ffca8f
Note: checking out '54561ed320633e72bb35a7ab668a9996e6ffca8f'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 54561ed... highcharts tweaks

Пока все хорошо, теперь давайте сделаем исправление.

Maxims-MacBook-Air:hellodebug.com maximveksler$ git commit -a -m'Back to not fucking it up'
[detached HEAD b5cb3e4] Back to not fucking it up

Но теперь мне нужно отодвинуть это назад в мастера и подняться. Здесь начинается грязная часть...

Maxims-MacBook-Air:hellodebug.com maximveksler$ git checkout HEAD
Maxims-MacBook-Air:hellodebug.com maximveksler$ git status
HEAD detached from 54561ed
nothing to commit, working directory clean
Maxims-MacBook-Air:hellodebug.com maximveksler$ git push
fatal: You are not currently on a branch.
To push the history leading to the current (detached HEAD)
state now, use

    git push origin HEAD:<name-of-remote-branch>

Maxims-MacBook-Air:hellodebug.com maximveksler$ git push origin HEAD:master
Warning: Permanently added 'github.com,192.30.252.131' (RSA) to the list of known hosts.
To git@github.com:maximveksler/hellodebug.com.git
 ! [rejected]        HEAD -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:maximveksler/hellodebug.com.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Правильно... теперь я застрял. Давайте попробуем еще несколько шуточных вещей

Maxims-MacBook-Air:hellodebug.com maximveksler$ git up
Fetching origin
Warning: Permanently added 'github.com,192.30.252.128' (RSA) to the list of known hosts.
You're not currently on a branch. I'm exiting in case you're in the middle of something.

Git Up не будет говорить с нами, это круто. В любом случае мне это не нужно.

Maxims-MacBook-Air:hellodebug.com maximveksler$ git checkout master
Warning: you are leaving 2 commits behind, not connected to
any of your branches:

  e9e202c no border
  b5cb3e4 Back to not fucking it up

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name e9e202c

Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

Какие? Нет! Вернись, коммиты, я люблю тебя.

Maxims-MacBook-Air:hellodebug.com maximveksler$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Потерял! Навсегда? Надеюсь нет..

Maxims-MacBook-Air:hellodebug.com maximveksler$ git reflog
7f9dd75 HEAD@{0}: checkout: moving from e9e202c4703939064e099b735ceeb6b78dc7933a to master
e9e202c HEAD@{1}: commit: no border
b5cb3e4 HEAD@{2}: commit: Back to not fucking it up
54561ed HEAD@{3}: checkout: moving from master to 54561ed320633e72bb35a7ab668a9996e6ffca8f
7f9dd75 HEAD@{4}: commit: Imagine a Supercomputer Helping You Fix Bugs Faster
54561ed HEAD@{5}: commit: highcharts tweaks

ОК, так что они где-то в дикой природе, но как мне их вернуть? Пока рано говорить до свидания.

ПОМОГИТЕ?

4 ответа

Если исправление будет достаточно быстрым, я сделаю это снова, но другим способом, начиная с вашего плохого коммита

git reset --hard HEAD^ # brings your entire master branch and working copy back to where it worked
git reset origin/master # brings your HEAD pointer back to origin/master but leaves your working copy with the working code
# fix code
git commit -a -m'try to not fuck it up'
git push

Другим способом было бы отменить плохой коммит, четко показать, что он плохой, и затем исправить его

git revert HEAD^
# fix code
git commit -a -m'better code this time'
git push # pushes two commits, the revert and the new code

Если вы хотите сохранить код, который вы уже получили, на отдельной голове, вы сможете cherry-pick это в обоих потоках выше, вместо исправления кода, просто git cherry-pick b5cb3e4,

Удачи.

Чтобы перенести изменения, сделанные на отдельном HEAD, в origin/master (или в другую ветку), попробуйте:

git push origin HEAD:master

Если вы получили предупреждение, убедитесь, что вы в курсе происхождения (вы можете сначала попробовать его). Хотя, если вы вносите поправки в коммиты или уверены, что ваши изменения самые последние, вы можете применить их с силой (-f/--force). Это не рекомендуется, если вы не знаете, что делаете (например, перебазирование).

Вы можете объединить вверх по течению master ветвь с -s ours стратегия (или -s theirs когда ты на хозяине). Таким образом, вы не нарушаете историю (как git reset --hard или перебазировать операции), но сохранить рабочее дерево.

Этот метод особенно полезен, когда один git revert не достаточно (например, когда есть слияния между хорошей и восходящей ветвью).

Так как вы уже нажали совершить 7f9dd753d39fd65b4272af713ef9c07a9f84f016 Я бы порекомендовал сделать git revert,

Сначала оформите своего хозяина и сделайте

git revert 7f9dd753d39fd65b4272af713ef9c07a9f84f016

Это создает новый коммит поверх master который отменяет изменения, внесенные в 7f9dd753,

Теперь извлеките исправление, которое вы сделали как новую ветвь (Вы можете увидеть идентификатор коммита в reflog e9e202c HEAD@{1}: commit: no border)

git checkout -b myFix e9e202c 

Перебазировать myFix изменения на master,

git rebase master

Вернитесь к master и перенести его на перебазированный myFix ветка.

git checkout master
git merge myFix

Теперь вы можете удалить myFix ответвление и толкать master,

git branch -D myFix
git push origin master
Другие вопросы по тегам