web-dev-qa-db-ja.com

gitが多くのコミットをリベースするときに多くのgitの競合を防ぐ方法は?

ストーリー:プロジェクトの途中で、私の同僚は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に指示する方法なので、次のリベース後に同じ競合を再度修正する必要はありませんか?

42
equivalent8

幸い、gitにはgit rerereと呼ばれるこの問題を正確に処理するメカニズムがあります。基本的に、git rerereを有効にしている場合、競合を解決するたびに、特定の方法でその正確な競合を解決したという事実があります。記憶されています。同じ競合が再び発生した場合、同じ解決策が自動的に使用されます。以下にいくつかの役立つ記事があります。

...しかし、基本的には次のことができます。

git config --global rerere.enabled 1

...そしてそれを忘れて、より簡単なリベース/マージを楽しんでください:)

56
Mark Longair

常に--ontoスイッチを使用してリベースしていることを確認してください。

競合を防ぐには、フローティング開発ブランチを使用します。各開発者は、開発ブランチを継続的にリベースします。開発者は自分が実装したばかりのことを知っており、競合の解決に問題がないはずなので、これは簡単です。リベースする代わりに、最終バージョンをマージするだけです(すでにリベースされています)。

3
Let_Me_Be