2014-12-30 3 views
0

У меня есть фиксация в моем локальном репозитории. На удаленном сервере кто-то совершает больше.Как отменить локальную фиксацию с помощью Git?

Как отказаться от моей локальной фиксации? (Но сохраняет фиксации)

Я думаю, мне нужно использовать сброс git или git rebase или git checkout? или что-то вроде git revert?

Я действительно смущен этими командами.

+0

Вы прочитали: http://stackoverflow.com/questions/23865335/sourcetree-undo-unpushed-commits? –

+0

Я не уверен насчет «мягкого сброса» и «жесткого сброса»? –

+0

Жесткий сброс полностью отменит ваши изменения, soft сохранит их в вашей локальной копии –

ответ

1

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

Rebase будет сравнивать две ветви и палить изменения вашей текущей ветви (например, локальные изменения), потяните другую ветвь (например, удаленную), и воспроизводить ваши изменения на верхнем один-на-один

Rebase работает, когда вы уже зафиксировали свои изменения. Например,

master: A - B - C 

origin/master: A - B - D 

перебазирования мастер по происхождению/мастер превращает это в

master: A - B - D -C 

Там будет вариант удобства для этого с мерзавцем тянуть

git pull --rebase

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

git rebase -i origin/master

Одно предостережение с перебазироваться, что она будет воссоздать все фиксаций это rebases. Это означает, что все они будут получать новые ША и что Git не воспринимает их как то же самое совершает

EDIT:

Если вы не хотите, чтобы перебазировать, то вы должны быть в состоянии использовать сброс.

git reset <commit>

В ниже я добавить «плохую фиксацию» и хочу откатить мой журнал, сохраняя изменения с плохой фиксацией в моей рабочей копии. Я использую псевдоним HEAD ~ 1, но вы также можете дать ему SHA.

[email protected] 2.1.3p242 ~/repos/spy_rb (master) $ git log origin/master -1 
commit 8fd6a1a7704d2c0dc1323c4d8e5e169c169c833c 
Author: Josh Bodah <[email protected]> 
Date: Thu Dec 18 17:55:14 2014 -0500 

    generate tags in change_version 
[email protected] 2.1.3p242 ~/repos/spy_rb (master) $ git log -2 
commit b925445207000905d535e715a06d312ca65be5c1 
Author: Josh Bodah <[email protected]> 
Date: Tue Dec 30 09:31:36 2014 -0500 

    bad commit 

commit 8fd6a1a7704d2c0dc1323c4d8e5e169c169c833c 
Author: Josh Bodah <[email protected]> 
Date: Thu Dec 18 17:55:14 2014 -0500 

    generate tags in change_version 
[email protected] 2.1.3p242 ~/repos/spy_rb (master) $ git log origin/master -1 
commit 8fd6a1a7704d2c0dc1323c4d8e5e169c169c833c 
Author: Josh Bodah <[email protected]> 
Date: Thu Dec 18 17:55:14 2014 -0500 

    generate tags in change_version 
[email protected] 2.1.3p242 ~/repos/spy_rb (master) $ git reset HEAD~1 
Unstaged changes after reset: 
M README.md 
[email protected] 2.1.3p242 ~/repos/spy_rb (master) $ git log -1 
commit 8fd6a1a7704d2c0dc1323c4d8e5e169c169c833c 
Author: Josh Bodah <[email protected]> 
Date: Thu Dec 18 17:55:14 2014 -0500 

    generate tags in change_version 
[email protected] 2.1.3p242 ~/repos/spy_rb (master) $ git status 
On branch master 
Your branch is up-to-date with 'origin/master'. 
Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: README.md 

no changes added to commit (use "git add" and/or "git commit -a") 
+0

В принципе, я просто хочу вернуть последнюю фиксацию; но сохранить фиксацию, скажем, создать новую фиксацию, которая откатывается от последнего коммита? мне нужно использовать rebase? любая удобная команда? –

+0

Действительно хороший ответ. Мне нужно сначала использовать rebase; то я должен использовать revert, так как мне все еще нужно сохранить фиксацию. –

+0

Я не соглашусь ни с одной, так как мне нужно комбинированное решение. –

1

Использование

git revert {commit hash} 

Вы можете использовать журнал GIT, чтобы найти хэш совершения (это строка букв и цифр). Это будет «возвращаться» (работает, как отменить в блокноте), ваше сообщение, но оставьте его неповрежденным. Позже кто-то может захотеть вернуть ваше возвращение, так что хорошо оставить его.

Кто-то разместил около

git reset --hard {commit hash} 

Это, вероятно, не то, что вы хотите. Это приведет к удалению всех коммитов и изменений в файлах, начинающихся с HEAD, до предоставленного {commit hash}.

git reset --soft {commit hash} 

«Мягкий сброс» удалит все коммиты, но сохранит изменения в файлах. Затем вы можете сделать что-то действительно уродливое, например, повторно подтвердить всю свою перезагрузку. Опять же, возможно, не то, что вы ищете.

+0

На самом деле, лучший способ отменить фиксации - это, вероятно, 'git reset --keep { commit hash} ', который отбрасывает коммиты, но сохраняет неизменные изменения. –

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