Как повторно зафиксировать прошлый коммит, если кто-то перезаписал мой коммит - PullRequest
0 голосов
/ 05 сентября 2018

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

Кто-то получил конфликт слияния, и во время слияния он потерял все мои изменения. Я не знаю, что он сделал, но моих изменений нет. В истории мой коммит есть, но если я вижу выше его слияния, мои изменения отменяются.

Теперь я не могу отменить его коммит слияния, потому что он содержит много файлов по сравнению со мной, и я не хочу менять каждый файл один за другим вручную. Есть ли способ вернуть мои изменения, не влияя на изменения других.

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Вы можете сделать это, набрав следующие команды:

$ git reflog

затем выберите идентификатор коммита, который вы хотите получить.

Затем введите следующую команду:

$ git cherry-pick <'ID'>

Вместо <'ID'> введите идентификатор из вышеуказанного журнала.

Тогда у вас будут изменения этого коммита.

Теперь проверьте, осталось ли что-нибудь еще:

$ git status

Если что-то находится в неустановленном коммите, добавьте его с помощью следующих команд и подтвердите:

$ git add -A //Any other option or the name of the file with the path that you want to commit
$ git commit -m "Your message here for that commit"
$ git push

Надеюсь, этого ответа вы ожидаете.

0 голосов
/ 05 сентября 2018

Самый простой способ исправить это обычно, как Code_Ninja предложил , использовать git cherry-pick для повторной фиксации ваших изменений. Обычно метод, рекомендованный Venkataraman R , не работает, потому что Git скажет вам, что объединять нечего. (Если это работает, это тоже нормально.) Точные детали зависят от ситуации. Для потомков давайте рассмотрим наиболее распространенный способ, которым это происходит.

Кто-то получил конфликт слияния, и во время слияния он потерял все мои изменения.

Это очень легко сделать для "кого-то". Давайте дадим «кому-то» имя; давайте назовем его Карл Беспечный. Карл бежит:

git merge carls-feature

или, возможно, даже:

git pull

(хотя я рекомендую любому новичку, например, здесь, Карлу, избегать git pull - лучше, если он запустит git merge напрямую, чтобы он мог понять, что он делает).

В любом случае, Карл теперь видит это:

Auto-merging somefile.ext
CONFLICT (content): Merge conflict in somefile.ext

Бедный Карл паникует, ищет в Интернете (возможно, даже StackOverflow) советы, а не смотрит, скажем, Как разрешить конфликты слияния в Git , 1 Карл просто запускается :

git checkout --ours somefile.ext
git add somefile.ext
git commit

Карл только что уничтожил твою работу!

Помните, цель объединения - объединить работы. Git попытается сделать это самостоятельно, но иногда Git не может завершить процесс самостоятельно. В этих случаях Git останавливается и получает помощь от оператора-человека.

Этот человек-оператор - вы , если вы тот, кто находится в конфликте слияния! - полностью, на 100% контролирует результат слияния. Git поверит вам , даже если вы скажете ему, что правильный результат - полностью игнорировать работу другого парня и просто принять вашу версию.

(Обратите внимание, что даже если Git считает, что он правильно объединил изменения двух людей, Git не всегда понимает это правильно. Это все же ваша ответственность за проверку того, что Git понял все правильно. Это хорошая идея у вас есть какая-то система тестирования, которую вы можете использовать. Git просто следует простым правилам объединения текста, которые во многих случаях работают очень хорошо.)


1 В принятом ответе рекомендуется использовать git mergetool с vimdiff в качестве инструмента. Мне не нравится git mergetool, и я рекомендую прочитать другие ответы и поэкспериментировать, чтобы найти то, что подходит вам лучше всего. Но если git mergetool хорошо работает для вас, это нормально. Обратите внимание, что git mergetool может использовать другие инструменты слияния, кроме vimdiff; если у вас есть инструмент слияния, который вы предпочитаете, git mergetool, скорее всего, сможет его запустить. В книге Pro Git есть дополнительные советы, включая главу по расширенному слиянию.

0 голосов
/ 05 сентября 2018

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

Ниже приведены шаги для создания ветки из вашего старого коммита и проверки того же самого.

git branch branchname <sha1 of your old commit>
git checkout branchname  

или

git checkout -b branchname <sha1 of your old commit>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...