ストーリー:プロジェクトの途中で、私の同僚はmasterから新しいブランチを作成し、彼女の重いリファクタリング作業を開始しました。 masterからブランチを作成し、ページで新しい作業を開始しました。私たちは定期的にコミットしていますが、コードをmasterにリベースできるのは私だけです(同僚の変更が重すぎて、マスターからまだデプロイできないため)。残念ながら、私たちの仕事のいくつかは同じファイルに依存しています。そのため、数日間の作業の後、最終的に変更をmasterにリベースしたいと思った後、彼女は多くのgit競合を抱えていました。
my_branch #---#----#-#-------#----#--#-----#---#----#----#
/ \ \ \ \ \ \
master *-------*--------------*---*---*--------------*----*----*
\ /
her branch #------#-------#-----------#-----------#------------#
質問1は:同じファイルで作業しているときに多くのgitの競合を防ぐ方法は? (または、この状況でのベストプラクティスは何ですか?)
しかし、これで質問は終わりではありません、...絶対に正しいため、彼女はマスターからブランチにリベースしようとしました(変更をコミットするため)。したがって、コミットマップは何かに見えるはずです。このような
my_branch #---#----#-#-------#----#--#-----#---#----#----#
/ \ \ \ \ \ \
master *-------*--------------*---*---*--------------*----*----*
\ \ \ /
her branch #------#-------#----*------#-----*-----#------------#
そして、これが私たちを悩ませているものです。これらのリベースの間、彼女はそれらの対立を修正していました。しかし、gitは競合修正に関する彼女の決定を覚えていないので、彼女が別のgitリベースをmasterからherに行ったとき-branch彼女は同じgitの競合を再度修正する以前のリベースで修正する必要がありました。
質問2は:masterブランチからのgitリベース後にgit競合修正を記憶するようにgitに指示する方法なので、次のリベース後に同じ競合を再度修正する必要はありませんか?
幸い、gitにはgit rerere
と呼ばれるこの問題を正確に処理するメカニズムがあります。基本的に、git rerere
を有効にしている場合、競合を解決するたびに、特定の方法でその正確な競合を解決したという事実があります。記憶されています。同じ競合が再び発生した場合、同じ解決策が自動的に使用されます。以下にいくつかの役立つ記事があります。
...しかし、基本的には次のことができます。
git config --global rerere.enabled 1
...そしてそれを忘れて、より簡単なリベース/マージを楽しんでください:)
常に--onto
スイッチを使用してリベースしていることを確認してください。
競合を防ぐには、フローティング開発ブランチを使用します。各開発者は、開発ブランチを継続的にリベースします。開発者は自分が実装したばかりのことを知っており、競合の解決に問題がないはずなので、これは簡単です。リベースする代わりに、最終バージョンをマージするだけです(すでにリベースされています)。