sync: try to fast forward merge branches before checking published state

If the local branch changed state since its last upload, the data
cached in .git/config related to the last uploaded CL might not be
that relevant.  If we're able to fast forward merge to the latest
tree state, then let's do that.  This would be akin to checking
out a detached head before syncing where we already switch state.

If we aren't able to fast forward merge, then it's not a big deal
as we'll continue on to the existing branch checking logic.

This would be easy to reproduce by doing something like:
  $ repo start foo .
  $ git revert HEAD
  $ repo upload --cbr .
  $ git reset --hard HEAD^
  <CL is merged>
  $ repo sync .
  <we can fast forward>

Change-Id: I7d62f3d1ba5314a349d85b4dbb0ec8352eca18bb
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/238552
Tested-by: Mike Frysinger <vapier@google.com>
Reviewed-by: Michael Mortensen <mmortensen@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
1 file changed
tree: 54e676eeb3cbadd97c1a87659794c896df33890c
  1. docs/
  2. hooks/
  3. subcmds/
  4. tests/
  5. .flake8
  6. .gitattributes
  7. .gitignore
  8. .mailmap
  9. .project
  10. .pydevproject
  11. color.py
  12. command.py
  13. COPYING
  14. editor.py
  15. error.py
  16. event_log.py
  17. git_command.py
  18. git_config.py
  19. git_refs.py
  20. git_ssh
  21. gitc_utils.py
  22. main.py
  23. manifest_xml.py
  24. pager.py
  25. platform_utils.py
  26. platform_utils_win32.py
  27. progress.py
  28. project.py
  29. pyversion.py
  30. README.md
  31. repo
  32. repo_trace.py
  33. run_tests
  34. SUBMITTING_PATCHES.md
  35. wrapper.py
README.md

repo

Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is not meant to replace Git, only to make it easier to work with Git. The repo command is an executable Python script that you can put anywhere in your path.