web-dev-qa-db-ja.com

なぜgit worktree addはブランチを作成し、それを削除できるのですか?

git worktree add新しいワークツリーを作成します。ワークツリーと同じ名前でリポジトリに新しいブランチが作成されていることに気付きました。このブランチは何のためですか?

2番目のワークツリーにある他の既存のブランチをチェックアウトしました。そのブランチを自由に削除できますかgit worktree add 作成した?

19
Tor Klingberg

同じブランチを異なるワークツリーで同時にチェックアウトすることはできないため、ブランチが必要です。

したがって、ワークツリーを追加するときにブランチを指定しない場合、gitは現在のブランチとワークツリーディレクトリの名前に基づいて自動的にブランチを追加します。

あなたは尋ねるかもしれません、なぜ私は同じブランチチェックアウトを二度持つことができないのですか? BにコミットしたときにワークツリーAがどうなるかを考えてみます。両方がブランチを共有している場合...ワークツリーAはBでのコミットをローカルな違いとして認識しますが、逆です!あなたがしたかのようにgit reset --soft HEAD^...それはかなり危険です。

ところで、これは、チェックアウトされた非ベアリポジトリのブランチPush toができないのと同じ理由です。

最後の質問について:ブランチを削除できますか?もちろん、そのブランチは決して特別なものではありません。どこにもチェックアウトされていない限り、削除できます。

12
rodrigo

他の人がこの質問に答えるので、folderを削除し、worktreeを削除し、branchを削除するコマンドをここに入力します。

最初に、すべてのワークツリーをリストして再確認します...

$ git worktree list

次に、ワークツリーのフォルダを削除します

$ rm -rf ../path/to/worktree

その後、ワークツリー自体を削除します

$ git worktree Prune

複数のワークツリーがある場合、上記のコマンドは、そのパスがもう存在しないワークツリーをプルーニングするだけなので、心配しないでください!

最後に、ブランチを削除します(ワークツリーと同じブランチ名)。

$ git branch -D <branch-name>
20
vaheeds

_git worktree_ 何も指定されていない場合、新しいブランチを追加します:

_<commit-ish>_を省略し、_-b_も_-B_も_--detach_も使用しない場合、便宜上、HEAD -b $(basename <path>)が指定されたかのように、自動的に作成されます。

Git 2.17以降_git worktree remove_ でそのブランチを削除できます。

ただし、同じremoveコマンドも含まれています。

汚れた作業ツリーまたはサブモジュールのある作業ツリーは、_--force_で削除できます。
メインの作業ツリーは削除できません。

True ... _--force_以外は完全には実装されていませんGit 2.17では実装されていません。

Git 2.18(2018年第2四半期)では、「_git worktree remove_」は「_-f_」が「git worktree add」と同じように「_--force_」オプションの省略形であることを学びました。

Stefan Beller(stefanbeller による commit d228eea (2018年4月17日)を参照してください。
支援者: Eric Sunshine(sunshineco
Junio C Hamano-gitster- によってマージ commit 90186fa 、2018年5月8日)

worktree:_-f_を_--force_の省略形として受け入れ、削除する

多くのコマンドは、「_--force_」オプションをサポートしています。これは、しばしば「_-f_」と省略されます。
ただし、「_git worktree remove_」と記載されている「_OPT_BOOL_」がサポートされているにもかかわらず、「_git-worktree.txt_」の手巻き_-f_は短い形式を認識しません。
_OPT_BOOL_を_OPT__FORCE_に置き換えます。これにより、「_-f_」が無料で提供され、「remove」と「add」が一致しますオプションの解析(これは_PARSE_OPT_NOCOMPLETE_フラグも指定します)。

3
VonC

git worktree --helpはこれを以下のように明確に述べています。

COMMANDS
       add <path> [<branch>]
           Create <path> and checkout <branch> into it. The new working directory is linked to the current repository, sharing everything
           except working directory specific files such as HEAD, index, etc.

           If <branch> is omitted and neither -b nor -B is used, then, as a convenience, a new branch based at HEAD is created automatically,
           as if -b $(basename <path>) was specified.

       Prune
           Prune working tree information in $GIT_DIR/worktrees.
3
Indra Uprade

--detachを使用すると、デタッチモードで実行でき、ブランチが作成されないようです。これは、ワークツリーで変更を行う予定がなく、たとえばビルドまたはテストを実行するだけの場合に役立ちます。

ソース: https://stacktoheap.com/blog/2016/01/19/using-multiple-worktrees-with-git/#long-running-tasks

2
liberforce

Git 2.17.0以降、このオールインワンコマンドを安全に実行できます

git worktree remove <path>
1
Efreeto