Как зафиксировать мои текущие изменения в другой ветке в git [дубликат]



этот вопрос уже есть ответ здесь:




  • Как объединить мои локальные незафиксированные изменения в другую ветку Git?

    6 ответов



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



и как я могу сделать, чтобы незафиксированные изменения (или изменения, хранящиеся в индексе) были зафиксированы в другой ветви, чем текущая?

636   3  

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>). Но только, если нет коллизий (база всех редактируемых файлов такая же, как и в вашей текущей ветке). В противном случае вы получите сообщение.

  1. git checkout my_other_branch
  2. git add my_file my_other_file
  3. git commit -m

и предоставить свое сообщение.

Comments

    Ничего не найдено.