Как перехватить прошлую фиксацию, если кто-то переписал мою фиксацию

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

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

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

Ответ 1

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

$ 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

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

Ответ 2

Самый простой способ исправить это, как обычно предлагает 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

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

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

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

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

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

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


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

Ответ 3

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

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

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

или же

git checkout -b branchname <sha1 of your old commit>