Как зафиксировать мои текущие изменения в другой ветке в git [дубликат]
этот вопрос уже есть ответ здесь:
Как объединить мои локальные незафиксированные изменения в другую ветку Git?
6 ответов
иногда случается, что я делаю некоторые изменения в своем рабочем каталоге, и я понимаю, что эти изменения должны быть зафиксированы в ветке, отличной от текущей. Это обычно происходит, когда я хочу попробуйте новые вещи или выполните некоторые тесты, и я забуду создать новую ветку заранее, но я не хочу фиксировать грязный код в главной ветке.
и как я могу сделать, чтобы незафиксированные изменения (или изменения, хранящиеся в индексе) были зафиксированы в другой ветви, чем текущая?
3 ответов:
другие ответы, предлагающие проверить другую ветку, а затем совершить ее, работают только в том случае, если проверка возможна с учетом локальных изменений. Если нет, то вы находитесь в наиболее распространенном случае использования для
git stash:git stash git checkout other-branch git stash popпервый
stashскрывает ваши изменения (в основном делая временную фиксацию), а последующиеstash popповторно применяет их. Это позволяет git использовать свои возможности слияния.если при попытке открыть тайник, вы столкнетесь с конфликтами слияния... следующие шаги зависят от того, что эти конфликты. Если все спрятанные изменения действительно принадлежат этой другой ветви, вам просто придется их сортировать - это следствие того, что вы внесли свои изменения в неправильную ветвь.
С другой стороны, если вы действительно перепутали, и ваше рабочее дерево имеет смесь изменений для двух ветвей, а конфликты находятся только в тех, которые вы хотите зафиксировать на исходной ветви, вы можете сохранить некоторую работу. Как обычно, их очень много способы сделать это. Вот один, начиная с того, как вы поп и видите конфликты:
# Unstage everything (warning: this leaves files with conflicts in your tree) git reset # Add the things you *do* want to commit here git add -p # or maybe git add -i git commit # The stash still exists; pop only throws it away if it applied cleanly git checkout original-branch git stash pop # Add the changes meant for this branch git add -p git commit # And throw away the rest git reset --hardв качестве альтернативы, если вы заранее понимаете, что это произойдет, просто зафиксируйте вещи, которые принадлежат текущей ветке. Вы всегда можете вернуться и изменить эту фиксацию:
git add -p git commit git stash git checkout other-branch git stash popи, конечно, помните, что все это заняло немного работы, и избежать его в следующий раз, возможно, поставив ваше текущее имя ветви в приглашении, добавив
$(__git_ps1)к вашему PS1 внутри ваш bashrc следующее. (См., например,ГИТ в Баш docs.)
Вы можете просто создать новую ветку и переключиться на нее. Зафиксируйте свои изменения затем:
git branch dirty git checkout dirty // And your commit follows ...кроме того, вы также можете проверить существующую ветку (просто
git checkout <name>). Но только, если нет коллизий (база всех редактируемых файлов такая же, как и в вашей текущей ветке). В противном случае вы получите сообщение.
git checkout my_other_branchgit add my_file my_other_filegit commit -mи предоставить свое сообщение.
Comments