0

私はgit-svnを使用して2台のマシン(MacとWindows)で作業しています。私のリモートリポジトリはsvnです。私はMacをマスターリポジトリとして使用し、Windowsをスレーブとして使用しています。したがって、すべてのgit-svn操作はMacで実行され、WindowsマシンはMacで「gitpull」または「gitpush」のみを実行します。

次のようなワークフローでは、何百もの競合を解決する必要がある状況に陥ることがよくあります。

  1. 私は主にMacで作業し、次にWindowsに「gitpull」させてテストを行います。
  2. 時々、Windowsで少し作業して、機能ブランチにコミットする必要があります。
  3. 次に、「gitpushorigin」を実行してブランチをMacにプッシュバックします。
  4. 次に、Macで「gitmergewindows_branch」をマスターブランチに入れます。
  5. 最後に、「gitsvnrebase」と「gitsvndcommit」を実行します。

ステップ5で、ここに衝突が来ます!そして、私はかつて、「git mergetool」、「git rebase --continue」、「git rebase --skip」、および「git rebase --abort」ワークフローを使用して、すべての競合を3時間かけて調べました。運が良ければ、それらすべてを理解することができます。しかし、場合によっては、それらの数が多すぎて、さらに悪いことに、リベースは履歴をトラバースするときに同じ一連の競合を繰り返し実行します(gitはファイルではなく変更のみを認識します)。最終的に私は混乱し、それらのいくつかを誤って解決し、より大きな悪夢を引き起こします。私が学んだいくつかのスクリプトは、「gitaccept-ours」や「gitaccept-theirs」のようなことをするのに役立ちますが、これは削除されたファイルを含む履歴ではうまく機能せず、繰り返し受け入れる必要があります。

これは、分岐とマージのワークフローを使用することを本当に躊躇し始めるほどの悪夢でした。問題は、なぜこれほど多くの衝突が発生する可能性があるのか​​正確にはわからないということです。しかし、そのような競合を防ぐか、簡単にバッチ解決するのに役立つ推奨ワークフローまたはプラクティスがあれば、それは素晴らしいことです。

助けてくれてありがとう!

4

1 に答える 1

1

私はついに問題を見つけ、ここで私自身の質問に答えようとします:

グローバルな.gitconfigで、自動マージを無効にしました

mergeoptions = --no-commit

しかし、「git pull」を実行するたびに、実際にはWindowsスレーブでマージをコミットせず、後でMacマスターにアップストリームでプッシュしました。それがすべての紛争の原因でした。

リベース/マージワークフローに関してWebから得た一般的な提案は次のとおりです。

  1. 可能な限り「gitpull」ではなく「gitfetch」を使用して、さらに決定を下せるようにします。
  2. 「rerere」を使用して、繰り返される既知の競合を自動的に解決します。
  3. 「gitrebase-i」または「gitmerge--squash」のいずれかを使用して、「git svn dcommit」またはブランチのマージの前に、小さなコミットを太いコミットに押しつぶすことをお勧めします。これにより、繰り返される競合の数がある程度減少します。
  4. 押しつぶされていないブランチ履歴を保持するために、マージまたはリベースする前に、重複するブランチまたはトラッキングブランチを作成します。
  5. 「gitlist-files-u」を使用して、マージする前に競合するファイルを表示します。
  6. すべてのマージ操作の前に、マージする前に「git diff branch1 branch2」を使用して、盲目的にマージしないようにします。
  7. 「gitshowbranch..file」を使用して、ブランチの下にある特定のファイルを表示し、検証します。
于 2013-03-16T16:50:30.333 に答える