Git: создать ветку из неустановленных/незафиксированных изменений в мастер

Контекст: Я работаю над мастером, добавляя простую функцию. Через несколько минут я понял, что это было не так просто, и лучше было бы работать в новой ветке.

Это всегда происходит со мной, и я понятия не имею, как переключиться на другую ветку и принять все эти неуправляемые изменения, чтобы я оставил чистую ветку. Я предположил, что git stash && git stash branch new_branch просто выполнит это, но это то, что я получаю:

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ echo "hello!" > testing 

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/[email protected]{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)

~/test $ git s
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git checkout master
M   testing
Switched to branch 'master'

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

Знаете ли вы, есть ли способ сделать это?

Ответ 1

Не нужно заносить.

git checkout -b new_branch_name

не касается ваших локальных изменений. Он просто создает ветку из текущей HEAD и устанавливает там HEAD. Поэтому я предполагаю, что вы хотите.

--- Редактировать, чтобы объяснить результат мастера проверки ---

Вы запутались, потому что checkout master не отменяет ваши изменения?

Поскольку изменения только локальны, git не хочет, чтобы вы потеряли их слишком легко. При изменении ветки git не перезаписывает локальные изменения. Результатом вашего checkout master является:

M   testing

что означает, что ваши рабочие файлы не чисты. git изменил HEAD, но не перезаписал ваши локальные файлы. Вот почему ваш последний статус по-прежнему показывает ваши локальные изменения, хотя вы находитесь на master.

Если вы действительно хотите отменить локальные изменения, вам нужно принудительно выполнить проверку с помощью -f.

git checkout master -f

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

Попытайтесь вернуться в свою ветку, скопируйте свои изменения, затем снова проверьте мастер.

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

После первой проверки вы должны получить сообщение M, но не более того после checkout master и git status не должно отображаться никаких измененных файлов.

--- Редактировать, чтобы устранить путаницу в рабочем каталоге (локальные файлы) ---

В ответ на ваш первый комментарий локальные изменения просто... ну, локальные. git не сохраняет их автоматически, вы должны сообщить об этом, чтобы сохранить их позже. Если вы вносите изменения и не выполняете их явно, или git, они не будут их изменять. Если вы измените HEAD (checkout master), локальные изменения не будут перезаписаны с сохраненными.

Ответ 2

Try:

git stash
git checkout -b new-branch
git stash apply

Ответ 3

Две вещи, которые вы можете сделать:

git stash -u
git branch sillyname [email protected]{0}

или

git checkout -b sillyname
git commit -am "silly message"
git checkout - 

(git stash -u < - the -u означает, что он также принимает нестационарные изменения)

(git checkout - < - тире - ярлык для предыдущей ветки, в которой вы были)

Ответ 4

Если вы используете клиент Windows GitHub (как и я), и вы находитесь в ситуации, когда вы сделали незафиксированные изменения, которые хотите переместить в новую ветку, вы можете просто "собрать новую ветку" через клиент GitHub, Он переключится на вновь созданную ветку и сохранит ваши изменения.

введите описание изображения здесь