LoginSignup
22
14

More than 5 years have passed since last update.

3-way mergeについて調べた

Last updated at Posted at 2016-05-01

今更過ぎるが3-way mergeについて勉強。

結論

  • 2-wayだと片方に削除がある場合、もう片方が追加したとみなされる
    • 適切にマージできなかった場合、削除した機能が残っている。という事態になってしまう
  • 3-wayだと元のファイルがあるため、それぞれの差分がわかり、自動マージでも2-wayのような事態は発生しづらい

サンプル

データベースに管理者を登録するシステムがあったとする。
(コードはほんっとうに適当)

マネージャから自分には管理者以外のユーザも利用できるように認証機能を外すよう依頼された。

同僚には名前とパスワードの重複を防ぐ事を依頼された。

今まで

older.rb

require 'database'

data = Database.new

puts "are you admin? [y/N]"
unless gets.chomp == 'y'
  puts "canceled"
  exit 0
end

puts "enter your name"
name = gets.chomp
puts "enter your password"
pass = gets.chomp

data.insert(name, pass)

puts "save your info!"

自分の差分

管理者だけじゃなく、誰でも追加して良くなったので認証部分を削除する

mine.rb

 require 'database'

 data = Database.new

-puts "are you admin? [y/N]"
-unless gets.chomp == 'y'
-  puts "canceled"
-  exit 0
-end

 puts "enter your name"
 name = gets.chomp
 puts "enter your password"
 pass = gets.chomp

 data.insert(name, pass)

 puts "save your info!"

他の人の差分

名前とパスワードに重複があるかチェックする

your.rb

 require 'database'

 data = Database.new

 puts "are you admin? [y/N]"
 unless gets.chomp == 'y'
   puts "canceled"
   exit 0
 end

 puts "enter your name"
 name = gets.chomp
 puts "enter your password"
 pass = gets.chomp

+data.uniq?(name, pass)
 data.insert(name, pass)

 puts "save your info!"

diff

-> % diff -u mine.rb your.rb
--- mine.rb     2016-05-02 00:20:21.000000000 +0900
+++ your.rb     2016-05-02 00:25:28.000000000 +0900
@@ -2,11 +2,18 @@

 data = Database.new

+puts "are you admin? [y/N]"
+unless gets.chomp == 'y'
+  puts "canceled"
+  exit 0
+end
+
 puts "enter your name"
 name = gets.chomp
 puts "enter your password"
 pass = gets.chomp

+data.uniq?(name, pass)
 data.insert(name, pass)

 puts "save your info!"

2-way mergeの場合、自分の認証部分の削除が機能として追加されてしまうことになる。

(削除した機能が残ってしまっている!!)

diff3

3-way mergeのためのdiff

-> % diff3 mine.rb older.rb your.rb
====1
1:4a
2:5,10c
3:5,10c
  puts "are you admin? [y/N]"
  unless gets.chomp == 'y'
    puts "canceled"
    exit 0
  end

====3
1:9a
2:15a
3:16c
  data.uniq?(name, pass)
  • 1:4aと言うのは1つめのファイル(mine.rb)の4行目には存在しない。という意味
  • 2:5,10cと言うのは2つめのファイル(older.rb)の5行目-10行目には存在する。という意味

元となるファイル(older.rb)から自分と同僚それぞれの差分を取るため、認証機能は削除、重複チェック機能は追加される。ということがわかる。

参考にしたもの

22
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
14