17

Git を使用していたので、特定のコミットに戻る必要がありました。私はいくつかの変更を加えましたが、今それらをコミットしたいと思います。これを行う適切な方法は何ですか?

私のプロジェクトは現在、切り離された HEAD 状態になっています。でコミットすると変更が保存されますか

git commit

? それ以外の場合、変更を失わないようにするにはどうすればよいですか?

4

4 に答える 4

39

免責事項: git は複雑ではなく、用途が広いだけです。長い答えになってしまったからといって、怖がらないでください :)

持っていた:
master: a-b-c-d-e-f

と変更したかったc。あなたがしたこと:
* git checkout c(今後コミットをチェックアウトするのを避けてください。代わりにブランチ ヘッドを移動してください)
*いくつかのファイルを変更しました

あなたがいる:

マスター: abcdef
             \uncommitted-work,detached

変更した「c」の上に def を再適用する場合

(プッシュした場合、下流の人々は上流の rebase から回復する必要があります)

  1. git stash .
  2. git checkout master
  3. git stash pop(競合を解決する)
  4. git stage .
  5. git commit -m "temporary name for g"
  6. ( master: a-b-c-d-e-f-g)
  7. git rebase c -i(「現在のブランチをポイント c に再適用し、コミットをインタラクティブに操作させてください」、つまり、d-e-f新しい に再親 (リベース) しますc)
  8. インタラクティブなリベースのガイドに従ってください。gc の後にあるように並べ替えたい場合は、rebase コマンドを からpickに変更しfixupます。dd行を削除し、P配置し、i挿入モードに入って「fixup」と入力:wqし、保存してvimを終了します。
  9. (はマージの結果でありmaster: a-b-c'-d'-e'-f'、リベース中です。祖先が変更されたため、git に関する限り「同じ」コミットではありませんが、内容は同じままです)c'gcd-e-fd'-e'-f'

元に戻したい場合d-e-f(そして、作成したことがないかのように履歴を書き換えたい場合)

(プッシュした場合、下流の人々は上流のリベースから回復する必要があります):

  1. git stash .
  2. git checkout master
  3. ( master: a-b-c-d-e-f、元は c に基づいた隠しファイル)
  4. git reset --hard c(すべてのファイルを破棄し、c 以降のマスターでコミットします)
  5. ( master: a-b-c、隠しファイルあり)
  6. git stash pop(競合を解決する)
  7. ( master: a-b-c-*)
  8. git stage .
  9. git commit -m "description of g"
  10. ( master: a-b-c-g)

defを元に戻したい場合(ただし、履歴に残しておきたい場合)

  1. git stash
  2. git revert --no-commit d
  3. git revert --no-commit e
  4. git revert --no-commit f
  5. git push
  6. git stash pop(競合は発生しません)
  7. git stage .
  8. git commit -m "Undo d-e-f in order to fix..."
  9. git push

git pushdef があり、それらを別々に保持したい場合:

あなたの新しい変更は、新しいブランチ オフ マスター用のもののようです。git branch <foo>.

于 2015-06-22T15:47:33.363 に答える
7

このコミットから新しいブランチを作成し、次のことを行いますcommit

git checkout -b <branchname>
git commit 

ファイルをすでにステージング (つまりgit add myfile1 myfile2) していると仮定します。

于 2015-06-22T15:13:48.097 に答える