- 
  
1. Начало
- 1.1 За Version Control системите
 - 1.2 Кратка история на Git
 - 1.3 Какво е Git
 - 1.4 Конзолата на Git
 - 1.5 Инсталиране на Git
 - 1.6 Първоначална настройка на Git
 - 1.7 Помощна информация в Git
 - 1.8 Обобщение
 
 - 
  
2. Основи на Git
 - 
  
3. Клонове в Git
 - 
  
4. GitHub
 
- 
  
5. Git инструменти
- 5.1 Избор на къмити
 - 5.2 Интерактивно индексиране
 - 5.3 Stashing и Cleaning
 - 5.4 Подписване на вашата работа
 - 5.5 Търсене
 - 5.6 Манипулация на историята
 - 5.7 Мистерията на командата Reset
 - 5.8 Сливане за напреднали
 - 5.9 Rerere
 - 5.10 Дебъгване с Git
 - 5.11 Подмодули
 - 5.12 Пакети в Git (Bundling)
 - 5.13 Заместване
 - 5.14 Credential Storage система
 - 5.15 Обобщение
 
 - 
  
6. Настройване на Git
- 6.1 Git конфигурации
 - 6.2 Git атрибути
 - 6.3 Git Hooks
 - 6.4 Примерна Git-Enforced политика
 - 6.5 Обобщение
 
 - 
  
7. Git и други системи
- 7.1 Git като клиент
 - 7.2 Миграция към Git
 - 7.3 Обобщение
 
 - 
  
8. Git на ниско ниво
- 8.1 Plumbing и Porcelain команди
 - 8.2 Git обекти
 - 8.3 Git референции
 - 8.4 Packfiles
 - 8.5 Refspec спецификации
 - 8.6 Транспортни протоколи
 - 8.7 Поддръжка и възстановяване на данни
 - 8.8 Environment променливи
 - 8.9 Обобщение
 
 - 
  
9. Приложение A: Git в други среди
 
- 
  
10. Приложение B: Вграждане на Git в приложения
- 10.1 Git от команден ред
 - 10.2 Libgit2
 - 10.3 JGit
 - 10.4 go-git
 - 10.5 Dulwich
 
 - 
  
A1. Приложение C: Git команди
- A1.1 Настройки и конфигурация
 - A1.2 Издърпване и създаване на проекти
 - A1.3 Snapshotting
 - A1.4 Клонове и сливане
 - A1.5 Споделяне и обновяване на проекти
 - A1.6 Инспекция и сравнение
 - A1.7 Дебъгване
 - A1.8 Patching
 - A1.9 Email команди
 - A1.10 Външни системи
 - A1.11 Административни команди
 - A1.12 Plumbing команди
 
 
5.2 Git инструменти - Интерактивно индексиране
Интерактивно индексиране
В тази секция ще разгледаме няколко интерактивни Git команди, позволяващи да настроите къмитите си така, че да включват само определени файлове, комбинации от файлове или части от файлове. Това е полезно в случай, че сте направили промени по много файлове и след това искате промените да бъдат въведени като няколко организирани логически къмита, а не наведнъж в един голям и объркващ къмит. По този начин улеснявате вашите колеги, които евентуално биха искали да разгледат и разберат вашия принос.
Ако изпълните git add с параметър -i или --interactive, Git минава в интерактивен шел режим, показвайки нещо такова:
$ git add -i
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
*** Commands ***
  1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp
What now>
Може да видите, че тази команда показва съвсем различен изглед на индексната ви област — в общи линии получавате резултатите от git status, но по един по-кратък и информативен начин.
Тя извежда промените, които сте индексирали отляво, както и неиндексираните отдясно.
След това идва “Commands” секцията, която ви позволява множество действия като индексиране и деиндексиране на файлове, индексиране на част от файлове, добавяне на нови файлове и показване на diffs на индексираните данни.
Добавяне и изваждане от индекса
Ако въведете u или 2 (за обновяване) в промпта What now>, ще бъдете запитани кои файлове искате да вкарате в индексната област:
What now> u
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>
За да индексирате TODO и index.html, може да въведете номерата им в списъка:
Update>> 1,2
           staged     unstaged path
