diff --git a/README.md b/README.md index 6d8e4c52..c96ae24e 100644 --- a/README.md +++ b/README.md @@ -223,6 +223,7 @@ g.branch(branch2).merge # merges HEAD with branch2 g.branch(name).in_branch(message) { # add files } # auto-commits g.merge('new_branch') +g.merge('new_branch', 'merge commit message', no_ff: true) g.merge('origin/remote_branch') g.merge(g.branch('master')) g.merge([branch1, branch2]) diff --git a/lib/git/base.rb b/lib/git/base.rb index 21a26621..436b3255 100644 --- a/lib/git/base.rb +++ b/lib/git/base.rb @@ -347,8 +347,8 @@ def push(remote = 'origin', branch = 'master', opts = {}) # merges one or more branches into the current working branch # # you can specify more than one branch to merge by passing an array of branches - def merge(branch, message = 'merge') - self.lib.merge(branch, message) + def merge(branch, message = 'merge', opts = {}) + self.lib.merge(branch, message, opts) end # iterates over the files which are unmerged diff --git a/lib/git/lib.rb b/lib/git/lib.rb index 3dfb81f5..0eee89b3 100644 --- a/lib/git/lib.rb +++ b/lib/git/lib.rb @@ -714,8 +714,9 @@ def checkout_file(version, file) command('checkout', arr_opts) end - def merge(branch, message = nil) + def merge(branch, message = nil, opts = {}) arr_opts = [] + arr_opts << '--no-ff' if opts[:no_ff] arr_opts << '-m' << message if message arr_opts += [branch] command('merge', arr_opts) diff --git a/tests/units/test_merge.rb b/tests/units/test_merge.rb index a0d74c3b..8fd10712 100644 --- a/tests/units/test_merge.rb +++ b/tests/units/test_merge.rb @@ -101,4 +101,33 @@ def test_branch_and_merge_multiple end end -end \ No newline at end of file + def test_no_ff_merge + in_temp_dir do |path| + g = Git.clone(@wbare, 'branch_merge_test') + Dir.chdir('branch_merge_test') do + + g.branch('new_branch').in_branch('first commit message') do + new_file('new_file_1', 'hello') + g.add + true + end + + g.branch('new_branch2').checkout + g.merge('new_branch', 'merge commit message') # ff merge + assert(g.status['new_file_1']) # file has been merged in + assert_equal('first commit message', g.log.first.message) # merge commit message was ignored + + g.branch('new_branch').in_branch('second commit message') do + new_file('new_file_2', 'hello') + g.add + true + end + + assert_equal('new_branch2', g.current_branch) # still in new_branch2 branch + g.merge('new_branch', 'merge commit message', no_ff: true) # no-ff merge + assert(g.status['new_file_2']) # file has been merged in + assert_equal('merge commit message', g.log.first.message) + end + end + end +end