2015-05-25 5 views
4

Я попытался предложение здесь:Как вы создаете части нового файла?

How to stage only part of a new file with git?

git add -N new_file 
git add -i 

Но я не могу заставить его работать, так как интерактивный режим представляет весь файл без s выбора, который позволил бы мне разделять файл на более мелкие части и тем самым составлять часть файла:

~/git_practice$ git init my_project 
Initialized empty Git repository in /Users/7stud/git_practice/.git/ 

~/git_practice$ cd my_project 

~/git_practice/my_project$ git status 
On branch master 

Initial commit 

nothing to commit (create/copy files and use "git add" to track) 

~/git_practice/my_project$ echo This is the README file. > README.txt 
~/git_practice/my_project$ ls 
README.txt 

~/git_practice/my_project$ git status 
On branch master 

Initial commit 

Untracked files: 
    (use "git add <file>..." to include in what will be committed) 

    README.txt 

nothing added to commit but untracked files present (use "git add" to track) 

~/git_practice/my_project$ git add README.txt 
~/git_practice/my_project$ git commit -m "Add README file." 
[master (root-commit) e815ed7] Add README file. 
1 file changed, 1 insertion(+) 
create mode 100644 README.txt 

~/git_practice/my_project$ git status 
On branch master 
nothing to commit, working directory clean 

~/git_practice/my_project$ git checkout -b new_feature 
Switched to a new branch 'new_feature' 

~/git_practice/my_project$ m new_feature.rb 

(м является установка псевдонима I для mvim команды, которая запускает MacVim текстовый редактор.)

Это код, который я вошел в new_feature.rb:

def addition(x, y) 
    x+y 
end 

def substraction(x,y) 
    x-y 
end 

#Uh oh! I got carried away and created two new features. 
#I want to split addition/subtraction into two commits. 

Назад в командной строке:

~/git_practice/my_project$ git add -p new_feature.rb 
No changes. 

Это не сработало. Вместо этого, я должен был сделать:

~/git_practice/my_project$ git add -N new_feature.rb 

Насколько я могу сказать, что по существу добавляет пустую версию new_feature.rb в промежуточной области; то вы можете патч что пустой файл с частью кода в new_feature.rb:

~/git_practice/my_project$ git add -i new_feature.rb 

      staged  unstaged path 
    1:  +0/-0  +10/-0 new_feature.rb 

*** Commands *** 
    1: status 2: update 3: revert 4: add untracked 
    5: patch 6: diff  7: quit  8: help 

-i выступает за интерактивного. Вы запрашиваете git для интерактивного запроса вопросов о том, как добавить файл в промежуточную область. В ответ git отображает меню с различными вариантами. Вы можете ввести номер предшествующего выбор или первую букву выбора (например p для патча):

What now> p 
      staged  unstaged path 
    1:  +0/-0  +10/-0 new_feature.rb 

Там может быть более чем один файл в списке, так что вы должны выбрать номер перед именем файла, который вы хотите пропатчить (числа под staged указуют, что поставила версия файла пустая, в то время как номера под unstaged показывают, что unstaged файл имеет 10 новых линий по сравнению с ступенчатой ​​версией):

Patch update>> 1 
      staged  unstaged path 
* 1:  +0/-0  +10/-0 new_feature.rb 

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

Patch update>> <Hit Return> 

diff --git a/new_feature.rb b/new_feature.rb 
index e69de29..b44829e 100644 
--- a/new_feature.rb 
+++ b/new_feature.rb 
@@ -0,0 +1,10 @@ 
+def addition(x, y) 
+ x+y 
+end 
+ 
+def substraction(x,y) 
+ x-y 
+end 
+ 
+#Uh oh! I got carried away and created two new features. 
+#I want to separate addition/subtraction into two commits. 

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

Согласно ответу:

Мне нужно выбрать e вариант, который представляет этот текст:

# Manual hunk edit mode -- see bottom for a quick guide      
@@ -0,0 +1,10 @@                
+def addition(x, y)               
+ x+y                   
+end                   
+                    
+def substraction(x,y)               
+ x-y                   
+end                   
+                    
+#Uh oh! I got carried away and created two new features.      
+#I want to separate addition/subtraction into two commits.     
# ---                   
# To remove '-' lines, make them ' ' lines (context).       
# To remove '+' lines, delete them.           
# Lines starting with # will be removed.          
#                    
# If the patch applies cleanly, the edited hunk will immediately be   
# marked for staging. If it does not apply cleanly, you will be given   
# an opportunity to edit again. If all lines of the hunk are removed,   
# then the edit is aborted and the hunk is left unchanged.      
~                    
~                    
"~/git_practice/my_project/.git/addp-hunk-edit.diff" 21L, 671C 

Редактирование этого файла не изменяет исходный файл (new_feature.rb). Результаты редактирования этого файла и сохранения его будут частью файла, который будет поставлен, например.вот мой редактировать:

# Manual hunk edit mode -- see bottom for a quick guide      
@@ -0,0 +1,10 @@                
+def addition(x, y)               
+ x+y                   
+end                   


