@@ -246,18 +246,40 @@ func (repo *Repository) GetDiffOrPatch(base, head string, w io.Writer, patch, bi
246246
247247// GetDiff generates and returns patch data between given revisions, optimized for human readability
248248func (repo * Repository ) GetDiff (base , head string , w io.Writer ) error {
249- return NewCommand (repo .Ctx , "diff" , "-p" ).AddDynamicArguments (base , head ).Run (& RunOpts {
250- Dir : repo .Path ,
251- Stdout : w ,
252- })
249+ stderr := new (bytes.Buffer )
250+ err := NewCommand (repo .Ctx , "diff" , "-p" ).AddDynamicArguments (base + "..." + head ).
251+ Run (& RunOpts {
252+ Dir : repo .Path ,
253+ Stdout : w ,
254+ Stderr : stderr ,
255+ })
256+ if err != nil && bytes .Contains (stderr .Bytes (), []byte ("no merge base" )) {
257+ return NewCommand (repo .Ctx , "diff" , "-p" ).AddDynamicArguments (base , head ).
258+ Run (& RunOpts {
259+ Dir : repo .Path ,
260+ Stdout : w ,
261+ })
262+ }
263+ return err
253264}
254265
255266// GetDiffBinary generates and returns patch data between given revisions, including binary diffs.
256267func (repo * Repository ) GetDiffBinary (base , head string , w io.Writer ) error {
257- return NewCommand (repo .Ctx , "diff" , "-p" , "--binary" , "--histogram" ).AddDynamicArguments (base , head ).Run (& RunOpts {
258- Dir : repo .Path ,
259- Stdout : w ,
260- })
268+ stderr := new (bytes.Buffer )
269+ err := NewCommand (repo .Ctx , "diff" , "-p" , "--binary" , "--histogram" ).AddDynamicArguments (base + "..." + head ).
270+ Run (& RunOpts {
271+ Dir : repo .Path ,
272+ Stdout : w ,
273+ Stderr : stderr ,
274+ })
275+ if err != nil && bytes .Contains (stderr .Bytes (), []byte ("no merge base" )) {
276+ return NewCommand (repo .Ctx , "diff" , "-p" , "--binary" , "--histogram" ).AddDynamicArguments (base , head ).
277+ Run (& RunOpts {
278+ Dir : repo .Path ,
279+ Stdout : w ,
280+ })
281+ }
282+ return err
261283}
262284
263285// GetPatch generates and returns format-patch data between given revisions, able to be used with `git apply`
0 commit comments