今更過ぎるが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
)から自分と同僚それぞれの差分を取るため、認証機能は削除、重複チェック機能は追加される。ということがわかる。