# ---                   
# To remove '-' lines, make them ' ' lines (context).       
# To remove '+' lines, delete them.           
# Lines starting with # will be removed.          
#                    
# If the patch applies cleanly, the edited hunk will immediately be   
# marked for staging. If it does not apply cleanly, you will be given   
# an opportunity to edit again. If all lines of the hunk are removed,   
# then the edit is aborted and the hunk is left unchanged.      
~                    
~                    
"~/git_practice/my_project/.git/addp-hunk-edit.diff" 21L, 671C 

Затем после сохранения и выхода из текстового редактора:

git commit -m "Add addition() method." 

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

~/git_practice/my_project$ git diff new_feature.rb 

diff --git a/new_feature.rb b/new_feature.rb 
index 6579fef..b44829e 100644 
--- a/new_feature.rb 
+++ b/new_feature.rb 
@@ -1,3 +1,10 @@ 
def addition(x, y) 
    x+y 
end 
+ 
+def substraction(x,y) 
+ x-y 
+end 
+ 
+#Uh oh! I got carried away and created two new features. 
+#I want to separate addition/subtraction into two commits. 

blank в начале строки означает, что линия является общим совершенному файл и исходный файл. A + в начале строки означает, что строка не отображается в зафиксированном файле, но строка отображается в исходном файле. (И знак - в начале строки означает, что строка отображается в зафиксированном файле, но не в исходном файле.) Для получения дополнительной информации о чтении diff, в том числе о том, что означает @@ -1,3 +1,10 @@, см. here.

Затем я повторил процесс для второго метода: (. Эта команда эквивалентна git add -i new_feature.rb, а затем выбирая р пункт меню ATCH)

git add -p new_feature.rb 

После выбора e, только я должен был удалить мой комментарий в конце файла:

+#Uh oh! I got carried away and created two new features.      
+#I want to separate addition/subtraction into two commits. 

Затем, другие совершают:

git commit -m "Add subtraction() method." 

Тогда я был оставлен с исходным файлом, содержащим комментарий в нижней части, которые я не хочу в этом файле. Кроме того, комментарий вызвал появление new_feature.rb в git status в качестве измененного файла, поскольку в заверенной версии не было комментария. Таким образом, я сбросить исходный файл, что мерзавец знает:

git checkout new_feature.rb 

Это стирает все различия между совершенным файлом и unstaged исходного файлом - и невозвратный.

Это дал мне чистую git status:

$ git status 
On branch new_feature 
nothing to commit, working directory clean 

А вот история коммитов:

$ git log 

commit 70c566157a0f41052c6091ce9025d8b95722015f 
Author: 7stud <[email protected]> 
Date: Tue May 26 13:06:21 2015 0000 

    Add subtraction() method. 

commit 2ca5952c53bae7bc407d21cb3601395886d2cd4c 
Author: 7stud <[email protected]> 
Date: Tue May 26 13:05:41 2015 0000 

    Add addition() method. 

commit 72ae28cbd1d7cf998eca5862b18e2af45b58f752 
Author: 7stud <[email protected]> 
Date: Tue May 26 13:00:55 2015 0000 

    Add README file. 

ответ

3

Там нет неизменных строк в вашем ломте, поэтому вы не можете разделить его. Используйте команду e и вручную отредактируйте свой diff. Использование vim особенно полезно здесь для усовершенствованных функций редактирования линии.

Это будет выглядеть следующим образом:

# Manual hunk edit mode -- see bottom for a quick guide 
@@ -0,0 +1,10 @@ 
+def addition(x, y) 
+ x+y 
+end 
+ 
+def substraction(x,y) 
+ x-y 
+end 
+ 
+#Uh oh! I got carried away and created two new features. 
+#I want to separate addition/subtraction into two commits. 
# --- 
# To remove '-' lines, make them ' ' lines (context). 
# To remove '+' lines, delete them. 
# Lines starting with # will be removed. 
# 
# If the patch applies cleanly, the edited hunk will immediately be 
# marked for staging. If it does not apply cleanly, you will be given 
# an opportunity to edit again. If all lines of the hunk are removed, 
# then the edit is aborted and the hunk is left unchanged. 
+0

Спасибо за ответ. * В вашем hunk нет неизменных строк * - Я не знаю, что это значит? Это * новый * файл, поэтому нет, что по определению означает, что ничего не изменилось *? * Используйте команду e и вручную отредактируйте свой diff * - я не знаю, что это значит, в любом случае я читал, что весь смысл создания промежуточной области заключается в том, что вы можете адаптировать свои коммиты - и Я хочу использовать одну фиксацию для одного метода и другую фиксацию для другого метода. Git не может этого сделать? – 7stud

+0

@ 7stud 1.Для разделения на работу изменения должны иметь минимальное расстояние. Он не будет работать в новом файле. 2. Используйте 'e' вместо' s'. Он выведет вас в редактор, чтобы вручную отредактировать diff. Файл в рабочем дереве останется неизменным, и только ваш diff будет применен к вашему индексу. – TimWolla

+0

Ах, я вижу. Я думал, что редактирование этого файла изменит мой оригинальный файл. Одна проблема: я не хочу комментировать мой комментарий в конце файла. Поэтому после того, как я передаю каждый метод отдельно, я остаюсь с * измененным * файлом с комментарием в конце. Как я могу избавиться от файла? git rm? – 7stud