0

次のgit履歴があると想像してください。

a ----- b ----- c
               HEAD  

ここで、HEADはcにあります。

今、私は(a)にバグを見つけましたが、これは明らかに(b)と(c)にもあります。私が今やりたいのは、(a)のコードを変更(バグを修復)し、(b)と(c)でも同じものを更新したいということです。gitでこれをどのように行う必要がありますか?

ありがとう

4

2 に答える 2

4

あなたの質問から、バグがないように履歴を表示したいようです。
次のようなことができます。

  • 新しい通常のコミットでバグを修正します。これを commit と呼びますd
  • 対話型リベースを使用: git rebase -i <hash-of-commit-before-a>.
    表示されるエディター ウィンドウで、コミット a、b、c、d がそれぞれ新しい行に表示され、pickその前にコマンド ( ) が付きます。
  • 新しいコミットを含む行がコミットを表す行の直後になるように行を並べ替えaます (2 行目にある必要があります)。
  • 新しいコミットの前のコマンドを(デフォルトではsquashなく) に変更します。 これにより、新しいコミットが最初のコミット にマージされます。pick
    da

これらのコミットを別のリポジトリにプッシュした場合、リベースはお勧めできません。簡単に言えば、これは、既存のコミットを並べ替えるだけでなく、(新しいハッシュを使用して) 新しいコミットを実際に作成しているためです。他の誰かがあなたのコードをプルして元のコミットに基づいた作業を行った場合、その人が再度プルすると重複が生じ、手動で修正する必要があります。より良い説明については、リベースの危険性を参照してください。

于 2013-03-19T19:19:55.927 に答える
2
git rebase -i HEAD~3

#An editor window will now open showing 3 commits. Replace 'pick' with 'e', save exit.
#git will now give you a chance to edit last 3 commits. Edit the files to fix the bug, then

git add -u
git commit -m"New message"
git rebase --continue

#This will repeat 3 times. After that, you will have a new set of last 3 commits (with new sha1 of course).

ところで、この時点以降、3 つのコミットが既にリモート (オリジン) にある場合、「プッシュ」を実行できなくなります。次のことを行う必要があります。

git push -f

これにより、他の人が古いコミットを持っている場合にプルすることもできなくなります。しかし、他の人がこれを行うと、それは解決できます。

git stash # save your changes.
git reset --hard HEAD~3
git pull
git stash pop
于 2013-03-19T19:27:51.027 に答える