Git: Создать ветку из неустановленных / незафиксированных изменений на master - PullRequest
904 голосов
/ 03 апреля 2010

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

Это всегда случается со мной, и я понятия не имею, как переключиться на другую ветку и взять все эти незафиксированные изменения со мной, оставив главную ветвь чистой. Я предполагал, что 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/stash@{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")

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

Ответы [ 4 ]

1082 голосов
/ 03 апреля 2010

Не нужно копить.

git checkout -b new_branch_name

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

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

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

57 голосов
/ 03 апреля 2010

Попробуйте:

git stash
git checkout -b new-branch
git stash apply
19 голосов
/ 14 января 2016

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

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

или

git stash -u
git branch sillyname stash@{0}

(git checkout - <- тире - это ярлык для предыдущей ветви, на которой вы были) </p>

(git stash -u <- <code>-u означает, что он также принимает неустановленные изменения)

5 голосов
/ 13 сентября 2016

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

enter image description here

...