Как не переносить изменения, внесенные в файлы, из ветки в другую в git

У меня есть домашнее задание, где мне нужно сделать три разных имплантации одной и той же программе. Профессор рекомендовал использовать git и размещать каждую имплантацию в отдельной ветке. Дело в том, что когда я делаю изменение в ветке с именем A, он также изменяет тот же файл в главной ветке ... Я не хочу, чтобы он переносил мои изменения по каждой ветке, вместо этого сохраняю изменения локально на каждая ветвь в одиночку. Как мне это сделать ?

(Я новичок в использовании git) (Мы работаем на Linux, удаленном сервере, на терминале)

РЕДАКТИРОВАТЬ: команды, которые я использовал для создания каталога моего проекта:

git init

git commit -m "my message"

git checkout // to switch branches

git branch branchname // to create a branch

# git-branch git-checkout git-commit
Источник
  • 0
    «Дело в том, что когда я делаю изменение в ветке с именем A, он также изменяет тот же файл в главной ветке». Это не должно работать так. Расскажите нам, какие команды git вы используете при фиксации и при смене веток
  • 0
    отправить идентификатор фиксации в другую ветку
  • 1
    Если вы оформляете заказ перед фиксацией, ваши изменения тоже могут переместиться ==> зафиксировать перед выездом
Codelisting
за 1 против

Файлы, которые вы видите и редактируете в своем рабочем дереве (обычные файлы), на самом деле не находятся в Git . Они были скопированы из Git при запускеgit checkout (или новыйgit switch ; оба они делают одно и то же для этой конкретной цели;git switch был добавлен в Git 2.23 как более безопасный способ проверки).

Когда ты бежишьgit add а потомgit commit , вы делаете новый снимок, архивируя все свои файлы в Git. Каждый коммит содержит полный снимок каждого файла (ну, каждого файла, который он содержит, но это звучит как бы излишне, не так ли?). Эти файлы хранятся внутри Git в специальной, доступной только для чтения, Git сжатой и дедуплицированной форме, как часть каждого коммита.

Дедупликация учитывает тот факт, что большинство коммитов в основном просто повторно используют существующие файлы из некоторого предыдущего коммита. Это сохраняет репозиторий меньше, чем он был бы, если бы файлы не дублировались. Но это также означает , что это практически невозможно использовать файлы, которые хранятся в Git. Итак, когда вы бежитеgit checkout илиgit switch , Git будет - когда вы переходите от одной фиксации к другой - удаляет старые извлеченные файлы и заменяет их новыми из новой выбранной фиксации.

Во избежание потери несохраненной работы обаgit checkout а такжеgit switch сначала сделайте некоторую проверку безопасности. 1 Если вы изменили какой-либо файл, но еще не зафиксировали это изменение, Git попытается взять этот измененный файл с вами в новую ветку. Это не всегда возможно, но когда это возможно, вы видите именно то, что видели:

Switched to branch 'master'
M       test.txt

ЭтотM это способ сказать Git: Эй, я заметил, что вы изменилиtest.txt . Вместо того, чтобы просто уничтожить внесенное вами изменение, я смог переключить ветки наmaster и оставьте измененную копию файла в рабочем дереве. Я не вынимал копию изmaster . Если это не то, что вы хотели сделать, вам, вероятно, следует вернуться к другой ветке, добавить файл и зафиксировать его.

На самом деле это гораздо больше, включая то, когда и может ли Git вообще переключать ветки, и более полная история содержится в моем ответе на Checkout another branch, когда в текущей ветке есть незафиксированные изменения . Это ответ на вопрос о том, почему иногда можно, а иногда нельзя,git checkout другая ветка, не выполняя свою работу. Это не касается того факта, чтоgit checkout менее безопасно, чемgit switch - сам вопрос и мой ответ предшествуют новомуgit switch - и не о том, хорошая ли это идея. Дело просто в механизме, лежащем в основе.

На данный момент просто помните, что файлы, которые вы видите и над которыми работаете, находятся не в Git . Они находятся в вашем рабочем дереве, чтобы вы могли их увидеть и поработать, но, что касается Git , это всего лишь временные файлы, с которыми вы можете играть, а Git перезаписывает их.git checkout .


