git stash blunder: git stash pop и закончился конфликтами слияния
Я git stash pop
и в конечном итоге с конфликтами слияния. Я удалил файлы из файловой системы и сделал git checkout
как показано ниже, но он думает, что файлы все еще не объединены. Затем я попытался заменить файлы и сделать git checkout
снова и тот же результат. Я событие попытался заставить его с -f
флаг. Любая помощь будет оценена!
chirag-patels-macbook-pro:haloror patelc75$ git status
app/views/layouts/_choose_patient.html.erb: needs merge
app/views/layouts/_links.html.erb: needs merge
# On branch prod-temp
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: db/schema.rb
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# unmerged: app/views/layouts/_choose_patient.html.erb
# unmerged: app/views/layouts/_links.html.erb
chirag-patels-macbook-pro:haloror patelc75$ git checkout app/views/layouts/_choose_patient.html.erb
error: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
chirag-patels-macbook-pro:haloror patelc75$ git checkout -f app/views/layouts/_choose_patient.html.erb
warning: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
4 ответа:
посмотреть man git merge (КАК РАЗРЕШИТЬ КОНФЛИКТЫ):
, увидев конфликт, вы можете сделать две вещи:
решили не сливаться. Единственная очистка, которая вам нужна, - это сброс индексного файла в HEAD commit to reverse 2. а для очистки рабочего дерева внесены изменения по 2. и 3.; git-reset --жесткий может быть использован для этого.
разрешить конфликты. ГИТ будет отмечать конфликтов в рабочем дереве. Отредактируйте файлы в форму и git добавьте их в индекс. Используйте git commit, чтобы запечатать сделку.
и под TRUE MERGE (чтобы увидеть, что 2. и 3. ссылается на):
Если это не очевидно, как согласовать изменения, происходит следующее:
указатель головы остается прежним.
ссылка MERGE_HEAD указывает на другой глава филиала.
пути, которые слились чисто обновляются как в индексном файле, так и в вашем рабочем дереве.
...
Так: использовать
git reset --hard
Если вы хотите удалить изменения тайника из вашего рабочего дерева, илиgit reset
Если вы хотите просто очистить индекс и оставить конфликты в рабочем дереве сливать вручную.под man git stash (параметры, поп) вы можете прочитать в дополнение:
применение состояния может завершиться неудачей с конфликтами; в этом случае оно не удаляется из списка тайников. Вам нужно решить конфликты вручную и вызвать git stash drop вручную после этого.
со мной случилось нечто подобное. Я еще не хотел размещать файлы, поэтому я добавил их с помощью
git add
а потом просто сделалgit reset
. Это в основном просто добавил, а затем unstaged мои изменения, но очистил несвязанные пути.
если, как и я, вы обычно хотите перезаписать содержимое рабочего каталога с помощью сохраненных файлов, и вы все равно получите конфликт, то вы хотите разрешить конфликт с помощью
git checkout --theirs -- .
от корня.после этого, вы можете
git reset
чтобы перенести все изменения из индекса в рабочий каталог, так как, по-видимому, в случае конфликта изменения в неконфликтные файлы остаются в индексе.вы также можете запустить
git stash drop [<stash name>]
после этого, чтобы избавиться от тайника, потому чтоgit stash pop
не удаляет его в случае конфликтов.
отметим, что
Git 2.5 (Q2 2015)будущий ГИТ может попытаться сделать этот сценарий невозможным.посмотреть commit ed178ef by Джефф Кинг (
peff
), 22 апреля 2015 года.
(слитый Junio C Hamano--gitster
- в совершить 05c3967, 19 мая 2015)Примечание: это было отменено. Смотрите ниже.
stash
: требуют очистить индекс для применения/попесли вы разместили содержимое в своем индексе и запустите "
stash apply/pop
", мы можем столкнуться с конфликтом и ввести новые записи в индекс.
восстановление в исходное состояние трудно в этот момент, потому что инструменты, такие как" git reset-keep " сдует все, что поставлено.другими словами:
"
git stash pop/apply
" забыл убедиться, что не только рабочее дерево является чистым, но и индекс является чистым.
Последнее важно, поскольку приложение stash может конфликтовать, и индекс будет использоваться для разрешения конфликтов.решение
мы можем сделать это более безопасным, отказавшись применять, когда есть поэтапные изменения.
это означает, что если раньше были слияния из-за применения тайника к измененным файлам (добавленным, но не зафиксированным), теперь они не будут никакими слияниями, потому что stash apply / pop немедленно остановится с помощью:
Cannot apply stash: Your index contains uncommitted changes.
принуждение к фиксации изменений означает, что в случае слияния вы можете легко восстановить исходное состояние( до
git stash apply/pop
) Сgit reset --hard
.
посмотреть совершить 1937610 (15 июня 2015), и commit ed178ef (22 апреля 2015) by Джефф Кинг (
peff
).
(слитый Junio C Hamano--gitster
-- в commit bfb539b, 24 июня 2015)эта фиксация была попыткой повысить безопасность применения тайник, потому что процесс подачи заявки может создать конфликтные записи индекса, после которых трудно восстановить исходное состояние индекса.
к сожалению, это вредит некоторым общим рабочим процессам вокруг "
git stash -k
", как:git add -p ;# (1) stage set of proposed changes git stash -k ;# (2) get rid of everything else make test ;# (3) make sure proposal is reasonable git stash apply ;# (4) restore original working tree
если вы "git commit" между шагами (3) и (4), то этот просто работать. Однако, если эти шаги являются частью предварительной фиксации крюк, у вас нет такой возможности (вы должны восстановить исходное состояние независимо от того, прошли ли испытания или нет. неудачный.)