* 1:    unchanged        +0/-1 TODO
* 2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>
Символът \* до всеки от файловете сега индикира, че съответния файл е избран за индексиране.
Ако сега натиснете Enter в промпта Update>> без да въвеждате друго, Git взема всички избрани файлове и ги вкарва в индекса:
Update>>
updated 2 paths
*** Commands ***
  1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp
What now> s
           staged     unstaged path
  1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Сега може да видите, че TODO и index.html файловете са индексирани, докато simplegit.rb все още не е.
Сега може да извадите от индекса файла TODO избирайки опцията r или 3 (за revert):
*** Commands ***
  1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp
What now> r
           staged     unstaged path
  1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Revert>> 1
           staged     unstaged path
* 1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Revert>> [enter]
reverted one path
Поглеждайки отново във вашия Git status, може да видите, че TODO вече е извън индекса:
*** Commands ***
  1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp
What now> s
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Ако искате diff на индексираното, използвайте командата d или 6 (за diff).
Тя показва списък на индексираните файлове и може да изберете тези, за които искате да видите индексирания diff.
Това е съвсем същото като да изпълните git diff --cached в нормалния команден ред:
*** Commands ***
  1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp
What now> d
           staged     unstaged path
  1:        +1/-1      nothing index.html
Review diff>> 1
diff --git a/index.html b/index.html
index 4d07108..4335f49 100644
--- a/index.html
+++ b/index.html
@@ -16,7 +16,7 @@ Date Finder
 <p id="out">...</p>
-<div id="footer">contact : support@github.com</div>
+<div id="footer">contact : email.support@github.com</div>
 <script type="text/javascript">
С тези основни команди може да улесните работата си с индексната област.
Индексиране на пачове
Също така може да вкарате в индекса само определени части от файлове, вместо всички промени.
Например, ако сте направили две промени във файла simplegit.rb, но искате да индексирате само едната, можете да го направите лесно с Git.
От същия интерактивен промпт, въведете p или 5 (за patch).
Git ще ви попита кои файлове искате да индексирате частично. След това, за всяка секция от избраните файлове, ще ви бъдат показани големи парчета diff информация от всеки файл (hunks) и ще бъдете попитани дали искате да ги индексирате, едно по едно:
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd5ecc4..57399e0 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -22,7 +22,7 @@ class SimpleGit
   end
   def log(treeish = 'master')
-    command("git log -n 25 #{treeish}")
+    command("git log -n 30 #{treeish}")
   end
   def blame(path)
Stage this hunk [y,n,a,d,/,j,J,g,e,?]?
В този момент имате цял куп опции как да продължите.
Въведете ? за помощна информация:
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? ?
y - индексира текущото парче код (hunk)
n - пропуска този hunk
a - индексира този и всички останали hunks от файла
d - отменя индексирането на този и всички останали hunks от файла
g - избор на hunk към който да се премине
/ - търсене на hunk по регулярен израз (regex)
j - оставя текущия hunk без решение, показва следващия нерешен hunk
J - оставя текущия hunk без решение, показва следващия hunk
k - оставя текущия hunk без решение, показва предишния нерешен hunk
K - оставя текущия hunk без решение, показва предишния hunk
s - разделя текущия hunk на по-малки части
e - ръчна редакция на текущия hunk
? - показва помощната информация
Обикновено, ще избирате опциите y или n, ако искате да индексирате всеки hunk, но индексирането им наведнъж в определени файлове или отлагането на решението за даден hunk за по-късно, също може да е полезно.
Ако индексирате една част от файл и оставите друга извън индекса, статуса може да изглежда така:
What now> 1
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:        +1/-1      nothing index.html
  3:        +1/-1        +4/-0 lib/simplegit.rb
Интересната част е в реда на simplegit.rb.
Той показва, че част от редовете код във файла са индексирани, а други не.
Така имате частично индексиран файл.
Сега можете да излезете от интерактивния промпт и да изпълните git commit за да къмитнете частично индексираните файлове.
Използването на интерактивния промпт не е единствения начин да постигнете това — може да стартирате същата процедура използвайки git add -p или git add --patch от командния ред.
Освен това, можете да използвате patch режима за частично възстановяване на файлове с командата git reset --patch, за изваждане в работната област на част от файлове с git checkout --patch, а също и за stashing на части от файлове с git stash save --patch.
Ще видим повече подробности за тези команди по-натам в книгата.