Git Отменить автоматическое слияние в определенном файле только не всей ветвью
Есть ли способ, которым я могу отменить автоматическое слияние 1 файла, который был изменен вместо всей ветки в git?
Я хочу отменить это слияние:
Автоматическое слияние public/stylesheets/application.css
к предыдущей версии и оставить остальные в текущем состоянии.
Я пробовал:
git reset HEAD~1 public/stylesheet/application.css
но кажется, что он не работает.
Ответы
Ответ 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
.