Як створити лише деякі файли?


259

У мене два проекти. Один - це "офіційний" проект, а другий - легка модифікація (деякі файли додано). Я створив нову гілку і ставлю до них нові файли. Але в процесі розробки деякі файли, спільні для обох гілок, змінюються.

Як зробити я лише ці файли?


Чи підключені ці два проекти до одного сховища git?
Олександр

Так, це те саме сховище, але я не хочу ставити свою гілку на сервер
Nips

То чому б ти не з’єднав свою нову гілку з майстром (чи іншою офіційною гілкою)
Олександр

1
Відповіді на ці питання повинні допомогти вам: stackoverflow.com/questions/7161860 / ... stackoverflow.com/questions/7175869 / ...
Екес

Відповіді:


261

Я припускаю, що ви хочете внести зміни до однієї гілки, а потім зробити ці зміни видимими в іншій гілці. У git у вас не повинно бути ніяких змін поверх HEAD при зміні гілок.

Ви здійснюєте лише змінені файли:

git commit [some files]

Або якщо ви впевнені, що у вас є чиста площа для постановки

git add [some files]       # add [some files] to staging area
git add [some more files]  # add [some more files] to staging area
git commit                 # commit [some files] and [some more files]

Якщо ви хочете зробити цю комісію доступною для обох гілок

git stash                     # remove all changes from HEAD and save them somewhere else
git checkout <other-project>  # change branches
git cherry-pick <commit-id>   # pick a commit from ANY branch and apply it to the current
git checkout <first-project>  # change to the other branch
git stash pop                 # restore all changes again

22
Щоб буквально зафіксувати лише ті файли, навіть якщо були змінені інші зміни, слід використовувати другий приклад ( git commit [some files]який передбачає --onlyперемикання). Перший приклад ( git add [some files]далі git commit) також здійснить будь-які інші зміни, які були поетапно виконані.
Lexikos

4
Я був би корисним, щоб навести приклади для git commit [деякі файли]. наприклад, як слід замінити [деякі файли], кома, пробіл?
Клавдіу Кріанга

2
@claudiu зазвичай оболонки обмежені простором. І якщо ви пірнаєте досить глибоко, ви можете змінити це на що завгодно
Алекс,

Якщо ви можете додати кілька прикладів, ця відповідь буде чудовою.
Ямур

154

Отримайте список файлів, які ви хочете зробити

$ git status

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

modified:   file1
modified:   file2
modified:   file3
modified:   file4

Додайте файли до постановки

$ git add file1 file2

Перевірте, що ви робите

$ git status

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   file1
    modified:   file2

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   file3
    modified:   file4

Зв’яжіть файли з повідомленням про фіксацію

$ git commit -m "Fixed files 1 and 2"

Якщо ви випадково зробили неправильні файли

$ git reset --soft HEAD~1

Якщо ви хочете зняти файли, почніть спочатку

$ git reset

Unstaged changes after reset:
M file1
M file2
M file3
M file4


30

Дещо з цього видається "незавершеним"

Групи людей НЕ знають, чи варто їм користуватися цитатами тощо.

Додайте 1 конкретний файл, на якому також відображені шляхи розташування

git add JobManager/Controllers/APIs/ProfileApiController.cs

Здійснювати (пам’ятайте, фіксація лише локальна, це не впливає на будь-яку іншу систему)

git commit -m "your message"  

Натисніть на віддалений репо

git push  (this is after the commit and this attempts to Merge INTO the remote location you have instructed it to merge into)

Інші відповіді покажіть приховування тощо, яке вам іноді захочеться зробити


11

Якщо ви вже інсценізували файли, просто зніміть їх:

git reset HEAD [file-name-A.ext] [file-name-B.ext]

Потім додайте їх по черзі назад.


11

Припустимо, ви внесли зміни до кількох файлів, наприклад:

  • Файл1
  • Файл2
  • Файл3
  • Файл4
  • Файл5

Але ви хочете зробити лише зміни файлів File1 та File3.

Для цього є два способи:

1.Завантажте лише ці два файли, використовуючи:

git add file1 file2

потім, здійснити

git commit -m "your message"

потім натисніть,

git push

2.Пряма комісія

git commit file1 file3 -m "my message"

потім натисніть,

git push

Насправді перший метод корисний у тому випадку, якщо ми регулярно змінюємо файли та інсценуємо їх -> Великі проекти, як правило, Живі проекти.
Але якщо ми модифікуємо файли і не інсценізуємо їх, то ми можемо робити прямі зобов'язання -> Малі проекти


Якщо не вказати ім'я файлу, як ви пропонуєте у другому прикладі, git передбачає, що для цих аргументів є прапор команди --only. Тоді це буде та сама команда, що git commit --only file1 --only file3 -m "my message"і використовувати ярлик як git commit -o file1 -o file3 -m "my message"Посилання: git-scm.com/docs/git-commit
користувач

0

Це простий підхід, якщо у вас мало змін коду:

1. git stash
2. git stash apply
3. remove the files/code you don't want to commit
4. commit the remaining files/code you do want

Тоді, якщо ви хочете, щоб код, який ви видалили (біти, які ви не зробили), в окремому комітеті чи іншій гілці, тоді, перебуваючи в цій гілці, виконайте:

5. git stash apply
6. git stash

З кроком 5, як ви вже застосували приховану скриньку та здійснили код, який ви хотіли на кроці 4, розрізнення та відслідковування в нещодавно застосованому скриньку - це лише код, який ви видалили на кроці 3 перед тим, як виконати етап 4.

Оскільки такий крок 6 - це прихований код, який ви не [хотіли] зробити, оскільки ви, мабуть, не хочете втрачати ці зміни, правда? Таким чином, новий скрипт з кроку 6 тепер може бути скоєний у цій чи будь-якій іншій гілці, виконавши застосунок git stash на правильній гілці та здійснивши.

Очевидно, це передбачає, що ви робите кроки в одному потоці, якщо ви зберігаєте в будь-якому іншому пункті цих кроків, вам потрібно буде відзначити скриньку для кожного кроку вище (а не лише основну скриньку та застосувати останню сховку).

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