97

ベアリポジトリには意味をなさないgitコマンドがいくつかあることを考慮に入れて(ベアリポジトリはインデックスを使用せず、作業ディレクトリがないため)、

git reset --hard HEAD^ 

このようなリポジトリの最後の変更をコミット解除するソリューションではありません。

インターネットで検索すると、このトピックに関連して見つけたのはこれだけです。ここでは、これを行う3つの方法が示されています
。1。「手動で参照を更新する(配管を含む)」;
2.「git push -f非ベアリポジトリから」;
3." git branch -f this $that"。

どの解決策がより適切だと思いますか、またはこれを行うために他にどのような方法がありますか?残念ながら、gitbareリポジトリについて私が見つけたドキュメントはかなり貧弱です。

4

4 に答える 4

138

コマンドを使用できますgit update-ref。最後のコミットを削除するには、次を使用します。

$ git update-ref HEAD HEAD^

または、最後のコミットを削除できないブランチにいない場合:

$ git update-ref refs/heads/branch-name branch-name^

必要に応じて、sha1を渡すこともできます。

$ git update-ref refs/heads/branch-name a12d48e2

git-update-refコマンドのドキュメントを参照してください。

于 2011-01-07T12:24:56.840 に答える
35

ベアリポジトリで以下を使用する場合:

git reset --soft <commit>

そうすれば、ベアリポジトリにないもの(つまり、作業ツリーとインデックス)を変更しようとしないため、ベアリポジトリで使用している問題--hardやオプションに遭遇することはありません。--mixedあなたの場合、特にあなたは(裸のリポジトリから)使用したいと思うでしょう:

git reset --soft HEAD^

リモートリポジトリのブランチを切り替えるには、次のようにします。

git symbolic-ref HEAD refs/heads/<branch_name>

現在選択されているブランチを表示するには、次を使用します。

git symbolic-ref HEAD

https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

于 2011-04-11T21:30:19.787 に答える
6

は正常にgit push -f機能するはず
です。そのベアリポジトリのクローンを作成する場合は、最後のコミットを削除し(git reset --hard HEAD^ただし、ローカルの非ベアリポジトリで)、プッシュバックします(-f):

  • 削除するコミットの前にある他のコミットのSHA1は変更​​しません。
  • ベアリポジトリの正確なコンテンツから余分なコミットを差し引いたものを確実にプッシュバックします(最初にクローンを作成したため)。
于 2011-01-07T11:44:02.713 に答える
2

git refspec表記を使用して、次のようにすることもできます。

git push -f origin +<commit you want to revert to>:<destination_head | branch_name>

これにより、宛先ブランチ(refで示される)が、+<object ref>パーツで示されるソースコミットに強制的に更新されます。

于 2012-01-31T08:03:37.857 に答える