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


260

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

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


Эти два проекта подключены к одному и тому же git-репозиторию?
Александр

Да, это тот же репозиторий, но я не хочу помещать свою ветку на сервер
Nips

Так почему бы вам не объединить свою новую ветку с мастером (или другой официальной веткой)
Александр

1
Вам помогут ответы на эти вопросы: stackoverflow.com/questions/7161860/… stackoverflow.com/questions/7175869/…
eckes

Ответы:


262

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

Если вы можете добавить несколько примеров, этот ответ будет отличным.
Ямур

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

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

  • File1
  • File2
  • file3
  • file4
  • file5

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.