Чому git постійно відображає зміни, коли я перемикаю гілки (змінені, додані, видалені файли) незалежно від того, запускаю чи додаю git чи ні?


115

Я справді новачок у git, і я намагаюся зрозуміти, чому git продовжує показувати все, що я змінив в одній гілці в іншій гілці, коли запускаю git checkout, щоб перемикатися між гілками. Спочатку я спробував не використовувати додавання git і не працював. Однак я спробував тоді використовувати git add, але проблему не вирішив. Я ще не використовую git commit.

Це в основному те, що я роблю:

$ git clone <a_repository>  
$ git branch  
* master  
$ git branch testing  
$ git checkout testing  
...edit a file, add a new one, delete...  
$ git status  
    # On branch testing  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  
$ git branch  
  master  
* testing  
$ git checkout master  
D       file1.txt  
Switched to branch 'master'  
$ git status  
    # On branch master  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  

Я думав, що, використовуючи гілки, що б ви не робили в одній гілці, це непомітно для всіх інших гілок. Чи не це причина створення філій?

Я спробував використовувати "git add", але зміни помітні в обох гілках. Чи потрібно мені запускати "git commit" перед перемиканням між гілками, щоб цього уникнути?

Відповіді:


142

Перемикання гілок веде із собою неспроможні зміни. Або виконайте спочатку, запустіть, git checkout .щоб скасувати їх, або запустіть git stashперед переключенням. (Ви можете отримати свої зміни за допомогою git stash apply)


10
git stash pop краще, якщо ви не хочете створити величезну кількість штатів.
siride

7
@JPZ: git stash має справу лише з відстеженими файлами; нові файли не відслідковуються, тому вони не зберігаються.
siride

2
@JPZ: Якщо ви хочете приховати непотрібні файли, потрібно зробити git addїх перед тим, як зберігати. Це означає, що я не впевнений, що ви насправді хочете приховати тут - якщо ви плануєте, щоб ці зміни були частиною тієї гілки, з якої ви переходите, скористайтеся ними. (Якщо ви маєте намір повернутися до цієї гілки та попрацювати над змінами ще до їх внесення, то, stashможливо, це буде правильний інструмент для роботи.)
Cascabel

16
"Перемикання гілок веде з собою непомітні зміни" - Це має сенс і, можливо, найгірша ідея дизайну. Який сенс мати філії, якщо ви не можете працювати ізольовано? !!!
nehem

1
У моєму випадку у мене є одна особливість гілки, що розвивається. Я взяв участь у гілці функцій, але він показує зміни, коли я перевіряю також гілку розвитку.
Hitesh Garg

31

Коротка відповідь: так, потрібно взяти на себе зобов’язання. Не забудьте зробити це на правій гілці!

Гілка - вказівник на коміт. Коли ви здійснюєте перевірку з філією, яку ви перевірили, гілка переходить до вказаної нової комісії. Коли ви перевіряєте відділення, ви перевіряєте комісію, на яку вказує. (Ви можете вважати комісії як знімки робочого дерева.)

Таким чином, якщо у вас є зміни, які ви не вчинили, вони не вплинуть на зміну гілок. Звичайно, якщо перемикання гілок несумісне з вашими змінами, git checkoutпросто відмовиться це робити.

git addце команда для постановки змін, яку ви потім будете виконувати. Ці зміни не реєструються в історії сховища. Він просто розміщує їх у місце постановки (покажчик); git commitпотім використовує вміст цієї області постановки для створення комітетів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.