1 Проверка безопасности вgit checkout могут быть отключены, иногда даже не осознавая этого. Вот почемуgit switch теперь существует, и почему было бы неплохо преобразовать в него, но старыеgit checkout еще работает. Поскольку вы упомянули об этом в своем вопросе, я в основном используюgit checkout в примерах здесь. Кроме того, я использую Git около 15 лет, и у меня есть плохие привычки из старых плохих времен. :-)

за 1 против

Когда я делаю:

$ git init
Initialized empty Git repository in MyPath/Test1/.git/

затем я создаю файлtest.txt

$ touch test.txt
$ git add test.txt
$ git commit -m " commit 1 "

Теперь я хочу изменить его в другой ветке

$ git checkout -b branch1
$ echo "Branch 1" >> test.txt

Вот и сложная часть ... Если я не добавлю файл, используяgit add test.txt и я не совершаю, а сразу иду к мастеру:

$ git checkout master
Switched to branch 'master'
M       test.txt

Я увижу изменения вmaster !!:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   test.txt

Что я должен сделать, так этоadd а такжеcommit в branch1:

$ git checkout branch1
$ git add test.txt
$ git commit -m "commit from branch 1"
[branch1 1b562f5] commit from branch 1
 1 file changed, 1 insertion(+)
$ git log
commit 1b562f5be40a50df04f8a2a15b58a7af61742275 (HEAD -> branch1)
Author: xxxxxx<[email protected]>
Date:   Thu Jun 3 16:36:30 2021 +0200

    commit from branch 1

commit 03684e2a02c1a37a8f4546f296c6802686c7a4e9 (master)
Author: xxxx<[email protected]>
Date:   Thu Jun 3 16:31:05 2021 +0200

     commit 1

И если я вернусь кmaster и проверьте журнал:

$ git checkout master
Switched to branch 'master'

$ git log
commit 03684e2a02c1a37a8f4546f296c6802686c7a4e9 (HEAD -> master)
Author: xxxxx<[email protected]>
Date:   Thu Jun 3 16:31:05 2021 +0200

     commit 1

Мы не увидим модификации ... как и ожидалось

ТАК! что, если вы хотите работать над другими ветвями, даже если вы еще не закончили с текущей веткой?

Я возвращаюсь в ветку 1 иcat его содержание

$ git checkout branch1
Switched to branch 'branch1'
$ cat test.txt
Branch 1

продолжай редактировать

$ echo "Branch 1..1" >> test.txt

Давайтеadd но нетcommit и попытатьсяcheckout мастер

$ git add test.txt
$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
        test.txt
Please commit your changes or stash them before you switch branches.
Aborting

невозможно! ты долженcommit раньше, НО! вы не хотите, чтобы новый коммит каждый раз, когда вы меняете ветвь, вы можете простоcommit --amend

$ git commit --amend
$ git log
commit 40a3a66e2b45a253f9a6ed564e977887c0748bf0 (HEAD -> branch1)
Author: xxxxx<[email protected]>
Date:   Thu Jun 3 16:36:30 2021 +0200

    commit from branch 1 => I can edit the comment!!

commit 03684e2a02c1a37a8f4546f296c6802686c7a4e9 (master)
Author: xxxxx<[email protected]>
Date:   Thu Jun 3 16:31:05 2021 +0200

     commit 1

И теперь я могу спокойноgit checkout master

  • 0
    Итак, все, что я делаю, мне придется делать git add и git commit ?
  • 0
    да просто! примите во внимание, чем вы не на 100% довольны модификацией, вы всегда можете «перезаписать» коммит с помощью git commit --amend , это лучше, чем иметь неправильные модификации в вашем журнале
за 0 против

Ты используешьforks ?

Странно, что главная ветвь автоматически синхронизируется с другой веткой. Я знаю, что если вы создали вилку, то ее можно настроить, чтобы основная ветвь из источника синхронизировалась с основной веткой в вашей вилке.

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

Не могли бы вы добавить больше деталей?

  • 0
    Я отредактировал пост. Дайте мне знать, если вам нужны дополнительные разъяснения. Спасибо
Codelisting
Популярные категории
На заметку программисту