Переключиться на другую ветку без изменения файлов рабочей области - PullRequest
60 голосов
/ 28 декабря 2011

Я клонировал Git-репозиторий из GitHub, внес некоторые изменения и некоторые коммиты; Я сделал довольно много, и все они довольно грязные, поэтому они не подходят для запроса извлечения. Теперь я создал ветку cleanchanges из origin/master, поэтому она чистая, и я хочу зафиксировать свои изменения как один коммит с хорошим комментарием коммита.

Когда я работаю на локальном мастере, я хочу переключиться на мой cleanchanges, но без изменения файлов. И тогда я могу совершить.

Как переключать ветки без изменения файлов?

Я хочу прояснить: все изменения зафиксированы в локальном master. Нет незафиксированных изменений.

Ответы [ 7 ]

54 голосов
/ 28 декабря 2011

Редактировать: Я только что заметил, что вы сказали, что уже создали некоторые коммиты.В этом случае используйте git merge --squash, чтобы сделать один коммит:

git checkout cleanchanges
git merge --squash master
git commit -m "nice commit comment for all my changes"

( Редактировать: Следующий ответ применяется, если у вас есть незафиксированные изменения.)

Просто переключите ветки с помощью git checkout cleanchanges.Если ветки ссылаются на одну и ту же ссылку, то все ваши незафиксированные изменения будут сохранены в вашем рабочем каталоге при переключении.

Единственный раз, когда у вас возникнет конфликт, это если какой-то файл в хранилище отличается между origin/master и cleanchanges.Если вы только что создали ветку, то проблем нет.

Как всегда, если вас беспокоит потеря работы, сначала сделайте резервную копию.Git предназначен для того, чтобы не выбрасывать работу, не спросив вас сначала.

39 голосов
/ 05 февраля 2016

Гит.Переключиться на другую ветку

git checkout branch_name
9 голосов
/ 28 декабря 2011

Лучше всего ставить на копить изменения и переключать ветки. Для переключения веток нужно чистое состояние. Так что спрячьте их, извлеките новую ветку и примените изменения к новой ветке и передайте ее

1 голос
/ 26 января 2014

Другой способ, если вы хотите создать новый коммит вместо выполнения слияния:

git checkout cleanchanges
git reset --hard master
git reset cleanchanges

git status
git add .
git commit

При первом (жестком) сбросе ваше рабочее дерево будет таким же, как и при последнем коммите в master.

Второй сброс вернет вашу ГОЛОВУ туда, где она была, указывая на вершину ветви cleanchanges, но без изменения каких-либо файлов. Теперь вы можете добавлять и фиксировать их.


Впоследствии, если вы хотите удалить грязные коммиты, сделанные вами из master (и при условии, что вы еще не нажали их), вы можете:

git checkout master
git reset --hard origin/master

Это отменит все ваши новые коммиты, вернув локальную ветвь master к тому же коммиту, что и в репозитории.

1 голос
/ 28 декабря 2011

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

Если это так, вы хотите перебазировать вашкоммиты, раздавив их в один коммит.

Я не совсем уверен, чего именно вы хотите, поэтому я не собираюсь искушать вас сценарием.Но я предлагаю вам прочитать о git rebase и опциях для "сквоша" и попробовать несколько вещей.

0 голосов
/ 05 февраля 2019

Почему не просто git reset --soft <branch_name>?

Демонстрация:

mkdir myrepo; cd myrepo; git init
touch poem; git add poem; git commit -m 'add poem'  # first commit
git branch original
echo bananas > poem; git commit -am 'change poem'  # second commit
echo are tasty >> poem  # unstaged change
git reset --soft original

Результат:

$ git diff --cached
diff --git a/poem b/poem
index e69de29..9baf85e 100644
--- a/poem
+++ b/poem
@@ -0,0 +1 @@
+bananas
$ git diff
diff --git a/poem b/poem
index 9baf85e..ac01489 100644
--- a/poem
+++ b/poem
@@ -1 +1,2 @@
 bananas
+are tasty

Следует отметить, что текущая ветвь меняется на original. Вы все еще остались в предыдущей ветке после процесса, но можете легко git checkout original, потому что это то же самое состояние. Если вы не хотите потерять предыдущий HEAD, вы должны отметить ссылку на коммит и после этого выполнить git branch -f <previous_branch> <commit>.

0 голосов
/ 02 июля 2018

Самый простой способ сделать это следующим образом:

git fetch && git checkout <branch_name>
...