Git GUI + GitHub, изменить последний коммит проблематично, как быстро его преодолеть?

Проблема на git gui ПРОТИВ github (когда я пытаюсь нажать исправленный коммит, созданный с git gui).

Много раз, вместо того, чтобы быстро нажимать, я просто код больше.
Когда я иду, чтобы совершить и нажать с помощью git guiИногда я выбираю "Изменить последний коммит", чтобы повторно использовать сообщение коммита в git gui,

Когда я помню, что это взаимодействие (git gui vs GitHub) все испортит, я скопирую комментарий в опции "ammend last commit", снова выберу "new commit" и вставлю комментарий.
Но сейчас я забыл, и я снова в таком беспорядке... GitHub не позволяет мне выдвигать исправленный коммит, он хочет, чтобы я сливал вещи без необходимости (потому что коммит ammend должен работать, а просто нет). Так что теперь мои исходные файлы испорчены (требуются слияния, с этими тегами слияния по всему, что предотвращает компиляцию), и есть как 20 испорченных файлов...

У меня нет предыдущей резервной копии.
Таким образом, я мог бы мучительно получить свой предыдущий коммит каким-то образом (используя некоторую командную строку git)... но я предполагаю, что есть некоторый прямой способ переписать измененные файлы, чтобы позволить ручное слияние с моими последними правильными изменениями.

Я единственный, кто передает файлы, так что это git gui по сравнению с GitHub ошибка или ограничение наверняка.

Резюме:
1) делать коммит, коммит, коммитить...
2) изменить последний коммит (это может вызвать проблемы или нет)
3) сделать git pull (он может создавать теги слияния, портящие файлы, не компилируемые, требующие разрешения конфликта игл)

От @VonC ответа git log --graph --oneline --decorate --allВилка кажется очень ясной:

* d8f3505 (HEAD, master) improving savable helper
| * 772a6c0 (origin/master, origin/HEAD) improving savable helper
|/  
* 15630f3 improving savable helper

или же

* fdc9ae1 (HEAD, master) improving savable helper
| * 772a6c0 (origin/master, origin/HEAD) improving savable helper
|/  
* 15630f3 improving savable helper

Итак, мои последние изменения в d8f3505 или fdc9ae1 (я восстановил резервные копии, чтобы повторить попытку, поэтому такое число изменилось).

эта команда сохраняет теги слияния, поэтому не компилируется: git reset origin/master

эта команда git reset --hard HEAD@{1} восстанавливает изменения на 772a6c0, поэтому я теряю последние (у меня еще есть резервная копия).

Итак, как сделать последнюю версию (d8f3505 или fdc9ae1 или другую новую, как только я восстановлю резервную копию), которая будет побеждать / перезаписывать ГОЛОВУ?

РЕДАКТИРОВАТЬ:
с помощью git reset --hard 12eb50c (новый идентификатор) позвольте мне восстановить последние изменения без тегов слияния, отлично!

но теперь, после git rebase origin/master (это снова портит файлы, но теперь у меня было время сделать резервную копию файлов, в ситуации, когда нет тестов...), я получаю это сообщение от git gui: введите описание изображения здесь
после того как я приму это, толчок изнутри git gui перестал работать, но командная строка git push дает мне это сообщение:

To https://USER@github.com/USER/PROJECT.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://USER@github.com/USER/PROJECT.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration variable
hint: to 'simple', 'current' or 'upstream' to push only the current branch.

не может нажать даже после git reset --hard 15630f3... если бы я мог удалить все, что после этого, и просто перезаписать мои резервные копии источников...

1 ответ

Решение

Выбрав изменить последний коммит, вы фактически переписали свой HEAD вместо создания нового коммита (который был бы передан в GitHub без проблем)

 --o--o (origin/master)
    \
     -O (HEAD: your amended commit)

Поскольку история теперь другая, GitHub (или любое удаленное Git-репо) хочет, чтобы вы сначала извлекли и объединили, а затем выдвинули.

Чтобы это исправить, поскольку содержание в O хорошо для вас, а сам коммит - нет, вы можете:

  • сбросить ГОЛОВУ на origin/master, но сохраняя ваше текущее рабочее дерево

    git reset origin/master
    
  • добавить и зафиксировать оттуда: это должно добавить вашу работу в качестве нового коммита.

Оттуда, вы можете нажать новый коммит без каких-либо проблем (ускоренная перемотка вперед)

В качествеальтернативы:

Узнайте, каковы ваши последние изменения с:
git log --graph --oneline --decorate --all (это будет верхний, а не раздвоенный)

Тогда сделайте это, напр.: reset --hard fdc9ae1 и сделайте резервную копию ваших восстановленных последних изменений источников.

затем git checkout master а также git reset --hard HEAD@{1}

Это потребует git pull до git push, сделайте это, теги слияния появятся снова...

Замените его резервной копией, и теперь вы можете снова нажать правильно.

Другие вопросы по тегам