<commit_before>---
layout: post
title: piecemeal staging
category: advanced
published: false
---

This is a follow up to the comments from yesterday's article about "interactive adding":http://gitready.com/intermediate/2009/01/14/interactive-adding.html. Readers were begging coverage of powerful @git add -p@, a shortcut to the patch mode of interactive adding. This command is capable of breaking up changes in files into smaller hunks so you can commit *exactly* what you want, and not just the whole file. 

This behavior is very helpful since it allows you to version any "hunk" of text in the file that you'd like. Perhaps that one line of code will break the build on others' machines or the build server, but just not yours. You get the point.

Let's go through an example of using it, making changes to our project's trusty README file again. Here's what @git diff@ gives us from the changes that were just made:

<pre>
diff --git a/README.md b/README.md
index 2556dae..45d8b6e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,14 @@
> There is only one way...
> ~ <NAME>
   
+# Project information
+
+Blah blah blah...
+
# Want to contribute?

If you have ideas about... 
+
+# About
+
+This blog is just awesome.
</pre>

So as we can see, we've made changes in separate parts of the file. However, I want to only commit the lower half. Besides, who really needs documentation anyway? Enter:

@git add -p@

Run this and you'll be greeted with a prompt just like @git add -i@, but it has quite a few options:

<pre>
Stage this hunk [y/n/a/d/s/e/?]? ?
y - stage this hunk
n - do not stage this hunk
[... removed a few ...]
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
</pre>

Most are pretty self-explanatory, but let"s go over the really cool ones. What we really want is the @s@ option, which will split the file into two smaller hunks of code, one for the higher "Project Information" block and one for the "About" block. Once it"s split it will prompt you with just the changes for that hunk:

<pre>
Split into 2 hunks.
@@ -1,6 +1,10 @@
> There is only one way...
> ~ <NAME>

+# Project information
+
+Blah blah blah...
+
# Want to contribute?

If you have ideas about...
Stage this hunk [y/n/a/d/j/J/e/?]? n
</pre>

From here we can ignore it with @n@, and move on to the next one and add it with @y@:

<pre>
@@ -4,3 +8,7 @@
# Want to contribute?

If you have ideas about...
+
+# About
+
+This blog is just awesome.
Stage this hunk [y/n/a/d/K/e/?]? y
</pre>

Doing a @git status@ will show changes to be committed and changes to be staged on one file. Strange, but it makes sense: we staged half the changes, and the other half are not yet added to the index. 

There's also the @e@ option, which will let you to manually flip the hunks on and off in your favorite editor. Instructions are included with that option, so go play around with it when you get the chance. (No pun intended.)

If you've got any stories as to how @git add -p@ has helped you (or if a neat feature was missed), let us know in the comments! <commit_msg>German translation: 2009-01-15-piecemeal-staging<commit_after>---
layout: post
title: Stückweise Übergaben an den Index
category: advanced
published: true
translated: true
---

Das ist eine Fortschreibung des gestrigen Artikels über das "interactive
Hinzufügen":http://de.gitready.com/intermediate/2009/01/14/interactive-adding.html.
Die Leser baten um einen Artikel zum mächtigen @git add -p@ Kommando, eine Abkürzung zum
Patch-Modus beim interaktiven Hinzufügen. Dieses Kommando ist in der Lage,
Änderungen in Dateien in kleinere Brocken (hunks) aufzuteilen, so dass du
*exakt* das übergeben (commit) kannst, was du möchtest, und nicht nur die
gesamte Datei.

Das Verhalten ist sehr hilfreich. Es erlaubt jeden "Textbrocken" (hunk) in
einer Datei zu versionieren. Die Codezeile bricht vielleicht den Build auf den
Maschinen anderer oder auf dem Build-Server, aber nicht bei dir. Du verstehst,
was ich meine.

Gehen wir durch ein Beispiel und nehmen wieder Änderungen an der README Datei
vor. @git diff@ zeigt uns folgende vorgenommenen Änderungen an:

<pre>
diff --git a/README.md b/README.md
index 2556dae..45d8b6e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,14 @@
> There is only one way...
> ~ <NAME>
   
+# Project information
+
+Blah blah blah...
+
# Want to contribute?

If you have ideas about... 
+
+# About
+
+This blog is just awesome.
</pre>

Es wurden Änderungen an verschiedenen Stellen in der Datei vorgenommen. Ich
möchte jedoch nur die untere Hälfte übergeben. Außerdem, wer braucht schon
wirklich Dokumentation? Gib folgendes ein:

@git add -p@

Und du wirst mit einer Eingabeaufforderung begrüßt, ähnlich wie
sie @git add -i@ anbietet, aber sie hat ziemlich viele Optionen:

<pre>
Stage this hunk [y/n/a/d/s/e/?]? ?
y - stage this hunk
n - do not stage this hunk
[... removed a few ...]
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
</pre>

Die meisten Optionen sind selbsterklärend, aber wir gehen einfach über die
wirklich coolen Optionen. Wir fokusieren uns auf die @s@ Option, die die Datei
in kleinere Code-Brocken (hunks) aufteilen wird, einen oberen "Project
Information" Block und einen unteren About" Block. Sobald alles aufgeteilt ist,
wird es dich nur zu den Änderungen zu diesem Brocken befragen:

<pre>
Split into 2 hunks.
@@ -1,6 +1,10 @@
> There is only one way...
> ~ <NAME>

+# Project information
+
+Blah blah blah...
+
# Want to contribute?

If you have ideas about...
Stage this hunk [y/n/a/d/j/J/e/?]? n
</pre>

Hier ignorieren wir den Brocken mit @n@ und gehen weiter zum nächsten Brocken
und fügen ihn mit @y@ hinzu:

<pre>
@@ -4,3 +8,7 @@
# Want to contribute?

If you have ideas about...
+
+# About
+
+This blog is just awesome.
Stage this hunk [y/n/a/d/K/e/?]? y
</pre>

@git status@ zeigt uns die zu übergebenden Änderungen und die Änderungen, die
für eine Datei auf die Arbeitsbühne (stage) kommen. Komisch, aber es macht
Sinn: Wir haben die Hälfte der Änderungen auf die Arbeitsbühne gehoben und die
andere Hälfte wurde noch nicht zum Index hinzugefügt.

Es gibt auch die @e@ Option, die das manuelle An- und Abschalten der Brocken in
deinem Lieblingseditor erlaubt. Die Option beinhaltet Instruktionen, spiele
also damit ein wenig herum, sobald du die Gelegenheit dazu hast (Das ist kein
Wortspiel).

Solltest du weitere Geschichten haben, wie dir @git add -p@ geholfen hat (oder
falls ein Feature fehlt), teile es uns in einem Kommentar mit!
{'fraction_non_alphanumeric': 0.08885150634653617, 'fraction_numerical': 0.012540143752867411, 'mean_word_length': 3.7702407002188183, 'pattern_counts': {'":': 2, '<': 23, '<?xml version=': 0, '>': 31, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4615754', 'n_tokens_mistral': 2248, 'n_tokens_neox': 2185, 'n_words': 1009}