Удаление локального коммита, когда вызывается git pull - PullRequest
0 голосов
/ 27 сентября 2011

Я сделал коммит с ошибкой (программа не скомпилирована) и после: git push (I).
Мой коллега сделал: git pull (She) и получил нескомпилированное состояние хранилища. После этого добавили несколько коммитов (о документации проекта - для компиляции не было критично) и сделали снова: git push (She)
После этого у нас есть следующее состояние хранилища:

  1. Некоторые ее совершают
  2. Некоторые ее совершают
  3. Мой коммит с ошибкой
  4. Мой очередной коммит
    Я хотел именно удалить коммит 3. И для этого я сделал
    git-rebase --onto <sha of commit 4> <sha commit 3> master
    git push --force

Теперь у нас правильное состояние хранилища (без коммита 3), но со всеми другими изменениями. Но если она сделает

git pull
git push

она выполнит слияние со своим локальным коммитом № 3, а затем вытащит его в хранилище. Как я могу сделать так, чтобы кто-то (не только она) после git pull исправлял состояние репозитория - со всеми изменениями, но без коммита # 3?

Примечания: Вероятно, она добавила (в другом случае - особенность) локальные коммиты выше последней. И ее локальный репозиторий новее, чем серверный репозиторий.

1 Ответ

0 голосов
/ 27 сентября 2011

Вы обнаружили проблему с изменением публичной истории: каждый, кто видел это изменение, должен согласиться изменить его таким же образом.В этом простом случае они, вероятно, могут получить новую правильную версию, выполнив ту же команду rebase, что и вы:

git-rebase --onto <sha of commit 4> <sha commit 3> master

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

Невозможно автоматически вызвать это.Самым простым способом для людей, которые просто отслеживали master или перенесли все изменения, которые они сделали, когда вы делали эту перебазировку, может быть выполнение git reset --hard origin/master, но это сотрет все локальные коммиты, сделанные в текущей ветви, которая не былаmaster, когда вы делали свою перебазировку .

Альтернативный способ добиться того же - с git revert.Это просто добавит новый коммит, который противоположен другому коммиту.Это не редактирует историю, оно просто добавляет ее таким образом, чтобы отменить ее.Это приводит к тому, что фиксация проблемы по-прежнему отображается в git log и связанных с ней командах, но не вызывает проблем для всех остальных.

...