1. ホーム
  2. ギット

[解決済み】Gitで最後のコミットを2つに分割する方法

2022-03-31 10:07:47

質問

2つの作業用ブランチがあります。 マスター フォーラム で少し修正したところです。 フォーラム ブランチに取り込みたいと思います。 マスター . しかし、残念なことに、私がチェリーピックしたいコミットには、私が望まない修正も含まれています。

解決策としては、おそらく間違ったコミットを削除して、2つの別々のコミットに置き換えることでしょう。1つは私がmasterで選びたい変更で、もう1つはそこに属さない変更です。

試してみたのは

git reset --hard HEAD^

を実行すると、すべての変更が削除されてしまうので、もう一度

git reset ORIG_HEAD

そこで質問なのですが。 にはどのような方法があるのでしょうか? スプリット 最後のコミットを2つの別々のコミットに分割しますか?

解決方法を教えてください。

インデックスを使用する必要があります。ミックスリセットをした後(" ギットリセット HEAD^")に追加します。 最初の変更点をインデックスに登録し、それをコミットします。それから 残りは

"を使用することができます。 git add "を使用すると、ファイルに加えられたすべての変更をインデックスに追加することができます。もし あるファイルに加えられたすべての変更を表示せず、その一部だけを表示させたい場合は git add -p"を使用することができます。

例を見てみましょう。例えば、myfile というファイルがあって、その中に という文章があります。

something
something else
something again

前回のコミットで修正したので、今はこんな感じです。

1
something
something else
something again
2

ここで、2つに分割することにして、挿入するのは 最初の行を最初のコミットに、最後の行を最後のコミットに挿入します。 を2回目のコミットで実行します。

まず、HEADの親に戻りますが、ファイルシステムに変更を残したいです。 というわけで、引数なしで "git reset" を使っています(いわゆる "mixed" を行います。 を使います。)

$ git reset HEAD^
myfile: locally modified
$ cat myfile
1
something
something else
something again
2

さて、私は "git add -p" を使って、コミットしたい変更をインデックスに追加しています(=I 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