Gitでは、すべてのファイルをチェックアウトせずに別のブランチに切り替えることは可能ですか?ブランチを切り替えた後、すべてのファイルを削除して再生成し、コミットして元に戻す必要があります。したがって、ファイルをチェックアウトするのは時間の無駄です(そして、約14000個のファイルがあります-それは長い操作です)。
すべてを明確にするには:
ドキュメント をgithubにアップロードするには、これらすべてが必要です。
私はgh-pagesブランチでレポを持っています。ドキュメントをローカルで再構築する場合、ドキュメントをリポジトリディレクトリにコピーし、コミットしてgithubにプッシュします。しかし、ドキュメントのコピーがローカルに2つあったため、私は不満でした。そして、空のブランチを作成し、空に切り替えてファイルを削除した後、私は決定しました。しかし、元に戻すには長い時間がかかるので、この質問をしました。
私はgh-pagesブランチに残してファイルを削除することができることを知っていますが、汚れた作業ツリーは好きではありません)
はい、これを行うことができます。
git symbolic-ref HEAD refs/heads/otherbranch
このブランチでコミットする必要がある場合は、インデックスもリセットする必要があります。そうしないと、最後にチェックアウトしたブランチに基づいて何かをコミットすることになります。
git reset
基本的な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
これらのコマンドは、グラフィカルクライアントからもすぐに利用できることに注意してください。
2つの作業ディレクトリ(2つの作業領域)に1つのリポジトリ、さらには2つのリポジトリがあると、より良いソリューションになりませんか?
contrib/
セクションには、これを支援する git-new-workdir ツールがあります。
読者の利益のために:
Charles Baileyのソリューション は正しいものだと思いますが、このソリューションでは、ローカルブランチではない何かに切り替える際に調整が必要です。また、理解しやすい通常のコマンドでそれを行う方法がいくつかあるはずです。ここに私が思いついたものがあります:
git checkout --detach
git reset --soft commitish
git checkout commitish
説明:
git checkout --detach
は、git checkout HEAD^{}
と同じです。これは、現在のブランチを残し、「切り離されたヘッド状態」になります。したがって、HEAD
の次の変更はブランチに影響しません。 HEAD
の切り離しは、ワークツリーにもインデックスにも影響しません。git reset --soft commitish
はHEAD
を指定された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 のリストで見つけることができます。
配管コマンドを探していると思います git read-tree
。これにより、インデックスは更新されますが、作業ディレクトリ内のファイルは更新されません。たとえば、branch
が読み取るブランチの名前であると仮定します。
git read-treeブランチ
読んだばかりのブランチにコミットしたい場合は、次のことも必要です。
git symbolic-ref HEAD refs/heads/branch
HEADファイルを別のブランチ名で上書きできます。
echo "ref:refs/heads/MyOtherBranch"> .git/HEAD
リモートブランチが指す場所を単に変更しようとしている場合は、ローカルコピーに触れることなく「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
それがあなたが望んでいたものかどうかはわかりません。
非常に多くのファイルがあるため、ブランチごとに1つずつ、2つのリポジトリを保持するのが最善の方法です。必要に応じて変更を行ったり来たりできます。これは、gitで壊血病のトリックをプレイするよりも驚くほどではありません。
あなたは利用できます
1. git checkout -f <new-branch>
2. git cherry-pick -x <previous-branch-commit-id>
previous-branch-commit-idは、古いデータをコピーする場所からのコミットです。