2

私はgit-new-workdir以前、1つのgitリポジトリに対して2つの作業ツリーを持っていました。これは通常非常にうまく機能しますが、同じブランチが両方の作業ツリーでチェックアウトされている場合、何かをコミットした後に面白い動作が発生します。

  • 私は、きれいな作業ツリーと「マスター」の両方から始めます。
  • 作業ツリーAで何かをコミットします。

結果:

  • 作業ツリーAの「gitstatus」は「clean」を示しています(予想どおり)
  • 作業ツリーBの「gitstatus」に突然「変更をコミットする」と表示されます

表示される変更は、Aで行ったコミットの逆です。たとえば、Aのコミットで行が追加された場合、Bの「コミットする変更」はこの行が削除されたことを示します。

ここで何が起きてるの?これはgit-new-workdirの既知の制限ですか?この問題を回避する方法はありますか?または、両方のコピーで同じブランチがチェックアウトされている間は、チェックインを避ける必要がありますか?

また、ここで内部的に何が起こっているのかを理解することにも興味があります(gitの内部についてはほとんど知りません)。

ノート:

git reset--hardAでコミットする前にBにコミットされていない変更がなかった場合、Bで実行するだけで問題を簡単に解決できることがわかりまし た。

ただし、Bにコミットされていない変更があるときにAでコミットすると、実際のコミットされていない変更がコミットからの偽の変更と混ざり合い、それらを解く簡単な方法がないようです。したがって、質問。

4

2 に答える 2

5

これが意図した動作だと思います。http://nuclearsquid.com/writings/git-new-workdir/から:

作業ディレクトリの1つに新しいコミットまたはブランチを作成します。これらは、すべての作業ディレクトリですぐに利用できます。

Aで変更をコミットすると、そのコミットはBでも使用できます。Aで追加した行はBにないため、最後のコミット以降に変更を加えたようです。

複数の作業ディレクトリの目的は、異なるブランチを同時にチェックアウトすることだと思います。

于 2012-05-04T20:12:45.913 に答える
5

2015年の時点で、この質問は廃止されています。

git-new-workdirに取って代わられましたgit worktree(2015年7月のGit V2.5で導入)。git worktree2つのワークツリーで同じブランチをチェックアウトすることをきっぱりと拒否することで、この質問で説明されている問題を解決します。

$ git checkout myBranch
fatal: 'myBranch' is already checked out at '/tmp/otherworktree'
于 2016-03-17T09:35:44.427 に答える