Подтвердить что ты не робот

Git Отменить автоматическое слияние в определенном файле только не всей ветвью

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

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

Автоматическое слияние public/stylesheets/application.css

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

Я пробовал:

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

но кажется, что он не работает.

4b9b3361

Ответ 1

Когда вы выполните:

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

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

Эта форма сбрасывает записи индекса для всех < путей > к их состоянию при < commit%. (Это не влияет на рабочее дерево или текущую ветвь.)

Если вы выполните:

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

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

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

git commit --amend

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

Ответ 2

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

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

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

$ 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"

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

Во-вторых, reset репозиторий, как указано выше, и повторите проверку фиксации:

$ 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

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