Я попытался предложение здесь:Как вы создаете части нового файла?
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.
Спасибо за ответ. * В вашем hunk нет неизменных строк * - Я не знаю, что это значит? Это * новый * файл, поэтому нет, что по определению означает, что ничего не изменилось *? * Используйте команду e и вручную отредактируйте свой diff * - я не знаю, что это значит, в любом случае я читал, что весь смысл создания промежуточной области заключается в том, что вы можете адаптировать свои коммиты - и Я хочу использовать одну фиксацию для одного метода и другую фиксацию для другого метода. Git не может этого сделать? – 7stud
@ 7stud 1.Для разделения на работу изменения должны иметь минимальное расстояние. Он не будет работать в новом файле. 2. Используйте 'e' вместо' s'. Он выведет вас в редактор, чтобы вручную отредактировать diff. Файл в рабочем дереве останется неизменным, и только ваш diff будет применен к вашему индексу. – TimWolla
Ах, я вижу. Я думал, что редактирование этого файла изменит мой оригинальный файл. Одна проблема: я не хочу комментировать мой комментарий в конце файла. Поэтому после того, как я передаю каждый метод отдельно, я остаюсь с * измененным * файлом с комментарием в конце. Как я могу избавиться от файла? git rm? – 7stud