私には2つのブランチがあります。
- ローカルブランチ(私が作業しているブランチ)
- リモートブランチ(パブリック、十分にテストされたコミットのみがそこに行きます)
最近、私は真剣に私の地元の支店をめちゃくちゃにしました。
ローカルブランチをリモートブランチに完全に置き換えて、リモートブランチが現在ある場所から作業を続行するにはどうすればよいですか?
私はすでにSOを検索しましたが、リモートブランチにローカルでチェックアウトしても効果がありません。
私には2つのブランチがあります。
最近、私は真剣に私の地元の支店をめちゃくちゃにしました。
ローカルブランチをリモートブランチに完全に置き換えて、リモートブランチが現在ある場所から作業を続行するにはどうすればよいですか?
私はすでにSOを検索しましたが、リモートブランチにローカルでチェックアウトしても効果がありません。
回答:
masterが置き換えるローカルブランチであり、 "origin / master"がリセット先のリモートブランチであると仮定します。
git reset --hard origin/master
これにより、ローカルのHEADブランチがorigin / masterと同じリビジョンになるように更新--hard
され、この変更がインデックスとワークスペースにも同期されます。
git reset
デフォルトでは、現在のブランチを再ポイントし、インデックスを同期します。--soft
インデックスの更新をスキップし--hard
、ワークスペースも同期します。私自身の経験では--hard
、最後のコミットを取り消す場合を除いて、ほとんどの時間を使用しています(これは単なるgit reset HEAD^
)
git fetch origin remote_branch
master
ため、最初に置き換えるブランチをチェックアウトしていることを確認してください。
これは3つのステップと同じくらい簡単です。
git branch -d local_branch
git fetch origin remote_branch
git checkout -b local_branch origin/remote_branch
git branch -D local_branch
ブランチがマージされていない場合は、最初のステップで行う必要があるかもしれません。
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>
git help branch
語ってい--track
ます。When creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out.
私は答えでこのコマンドを修正しました。ポイントを上げてくれてありがとう。
git status
場合、ローカルブランチが関連付けられている場合、ローカルブランチがリモートブランチの前か後ろかを報告します。さらに、ブランチをすでに追跡するように設定している場合は、完全ではなくgit pull
(またはpush
)を実行できます。git pull <remote> <branch>
<remote/branch>
すべてをリモートブランチに置き換えます。しかし、同じコミットからのみ、ローカルブランチがオンになっています:
git reset --hard origin/some-branch
または、リモートブランチから最新のものを取得し、すべてを置き換えます。
git fetch origin some-branch
git reset --hard FETCH_HEAD
余談ですが、必要に応じて、まだコミットしていない追跡されていないファイルとディレクトリを一掃できます。
git clean -fd
git clean
コマンドは私のためにそれをやりました。git reset hard origin/master
追跡されていないファイルを消去しないでください。ありがとう!
現在のローカルブランチをリモートに置き換える最も安全で完全な方法:
git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch
このstash
行は、コミットしていない変更を保存します。このbranch
行により、ブランチが別の名前に移動し、元の名前が解放されます。このfetch
行は、リモートの最新のコピーを取得します。のcheckout
行は、元のブランチを追跡ブランチとして再作成します。
またはbash関数として:
replaceWithRemote() {
yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`}
git stash
git merge --abort
git rebase --abort
git branch -M ${yourBranch} replaced_${yourBranch}_`git rev-parse --short HEAD`
git fetch origin ${yourBranch}:${yourBranch}
git checkout ${yourBranch}
}
これにより、現在のブランチの名前がreplaced_master_98d258fなどに変更されます。
git stash pop
そのワークフローに含めたい場合があります。隠しておいたファイルを再適用する場合。
まだ誰もこれについて言及していません。私はそれをほぼ毎日使用しています:
git reset --hard @{u}
基本的に@{u}
は、現在のブランチが追跡している上流ブランチの単なる省略形です。たとえば、これは通常に相当しorigin/[my-current-branch-name]
ます。それはブランチにとらわれないのでいいです。
git fetch
最初に、リモートブランチの最新のコピーを取得してください。
それは複数の方法で行うことができ、より良い知識の観点を広めるためにこの回答を編集し続けます。
1)ハードリセット
リモート開発ブランチから作業している場合は、以下のようにリモートブランチの最後のコミットにHEADをリセットできます。
git reset --hard origin/develop
2)現在のブランチを削除し、リモートリポジトリから再度チェックアウトする
ローカルリポジトリの開発ブランチで作業していて、リモート/開発ブランチと同期していることを考慮して、次のように実行できます。
git branch -D develop
git checkout -b develop origin/develop
3)マージを中止
間違ったマージの間に(間違ったブランチで誤って行われた)間で、マージが次のように最新のブランチに戻るのを避けたい場合:
git merge --abort
4)リベースを中止
不正なリベースの間にいる場合は、以下のようにリベース要求を中止できます。
git rebase --abort
選択した答えは絶対に正しいですかが、それは、最新のコミット/プッシュで私を残していませんでした、...
だから私にとって:
git reset --hard dev/jobmanager-tools
git pull ( did not work as git was not sure what branch i wanted)
私は上流のブランチを数週間、特定のブランチに一時的に設定することを知っているので(以前に切り替えた/チェックアウトしたハードリセットを実行したブランチと同じ)
したがって、リセット後
git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status ( says--> on branch dev/jobmanager-tools
選択した説明で提供されているように、git resetは適切です。しかし、最近ではサブモジュールを使用することがよくあります:リポジトリ内のリポジトリ。たとえば、プロジェクトでZF3とjQueryを使用している場合、おそらくそれらを元のリポジトリから複製する必要があります。このような場合、git resetでは不十分です。サブモジュールを、リポジトリで定義されている正確なバージョンに更新する必要があります。
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule foreach git submodule update
git status
これは、各サブモジュールの作業ディレクトリに再帰的に移動(cd)して実行するのと同じです。
git submodule update
そしてそれは非常に異なります
git checkout master
git pull
サブモジュールはブランチではなくコミットを指すためです。
その場合、1つ以上のサブモジュールのブランチを手動でチェックアウトすると、実行できます
git submodule foreach git pull
git reset --hard
ます。これはほとんど価値を追加しません。
醜いがより簡単な方法:ローカルフォルダーを削除し、リモートリポジトリのクローンを再度作成します。