Git отменяет автоматическое слияние только для определенного файла, а не для всей ветви - PullRequest
18 голосов
/ 18 марта 2011

Есть ли способ отменить автоматическое слияние одного файла, который был изменен, вместо всей ветви в Git?

Я хочу отменить это слияние:

Автоматическое объединение public / stylesheets / application.css

до предыдущей версии, а остальные оставить в текущем состоянии.

Я пытался:

git reset HEAD~1 public/stylesheet/application.css

но похоже, что он не работает.

Ответы [ 3 ]

28 голосов
/ 18 марта 2011

Когда вы делаете:

git reset HEAD~1 public/stylesheet/application.css

... которая изменяет версию вашего файла в индексе (т.е. поэтапную версию) на версию в HEAD~1 - ваша рабочая копия остается прежней. Текущая документация объясняет это как:

Эта форма сбрасывает записи индекса для всех в их состояние в

Если вы делаете:

git checkout HEAD~1 -- public/stylesheet/application.css

... это изменит рабочую копию и промежуточную версию на версию с HEAD~1. -- здесь для безопасности, на случай, если у вас есть имя файла, которое также можно понимать как коммит.

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

git commit --amend

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

3 голосов
/ 18 марта 2011

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

В вашем случае у вас есть несколько вариантов:

Самый безопасный способ - просто извлечь старую версию вашего файла и повторить регистрацию

$ git checkout HEAD~1 -- public/stylesheet/application.css
# Back at old version, change already staged
$ git commit -m "Reverted change to public/stylesheet/application.css"

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

Во-вторых, сбросьте репозиторий, как указано выше, и повторно проверьте в коммите:

$ git reset HEAD~1
# Now restore your file public/stylesheets/application.css
$ git commit -m "Re-checkin of the commit"
# You may use the old checkin message here

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

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

3 голосов
/ 18 марта 2011

Вы, вероятно, хотите git checkout <em>commit-ish</em> -- <em>file</em>.

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