2012-05-05 3 views
1

Я новичок в git для контроля источника. Я хочу удостовериться, что я все понимаю, поскольку я иду, хотя, и очень рано я ударил что-то, что кажется странным.Почему я должен добавлять файлы, отслеживаемые перед фиксацией?

Вот что я делаю:

  1. Создать новый репозиторий на GitHub. Он предлагает сделать «стандартный» файл C# .gitignore, который звучит великолепно, поэтому я говорю «да».
  2. Я вижу, что есть как Readme, так и .gitignore, созданные с помощью репозитория.
  3. Я клонировал это репо на свою машину, используя git clone [repo location] [local folder]
  4. Редактирование файла .gitignore для добавления некоторых дополнительных игнорируемых файлов и папок.
  5. Я ввожу git commit, в котором сообщается сообщение «Изменения не поставлены для фиксации», но перечисляет .gitignore как измененный.

Так что, в конце концов, я добавляю его, фиксирую и возвращаю обратно в начало координат, которое показывает мои изменения на GitHub. Так что все хорошо.

Это похоже на меня. Если .gitignore не отслеживался, как в мире его снимали с помощью git clone? Почему я должен добавить его вручную, прежде чем он разрешит мне внести изменения?

ответ

8

Это как мерзавец просмотров ваше хранилище:

repository --- staging area --- working directory 

В хранилище, вы получите все, что совершается, во всех местных отделениях или fetch эд удаленных филиалов. В рабочем каталоге у вас есть все ваши файлы, извлеченные из какой-либо фиксации, которые могут быть изменены. Промежуточная область - это место, где вы добавляете файлы, которые необходимо совершить, но они еще не совершены. Это потому, что в git вы можете выбрать, что совершить (в отличие от svn, например, что вы совершаете все, что было изменено).

Я настоятельно рекомендую прочитать this article, что, хотя он сфокусирован на git reset, он дает очень хороший обзор того, как работает git.

Вот небольшая картина этого:

repository --- staging area --- working directory 
    |     |     | 
    |     |     | 
    |    Check out    | 
    |-------------------------------------->| 
    |     |     | 
    |     |   add  | 
    |     |<-------------------| 
    |     |     | 
    |  commit  |     | 
    |<-----------------|     | 

кассе совершенно очевидна. Второе означает, что вы выборочно добавляете файлы в промежуточную область, а затем выполняете их. Например:

$ touch file1 file2 file3 file4 # modify files 
$ git add file1 
$ git add file2 
$ git commit 

совершает только file1 и file2 даже если file3 и file4 также изменяются.

Иногда все, что вам нужно, это совершить все, что у вас есть.Существует ярлык для этого:

$ touch file1 file2 file3 file4 # modify files 
$ git commit -a 

git commit данного -a опции автоматически добавляет все измененные файлы для фиксации.

Вы можете даже сфабриковать части файлов, которые выполняются git add -p, в котором в основном показаны фрагменты патча фиксации и вы можете выбрать, какие изменения будут поставлены, а что нет. Позже, с git commit, вы можете совершить все, что было поставлено.

+0

Это отличное объяснение, и статья очень помогла (как с этим, так и с вопросами, которые я имел о 'git reset') –

+0

Я знаю, правильно? 'git reset' может стать очень запутанным, но эта статья делает его очень простым. – Shahbaz

+0

Особенно подходит для svn-фона, где нет промежуточной области. Но очень круто. –

6

Это не относится к .gitignore. Вам всегда нужно сгенерировать измененные файлы, используя git add, прежде чем вы сможете их совершить, если только вы не используете git commit -a, который автоматически фиксирует все изменения.

More information about tracking and staging in the Git book.

Смежные вопросы