8

私は小さな会社で働いていますが、私たちの Git リポジトリは少し混乱しています。を実行したところ、git pull今日以前に行った変更が失われました。

master ブランチで HEADを操作すると、履歴にgit log最後のコミットb94940c63ef965ce45b0d64ccfba4359134d2552が表示されます。

変更を失った問題のあるファイルに対して行うgit log filenameと、そのコミットは表示されません (以前のコミットのみが表示されます)。

を実行git log --follow filenameすると、私のコミットb94940c63ef965ce45b0d64ccfba4359134d2552が最新のものとして表示されます。

そして、私がそうすれば十分です:

git checkout b94940c63ef965ce45b0d64ccfba4359134d2552
git log filename

その後、コミットが表示され私の変更がファイルに含まれています!

つまり、私が行ったコミットはブランチ履歴に表示されますが (ブランチ マージをブロックします)、変更された個々のファイルの履歴にはそのコミットがありません! (そのコミットを明示的にチェックアウトしない限り)。

質問:

  1. 一体どうしてこれが起こったのですか?

  2. どうすれば修正できますか?(レポ内の複数のファイルに問題があります)

4

4 に答える 4

5

問題がわかりました。同僚が引っ張ったとき、彼はいくつかの衝突を起こしました。解決するのではなく、ステージングされたすべてのファイルを git reset しました。これは、個々の古いファイルに対して git checkout old_version を実行するのと似ていました。そのため、マスターの HEAD は、old_version を持ついくつかのファイルを参照することになりました。

今、彼が吹き飛ばしたものを手動で復元しています。

教訓: 個々のファイルに対する git 操作 (チェックアウト、リセットなど) を変更することは非常に危険です。

于 2011-08-05T02:42:23.377 に答える
1

これは単なるコメントですが、読みにくいでしょう。マスターをチェックアウトした後:

git checkout master

の出力は何ですか

git status

git whatchanged -m -p <path>

git log --graph --oneline b94940c63ef965ce45b0d64ccfba4359134d2552..master

于 2011-08-05T02:00:55.800 に答える
0

まず、Gitコマンドの機能と、リポジトリに保存されているデータを把握する必要があります。

  • GiggleやGitkなどの履歴視覚化ツールを入手して、コミット履歴を確認し、どのコミットがどのコミットに基づいているかを確認します。

  • git pull2つのことを行います。リモートリポジトリから新しいコミットを取得し、リモートリポジトリのヘッドを現在のヘッド(現在のブランチ内)とマージします

ですから、それを踏まえると、将来はもっと注意したいと思うかもしれません。を使用する代わりに、マージする必要があるものを手動でマージgit pullできます。git fetchそうすれば、どのような編集を行うかを制御できます。

あなたの現在の状況については、Gitがデータを失っているとは思いません。あなたはあなたのファイルがまだ歴史に残っていると言いました。したがって、プロジェクトファイルを希望の状態にするために、クリエイティブなリセット(古いバージョンに戻す)またはパッチ(場合によっては手動)を実行する必要があります。

于 2011-08-05T00:53:45.753 に答える
0

コミットを失った可能性のあるファイルを確認したいフォルダーで、実際にこの bash スクリプトを使用できます。

#!/bin/zsh
for f in $(find . -name '*.php')
do
	follow=$(git log --oneline -1 --pretty=format:"%h" -- $f)
	log=$(git log --follow --oneline -1 --pretty=format:"%h" -- $f)
	
	if [ $log != $follow ]; then
  		echo "follow $follow , log $log => $f"
  	fi

done

于 2016-03-31T11:27:22.977 に答える