0

私がプライベート リモート リポジトリを使用する主な理由は 2 つあります。オフィスから自宅に移動するときに進行中の作業をバックアップするため、または 2 台の開発マシン間でコードを同期するためです。

私は最近 git (hg から来ました) を使い始めました。履歴を書き換えるというアイデアが気に入っています。最近見つけたのは、次のことを行う場合です

  • # 仕事する
  • gitコミット
  • ギットプッシュ
  • # 前回のコミットでちょっとした問題を修正
  • git commit --修正
  • ギットプッシュ

リモートと競合しています。プル、マージ、およびプッシュを再度行う必要があります。

  1. ローカルの変更をリモート リポジトリにミラーリングする方法はありますか?
  2. 2 番目のマシンで、これらのミラーをリモートからローカルにプルするにはどうすればよいですか (できれば、完全なクローンを再度作成する必要はありません)。

私はそれを使用しているのは私だけであることを知っているので、変化する歴史に対処する必要がある人は誰もいないことを知っています.

4

4 に答える 4

2

2台目のマシンでプッシュを強制できますgit push -f remote-name branch-namegit pullコンフリクトがある場合は、プルを強制することができgit fetch --allますgit reset --hard remote-name/branch-name。ただし、通常のワークフローの一部として履歴を書き換えることはお勧めしません。

定期的にプッシュとプルを強制することはお勧めできません。

于 2013-11-01T13:15:40.780 に答える
1

実行することもできます

   git reset HEAD^ --hard 

ローカル リポジトリから git pull を実行した後、リモート リポジトリで git push をやり直します。正確に正しいものを巻き戻していることを検証するだけでよく、リモートリポジトリに安全なコピーをいつでも保持できるため、 git push --force よりも複雑ではありますが、危険性はやや低いと思います。

    git checkout -b safe-copy-old-branch-name

コミットの背後にある以前の「意図」の元を保持するだけでなく、まったく同じ(元の)SHA1も保持するすべてを行う前に。

于 2013-11-01T13:52:34.760 に答える
1

文字通り、「交換 / バックアップ」リモートをミラー (一部またはすべての ref 更新を早送りするのではなく、「強制」スタイルの ref 更新を行う裸のクローン) として設定できます。

「通常の」クローンは、 の強制更新を行うように設定されていますrefs/remotes/*: を見て.git/config(または使用してgit config --get remote.origin.fetch)、 のフェッチ refspecorigin

+refs/heads/*:refs/remotes/origin/*

プラス記号は「強制」、つまり「早送りを必要としない」ことを意味します。したがって、あなたgit fetch originがどのコミット SHA1 であっても (例: オリジンのrefs/heads/master名前)、ローカルになりrefs/remotes/origin/masterますrefs/remotes/origin/master。これらの「リモート ブランチ」の SHA1 ポインタ名は、ローカルリポジトリのブランチの名前空間にまったく影響を与えないため、これは一般refs/remotes/的に安全です (したがって、「通常の」クローンのデフォルトでもあります)。refs/heads

を使用する場合、git push -fまたは で始まるプッシュ refspec を指定する場合+(これはプッシュとフェッチの場合と同じことを意味します) は、非早送りも許可する必要があることをリモートに伝えます。(つまり、より良い表現が必要な場合は、早送りを許可する「組み込みフック」に指示します。プッシュ先のリモートの他の git フックは、変更を拒否する可能性があります。) これは一般的に安全ではありません。リモートリポジトリの名前空間に影響します: のようなものではなく、その を更新しています。しかし、自分が何をしているのかを知っていて、間違いを犯さないなら (または少なくとも頻繁には :-) )、結局のところ問題ありません。refs/heads/masterrefs/pushes/JohnsMachineAtHome/master

また、git のすべてのコミットは、それを指す何らかの参照 (reflog など) がある限り、適度にスティッキーであることも覚えておいてください。そのため、特定の意味で、最初にコミットする限り、強制プッシュと強制フェッチは安全です。(例えば、あなたが失敗した場合、自宅/職場から職場/自宅に SSH 接続し、reflog を調べて、ミラーにドロップしたコミットを見つける必要があるかもしれません。) ベア クローン (ベア ミラー クローンを含む) に注意してください。 ) reflog の邪魔にならないでください (特に set を使用する、いくつかのデータが保持されます。git core.logAllRefUpdatesconfig docs を参照してください)。これは、取得する更新がプッシュまたはフェッチ時にまとめて行われるためです。

これらの git config オプションも参照してください。

   remote.<name>.push
       The default set of "refspec" for git-push(1). See git-push(1).

   remote.<name>.mirror
       If true, pushing to this remote will automatically behave as if the
       --mirror option was given on the command line.
于 2013-11-01T14:00:38.323 に答える
0

マスター ブランチとマージする前に、一時ブランチで作業してリベースできます。リベース (--> 'git rebase -i master') により、コミットの並べ替えと編集が可能になります。

于 2013-11-01T13:10:32.463 に答える