1

svnからgitに移行することが実行可能なオプションであるかどうかを評価しようとしています。gitでのマージはsvnでのマージよりもはるかにうまく機能すると聞きましたが、私のテストではそれを見ていません。

これが私がしたことです:

  • main.cというファイルを作成しました

    #include <stdio.h>    
    
    function main() {
      int myNum = 10;
    
      printf("Hi, my num is %d\n", myNum);
    
      return 0;
    }
    
  • git init、git add。、git commit -m "Created main.c"、およびオリジンマスターにプッシュ

  • main.cファイルでは、意図的にコーディング標準に準拠しておらず、関数に誤った名前を付けています。
  • 別のユーザーがやって来て、コーディング標準に準拠するようにコードを変更し(中括弧は次の行に移動されます)、コミットしてプッシュします

    #include <stdio.h>    
    
    function main()
    { //This was changed to a specific coding standard
      int myNum = 10;
    
      printf("Hi, my num is %d\n", myNum);
    
      return 0;
    }
    
  • mainの前に関数を追加し、コミットしてプッシュしようとすると、マスターブランチが最新ではないことが通知されるので、git pull origin masterを実行して最新の状態にすると、競合が発生します

    <<<<<<< HEAD
    function main() {
      int myNum = 10;
    =======
    function main()
    {
      int myNum = 10;
    >>>>>>> f0aceffb16f0a24638493367f4be6f2a09e22a82
    

質問:私がこれを間違って行っているかどうか誰かに教えてもらえますか?私が省略しているために自分自身に悲しみを引き起こしている特定のステップはありますか?おそらく、マージがsvnよりも単純であると想定されていることを本当に理解していませんか?

時間を割いてくれてありがとう、
クリス

4

2 に答える 2

1

同じ行に2つの変更を加えた場合、Gitは必要なものを推測できません。それができるSCMはありません。人間は、どのバージョンが「勝つ」べきかをそれに伝えなければなりません。

gitがsubversionよりもきれいにマージされるいくつかのコーナーケースがあります。私はそれらを目の前に持っていませんが、率直に言って、現代の破壊では、マージに実質的な違いはないでしょう。

gitを使用するかどうかの決定は、いくつかのマージブラックマジックに帰着しません。それは、gitが全体としてどのように動作するかにかかっています。

私にとって、gitを他のSCMと区別するのは、それがどのように機能するかです。加法モデルを使用し(新しいコミットはグラフへの追加です)、各コミットはハッシュ化されるため、gitで何かを失うことは非常に困難です。その複雑なマージはうまくいかず、どのように巻き戻すかわからない、ひどい混乱を招きますか?マージgit reset --hard前のコミットのみ。ブランチをリセットして11コミットし、後で10コミットにする必要があると判断しますか?問題ありません。ブランチを10番目のコミットに戻すだけです。最新の機能ブランチは、マスターではなく開発に基づいているべきだと判断しましたか?その変更を行うためのほんのいくつかのコマンドも。

Gitの不変の性質とコンテンツのハッシュは、SVNでは得られなかったものを私に与えてくれます。自信。私が何かを台無しにした場合、私は元の場所に戻る方法を見つけることができるという自信。他の人と共有する前に、自分の変更を調べて、それらが正しいことを確認できるという自信。「あら……みんなに何をしたんだ?」というパニックは感じません。

さらに、私が頻繁に使用するものではありませんが、別の開発者から変更を直接プルしたり、電子メールで送信されたパッチファイルを適用したりする機能は優れた柔軟性です。

于 2012-06-25T21:57:41.283 に答える
1

あなたは両方とも近くにあった線を変更しました、そしてこのように近くの領域をマージするとき、Gitは賢明です。ただし、完全に異なるリージョンで変更が行われた場合、マージは正常に実行されます。

kdiff3のようないくつかのマージツールはこのマージを自動的に解決し、ほとんどの場合正しいでしょうが、Gitは危険なマージが自動的に解決されることを望んでいないと思います。

于 2012-06-25T22:04:37.823 に答える