Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Изменить: Я только заметил, что вы сказали, что уже создали некоторые коммиты. В этом случае используйте 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 предназначен для того, чтобы не отбрасывать работу, не спрашивая вас в первую очередь.

Ответ 2

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

git checkout branch_name

Ответ 3

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

Ответ 4

Похоже, вы вносили изменения, обязывая их освоить на этом пути, и теперь вы хотите объединить их в одну фиксацию.

Если это так, вы хотите rebase выполнить свои коммиты, сжимая их в одну фиксацию.

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

Ответ 5

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

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

git status
git add .
git commit

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

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


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

git checkout master
git reset --hard origin/master

Это отбросит все ваши новые коммиты, возвращая ветку master к той же фиксации, что и в репозитории.

Ответ 6

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

git fetch && git checkout <branch_name>

Ответ 7

Почему бы просто не 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> после этого.