Как зафиксировать только некоторые файлы?

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

Как зафиксировать только эти файлы?


person Nips    schedule 30.08.2011    source источник
comment
Эти два проекта подключены к одному и тому же репозиторию git?   -  person Oleksandr    schedule 30.08.2011
comment
Да, это тот же репозиторий, но я не хочу помещать свою ветку на сервер   -  person Nips    schedule 30.08.2011
comment
Так почему бы вам не объединить свою новую ветку с мастером (или другой официальной веткой)   -  person Oleksandr    schedule 30.08.2011
comment
Ответы на эти вопросы помогут вам: заголовок stackoverflow.com/questions/7161860/ stackoverflow.com/questions/7175869/   -  person eckes    schedule 30.08.2011


Ответы (8)


Я полагаю, вы хотите зафиксировать изменения в одной ветке, а затем сделать эти изменения видимыми в другой ветке. В 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
person Alexander Oh    schedule 30.08.2011
comment
Чтобы буквально зафиксировать только эти файлы, даже если были подготовлены другие изменения, следует использовать второй пример (git commit [some files], который подразумевает переключатель --only). Первый пример (git add [some files], за которым следует git commit) также зафиксирует любые другие изменения, которые были подготовлены. - person Lexikos; 09.03.2013
comment
Было бы полезно привести примеры для git commit [некоторые файлы]. например, как вы должны заменить [некоторые файлы], запятую, пробел? - person Claudiu Creanga; 26.03.2015
comment
@claudiu обычно использует оболочки с разделителями-пробелами. И если вы погрузитесь достаточно глубоко, вы можете изменить это на что угодно - person Alexander Oh; 26.03.2015
comment
Если вы можете добавить несколько примеров, этот ответ будет отличным. - person Yamur; 01.06.2020

Получить список файлов, которые вы хотите зафиксировать

$ 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
person Abram    schedule 05.05.2015
comment
Это не правильно. Я сделал git add file1 file2, а затем git commit -m "Fixed files 1 and 2", и он зафиксировал ВСЕ файлы. - person Binar Web; 23.04.2021

Вы можете зафиксировать некоторые обновленные файлы, например:

git commit file1 file2 file5 -m "commit message"
person Adriano Rivolli    schedule 22.07.2016

Некоторые из них кажутся «неполными».

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

Добавить 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)

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

person Tom Stickel    schedule 21.10.2016

Предположим, вы внесли изменения в несколько файлов, например:

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

Но вы хотите зафиксировать только изменения File1 и File3.

Это можно сделать двумя способами:

1. Подготовьте только эти два файла, используя:

git add file1 file3

затем совершить

git commit -m "your message"

затем нажмите,

git push

2.Прямая фиксация

git commit file1 file3 -m "your message"

затем нажмите,

git push

На самом деле первый метод полезен в случае, если мы регулярно изменяем файлы и размещаем их --› Крупные проекты, как правило, Live проекты.
Но если мы изменяем файлы, а не размещаем их, тогда мы можем сделать прямую фиксацию --› небольшие проекты

person KamalDeep    schedule 27.07.2017
comment
Если не указывать имя файла, как предлагает второй пример, 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 - person user; 30.10.2018

Если вы уже разместили файлы, просто удалите их:

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

Затем постепенно добавляйте их обратно.

person kaiser    schedule 30.06.2014

Я думаю, вы также можете использовать командную строку:

git add -p

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

Затем у вас есть несколько вариантов, которые будут появляться для каждой модификации: я использую y для «да», я хочу добавить этот файл, и n для «нет», я зафиксирую этот файл позже.

Stage this hunk [y,n,q,a,d,K,g,/,e,?]?

Что касается других опций ( q,a,d,K,g,/,e,? ), я не уверен, что они делают, но я думаю, что ? может помочь вам, если вам нужно углубиться в детали.

Самое замечательное в этом то, что вы можете затем отправить свою работу и создать новую ветку после, и вся незафиксированная работа последует за вами в этой новой ветке. Очень полезно, если вы написали много разных вещей и действительно хотите реорганизовать свою работу на github, прежде чем отправлять ее.

Надеюсь, это поможет, я не видел, чтобы это было сказано ранее (если это было упомянуто, мой плохой)

person MilanDemoniack    schedule 25.01.2021

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

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, diff и untracked во вновь примененном тайнике — это просто код, который вы удалили на шаге 3, прежде чем вы зафиксировали на шаге 4.

Таким образом, шаг 6 представляет собой тайник с кодом, который вы не [хотели] коммитить, поскольку вы, вероятно, действительно не хотите терять эти изменения, верно? Таким образом, новый тайник из шага 6 теперь можно зафиксировать в этой или любой другой ветке, выполнив git stash apply в правильной ветке и зафиксировав ее.

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

person James    schedule 09.04.2020