web-dev-qa-db-ja.com

ファイルのチェックアウトなしでgitブランチを切り替える

Gitでは、すべてのファイルをチェックアウトせずに別のブランチに切り替えることは可能ですか?ブランチを切り替えた後、すべてのファイルを削除して再生成し、コミットして元に戻す必要があります。したがって、ファイルをチェックアウトするのは時間の無駄です(そして、約14000個のファイルがあります-それは長い操作です)。

すべてを明確にするには:

ドキュメント をgithubにアップロードするには、これらすべてが必要です。

私はgh-pagesブランチでレポを持っています。ドキュメントをローカルで再構築する場合、ドキュメントをリポジトリディレクトリにコピーし、コミットしてgithubにプッシュします。しかし、ドキュメントのコピーがローカルに2つあったため、私は不満でした。そして、空のブランチを作成し、空に切り替えてファイルを削除した後、私は決定しました。しかし、元に戻すには長い時間がかかるので、この質問をしました。

私はgh-pagesブランチに残してファイルを削除することができることを知っていますが、汚れた作業ツリーは好きではありません)

85
tig

はい、これを行うことができます。

git symbolic-ref HEAD refs/heads/otherbranch

このブランチでコミットする必要がある場合は、インデックスもリセットする必要があります。そうしないと、最後にチェックアウトしたブランチに基づいて何かをコミットすることになります。

git reset
94
CB Bailey

基本的なgitコマンドのみを使用:

この答えは、Charlesの答えよりも少し長くなりますが、基本的なgitコマンドだけで構成されており、私が理解して覚えることができるので、調べ続ける必要がありません。

現在の場所をマークします(必要に応じて最初にコミットします):

git checkout -b temp

作業ディレクトリを変更せずに、マーカーを他のブランチにリセット(移動)します。

git reset <branch where you want to go>

現在、tempと他のブランチは同じコミットをポイントしており、作業ディレクトリは変更されていません。

git checkout <branch where you want to go>

HEADはすでに同じコミットを指しているので、作業ディレクトリは変更されません

git branch -d temp

これらのコマンドは、グラフィカルクライアントからもすぐに利用できることに注意してください。

38
user1115652

2つの作業ディレクトリ(2つの作業領域)に1つのリポジトリ、さらには2つのリポジトリがあると、より良いソリューションになりませんか?

contrib/セクションには、これを支援する git-new-workdir ツールがあります。

14
Jakub Narębski

読者の利益のために:

Charles Baileyのソリューション は正しいものだと思いますが、このソリューションでは、ローカルブランチではない何かに切り替える際に調整が必要です。また、理解しやすい通常のコマンドでそれを行う方法がいくつかあるはずです。ここに私が思いついたものがあります:

git checkout --detach
git reset --soft commitish
git checkout commitish

説明:

  • git checkout --detachは、git checkout HEAD^{}と同じです。これは、現在のブランチを残し、「切り離されたヘッド状態」になります。したがって、HEADの次の変更はブランチに影響しません。 HEADの切り離しは、ワークツリーにもインデックスにも影響しません。
  • git reset --soft commitishHEADを指定されたcommitishのSHAに移動します。インデックスも更新する場合は、--softを残しますが、お勧めしません繰り返しますが、これはワークツリーに影響せず、(--soft)インデックスには影響しません。
  • git checkout commitishは、指定されたHEAD(ブランチ)にcommitishを再度付加します。 (commitishがSHA何も起こらない場合)。これも、インデックスにもワークツリーにも影響しません。

このソリューションは、コミットを参照するすべてのものを受け入れるため、一部のgitエイリアスに最適です。以下のrev-parseは、タイプミスが誤って切り離されたヘッド状態に切り替わらないように、チェーンで何も中断しないことを確認するための単なるテストです(エラー回復ははるかに複雑になります)。

これは、次のgit switch treeishエイリアスにつながります。

git config --global alias.switch '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'

参考までに、 git aliases のリストで見つけることができます。

11
Tino

配管コマンドを探していると思います git read-tree 。これにより、インデックスは更新されますが、作業ディレクトリ内のファイルは更新されません。たとえば、branchが読み取るブランチの名前であると仮定します。

git read-treeブランチ

読んだばかりのブランチにコミットしたい場合は、次のことも必要です。

git symbolic-ref HEAD refs/heads/branch
8
Greg Hewgill

HEADファイルを別のブランチ名で上書きできます。

echo "ref:refs/heads/MyOtherBranch"> .git/HEAD

7
user157005

リモートブランチが指す場所を単に変更しようとしている場合は、ローカルコピーに触れることなく「git Push」でそれを行うことができます。

http://kernel.org/pub/software/scm/git/docs/git-Push.html

<refspec>パラメータの形式は、オプションのプラス+、ソース参照<src>、コロン:、宛先ref <dst>の順になります。これは、リモートリポジトリ内の<dst> refを更新する<src>オブジェクトを指定するために使用されます。

たとえば、fooを更新してc5f7ebaをコミットするには、次の手順を実行します。

git Push Origin c5f7eba:foo

それがあなたが望んでいたものかどうかはわかりません。

0
Tim Abell

非常に多くのファイルがあるため、ブランチごとに1つずつ、2つのリポジトリを保持するのが最善の方法です。必要に応じて変更を行ったり来たりできます。これは、gitで壊血病のトリックをプレイするよりも驚くほどではありません。

0
Norman Ramsey

あなたは利用できます

      1. git checkout -f <new-branch>
      2. git cherry-pick -x <previous-branch-commit-id>

previous-branch-commit-idは、古いデータをコピーする場所からのコミットです。

0
Haseena Parkar