と の 2 つのブランチがありmaster
、forum
にいくつか変更を加えたので、forum
それを にチェリーピックしたいと考えていますmaster
。しかし残念なことに、チェリーピックしたいコミットには、不要な変更も含まれています。
解決策としては、間違ったコミットを何らかの方法で削除し、それを 2 つの別々のコミットに置き換え、1 つには選択したい変更をmaster
、もう 1 つには残りの変更をそれぞれ含めるという方法があると思われます。
私はやってみた
git reset --hard HEAD^
すべての変更が削除されたので、
git reset ORIG_HEAD
私の質問は、最後のコミットを 2 つの別々のコミットに分割する最良の方法は何ですか?
ベストアンサー1
インデックスを使用する必要があります。混合リセット("git リセットHEAD^" の場合、最初の変更セットをインデックスに追加してコミットします。その後、残りの変更をコミットします。
「git 追加" を使用すると、ファイルに加えられたすべての変更がインデックスに追加されます。ファイルに加えられたすべての変更をステージングするのではなく、一部の変更のみをステージングする場合は、"git add -p" を使用できます。
例を見てみましょう。次のテキストを含む myfile というファイルがあるとします。
something
something else
something again
前回のコミットで修正したので、次のようになりました。
1
something
something else
something again
2
ここで、これを 2 つに分割し、最初の行の挿入を最初のコミットに、最後の行の挿入を 2 番目のコミットに行うことにしました。
まず HEAD の親に戻りますが、ファイル システムの変更を保持したいので、引数なしで「git reset」を使用します (いわゆる「混合」リセットを実行します)。
$ git reset HEAD^
myfile: locally modified
$ cat myfile
1
something
something else
something again
2
ここで、「git add -p」を使用して、コミットする変更をインデックスに追加します (= ステージングします)。「git add -p」は、ファイルにどのような変更を加えたらインデックスに追加するかを尋ねる対話型ツールです。
$ git add -p myfile
diff --git a/myfile b/myfile
index 93db4cb..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,5 @@
+1
something
something else
something again
+2
Stage this hunk [y,n,a,d,/,s,e,?]? s # split this section into two!
Split into 2 hunks.
@@ -1,3 +1,4 @@
+1
something
something else
something again
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? y # yes, I want to stage this
@@ -1,3 +2,4 @@
something
something else
something again
+2
Stage this hunk [y,n,a,d,/,K,g,e,?]? n # no, I don't want to stage this
次に、この最初の変更をコミットします。
$ git commit -m "Added first line"
[master cef3d4e] Added first line
1 files changed, 1 insertions(+), 0 deletions(-)
これで、他のすべての変更 (つまり、最後の行に入力された数字の「2」) をコミットできます。
$ git commit -am "Added last line"
[master 5e284e6] Added last line
1 files changed, 1 insertions(+), 0 deletions(-)
ログをチェックして、どのようなコミットがあるか確認してみましょう。
$ git log -p -n2 | cat
Commit 5e284e652f5e05a47ad8883d9f59ed9817be59d8
Author: ...
Date: ...
Added last line
Diff --git a/myfile b/myfile
Index f9e1a67..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -2,3 +2,4 @@
something
something else
something again
+2
Commit cef3d4e0298dd5d279a911440bb72d39410e7898
Author: ...
Date: ...
Added first line
Diff --git a/myfile b/myfile
Index 93db4cb..f9e1a67 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,4 @@
+1
something
something else
something again