2013-07-16 2 views
2

Короче:Undo мерзавец тянуть с удаленного филиала на свежий репозиторий в состояние перед мерзавец тянуть

Могу ли я восстановить свой код в состояние, прежде чем я сделать git pull после снятия кода с удаленного филиала на свежий git-репозиторий?

Длинная история:

У меня есть две папки, содержащие скрипты, одна папка представляет другую версию файлов в другую папку. Чтобы применить управление версиями, я начинаю с создания git-репозитория в github с папкой с меньшей версией по сравнению с другой папкой и созданием двух ветвей с одним и тем же содержимым для представления обеих папок.

Чтобы синхронизировать папку, которая содержит последнюю версию для удаленного филиала, я следующий в этой папке:

git init 
git remote add origin [GITHUB_REPO] 
git pull origin [BRANCH_NAME]:[BRANCH_NAME] 
git add . 
git commit -m "Latest revision." 

Я проверил рабочий процесс несколько раз, прежде чем и не кажется, что ничего не случилось, пока я позже что прямо перед git add . я запустил git status, и никаких изменений не было показано, оно отображает только новые файлы без следа, что странно.

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

Это результат git reflog show:

edbfd0d [email protected]{0}: commit: Import code from development environment. 
da39602 [email protected]{1}: checkout: moving from master to development 

То, что я сделал это:

git reset [email protected]{1} 

И это не решает проблему, а только отменить последний коммит, и замененные файлы от git pull все еще не возвращается. Если это помогает, версия git на сервере равна 1.7.1, а на моей локальной машине - 1.8.2.1. Неудивительно, что они действуют по-другому.

-

После дальнейших исследований, я обнаружил, что поведение git pull на сервере отличается от моей локальной машины развития. Кажется, что на сервере git pull автоматически сливается, в то время как в моем локальном развитии сообщается, что есть файлы, которые могут быть перезаписаны при слиянии.

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

+0

Как выглядит ваш 'git reflog' в этом состоянии? – Christopher

+0

Он выводит только две строки: 'edbfd0d HEAD @ {0}: commit: ...' и 'da39602 HEAD @ {1}: checkout: ...' –

+0

В чем же проблема? «Кажется, что ничего не случилось, пока я не запустил файлы и не получил ошибку». Что именно вы выполняете и какую ошибку вы получаете? Измените это на свой вопрос. – sleske

ответ

4

Существует два возможных сценария, в зависимости от того, что сделал git pull. Если фаза слияния git pull привела к быстрой перемотке вперед слиянии, а затем, сразу после git pull, вы можете сделать это:

git reset --hard [email protected]{1} 

Это сбросит голову и указатель филиального обратно туда, где он был сразу перед запуском git pull. Если вы делали другие вещи с git pull, вам может потребоваться запустить git reflog HEAD и решить, какую запись вы действительно хотите вернуть обратно.

Если git pull создано новое слияние, либо потому, Однако, в этом случае, вы можете также просто сбросить обратно к первому родителю тока фиксации с помощью этой команды:

git reset --hard HEAD^1 

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

+0

Проблема не в том, что я делаю после 'git pull', но перед этим. Тот факт, что я ничего не делаю до того, что вызывает проблемы. –

+0

Хотя то, что написано здесь правильно, вероятно, не поможет OP. Похоже, проблема в том, что он сделал «git pull» на грязном дереве (обратите внимание на 'git init' в непустой директории без фиксации). Если слияние перезаписано/изменено без следов файлов, нет никакой фиксации, чтобы вернуться с помощью 'reset' или аналогичного. – sleske

1

I do the following in that folder:

git init 
git remote add origin [GITHUB_REPO] 
git pull origin [BRANCH_NAME]:[BRANCH_NAME 

На самом деле, это не очень хорошая идея. Одним из важных правил с git является то, что вы должны никогда не выполнять сложные операции с «грязным» рабочим деревом (т. Е. С файлами, которые не отмечены).

В этом случае вы создали репо в каталоге с файлами в нем, но не зафиксировали файлы. Таким образом, файлы неизвестны git, и поэтому git status показывает их как «untracked». Теперь git pull автоматически попытается слить, и слияние с грязным деревом проблематично. git пытается не перезаписывать какие-либо данные, но если слияние не получится так, как вам было угодно, нет простого способа отменить некоторые изменения, поскольку старая версия файлов не была выполнена.

Так лучше было бы сначала сделать инициализации/удаленного добавления/тянуть в пустой каталога (или просто клонировать удаленный репо):

git clone [GITHUBREPO] 
git checkout BRANCH_NAME # note: This will create a local branch from the remote 

Это дает вам чистую копию удаленной ветви. Затем скопировать файлы из папки с Lastest версии, чтобы создать намеченную новое состояние отрасли:

rm oldfiles; cp -a ../folder2/* . # or similar 

Тогда Вы обязуетесь все это:

git add . 
git commit -m "Files from folder2" 

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

Примечание:

The problem is my files gets overwritten with remote branch, and I can't undo to a state before I pull, because that's the first action

Это обычно не должно произойти. Если git pull вызывает конфликт с локальными, незафиксированными файлами (как в вашем случае), git pull должен прерываться с ошибкой. Как это:

error: Untracked working tree file 'myFile' would be overwritten by merge. 

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

+0

Да, эта ошибка: «error: Untracked working tree file ...» не отображалась на сервере, поэтому я подумал, что нет ничего плохого, пока я не понял позже, что ни один измененный файл не показан, а только новые файлы без следа. –

Смежные вопросы