Отказаться от Git фиксирует Github для отклоненных запросов на получение - PullRequest
16 голосов
/ 02 марта 2012

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

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

Ответы [ 2 ]

22 голосов
/ 02 марта 2012

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

git log

Чтобы сбросить репо в это состояние:

git reset --hard <commit_hash>

Если у вас есть разветвленное удаленное репо, вы можете перенести в него следующие изменения:

git push -f <remote> <branch>

Возможно, вы захотите изменить свой рабочий процесс, чтобы в будущем все было проще.

Когда я открываю репо и делаю свои собственные изменения, я сначала настраиваю два пульта. Один пульт будет указывать на мое разветвленное репо (например: origin), и добавлять другие удаленные точки в оригинальное репо, из которого был разветвлен (например: original_repo). Так что я мог бы иметь что-то вроде:

$ git remote
origin
original_repo

Я создаю ветку, чтобы выполнять всю мою работу, например: feature. Когда я делаю пулл-запрос, я делаю это из ветви feature в ветку original_repo master. Если запрос на получение ответа отклонен, как в вашем примере, вы можете просто отказаться от этой ветки. Если вы хотите работать над дополнительными модификациями, просто создайте другую ветку из master и используйте ее для работы.

Я также не фиксирую и не объединяю локальные изменения в ветку master. Я использую только ветку master для синхронизации с веткой original_repo master. например:

git checkout master
git fetch original_repo
git merge original_repo/master

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

В основном используйте master для синхронизации с исходным репо master и всегда переходите от мастера, когда вы хотите внести изменения. Используйте эти ветки для ваших запросов на получение исходных репо.

2 голосов
/ 02 марта 2012

Сделайте несколько шагов назад в вашей главной ветке (при условии, что вы хотите пропустить три коммита назад) и переписайте репозиторий github, нажав -f.

git reset --hard HEAD~3
git push -f origin master
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...