jonasfh
jonasfh

Reputation: 4569

git rebase HEAD^^ fails

This puzzles me: Usually git rebase HEAD^^^^^^^ simply states that:

Current branch test is up to date.

Today, however, I was demonstrating git rebase -i to a colleague, and i first did git rebase 63c1e126, where 63c1e126 was a commit picked from the commit log, and the rebase failed with a conflict. How can this be?

The reason for doing the rebase -i was to clean up an issue where the same commits had been applied twice after som other rebase/force push mess (i guess), and the rebase got a conflict on the first commit that was applied for the second time (with a different commit hash, and some whitespace changes).

Output from git:

$ git rebase 63c1e126
First, rewinding head to replay your work on top of it...
Applying: Cherrypicking python files to commit to master
Applying: (#1379) Included .nc files in ignore-list
Applying: Added monthly index-file and stations rtf to gitignore
Applying: Initial clean-up
Applying: Reformat using Eclipse formatting rules
Applying: (#1386) Remove panelGrid warning on login page
...
Applying: (#1378) Apply replacement column headers on export
Applying: (#1378) Eclipse formatting
Applying: (#1381) facilitating new object_spec
Applying: Initial clean-up
Using index info to reconstruct a base tree...
M   WebApp/WebContent/resources/python/export/py_func/copernicus.py
.git/rebase-apply/patch:33: trailing whitespace.
      #local_folder = filepath_local.rsplit('/',1)[0] 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging WebApp/WebContent/resources/python/export/py_func/copernicus.py
CONFLICT (content): Merge conflict in WebApp/WebContent/resources/python/export/py_func/copernicus.py
error: Failed to merge in the changes.
Patch failed at 0022 Initial clean-up
Use 'git am --show-current-patch' to see the failed patch

Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

git log gives something like (Replaced commit hashes):

$ git log --graph --decorate --oneline
* aaaaaaaa (HEAD -> github/1381_bak, origin/github/1381_bak) (# 1381) index file added to gitignore
* aaaaaaaa (#1381) Clean up
* aaaaaaaa (#1381) Added delete folder functionality
* aaaaaaaa (#1381) Added export-date to CMEMS export database
* aaaaaaaa (#1381) Working CMEMS version
* aaaaaaaa (#1381) Making local_folder global variable, and minor bug-fixes
* aaaaaaaa (#1381) General cleanup
* aaaaaaaa (#1381)  Removing stray debugging
* aaaaaaaa (#1381) Removing bad use of try:except statements
* aaaaaaaa (#1381) General clean-up and improved SQL-functionality
* aaaaaaaa (#1381) Facilitating change in directory structure
*   aaaaaaaa Merge remote-tracking branch 'origin/github/1381' into github/1381
|\  
| * aaaaaaaa (#1381) facilitating new object_spec
| * aaaaaaaa (#1381) Improved handling of L0 files
| * aaaaaaaa (#1381) toml files included in setup-scripts
| *   aaaaaaaa Merge branch 'github/1381' into origin/github/1381
| |\  
| | * aaaaaaaa (#1381) Fixed bug in sql-db
| | * aaaaaaaa (#1381) Updated .gitignore file
| | * aaaaaaaa (#1381) Minor function renaming. just aesthetic.
| | * aaaaaaaa (#1381) get_export_list:  bug-fix
| | * aaaaaaaa (#1381) Putting cmems_delay function on hold.
| | * aaaaaaaa (#1381) Reworked logic to omit use of sys.exit()
| |/  
| * aaaaaaaa (#1381) Style and format cleanup for readability
| * aaaaaaaa (#1381) meta handling clean-up
| * aaaaaaaa Initial clean-up
* | aaaaaaaa (#1381) facilitating new object_spec
* | aaaaaaaa (#1381) Improved handling of L0 files
* | aaaaaaaa (#1381) toml files included in setup-scripts
* | aaaaaaaa (#1381) Fixed bug in sql-db
* | aaaaaaaa (#1381) Updated .gitignore file
* | aaaaaaaa (#1381) Minor function renaming. just aesthetic.
* | aaaaaaaa (#1381) get_export_list:  bug-fix
* | aaaaaaaa (#1381) Putting cmems_delay function on hold.
* | aaaaaaaa (#1381) Reworked logic to omit use of sys.exit()
* | aaaaaaaa (#1381) Style and format cleanup for readability
* | aaaaaaaa (#1381) meta handling clean-up
* | aaaaaaaa Initial clean-up
* | aaaaaaaa (origin/v2.0.6a) (#1378) Eclipse formatting
* | aaaaaaaa (#1378) Apply replacement column headers on export
* | aaaaaaaa (#1378) Don't include units if replacement column headers are configured
* | aaaaaaaa (#1378) Add replaceColumnHeaders to export config
* | aaaaaaaa (#1386) Remove panelGrid warning on login page
* | aaaaaaaa Reformat using Eclipse formatting rules
|/  
* aaaaaaaa (origin/master, origin/HEAD, master) Added monthly index-file and stations rtf to gitignore
* aaaaaaaa (#1379) Included .nc files in ignore-list
* aaaaaaaa Cherrypicking python files to commit to master
* 63c1e126 (#1331) integration with new cmems_converter.py

Upvotes: 0

Views: 374

Answers (1)

Schwern
Schwern

Reputation: 164759

git log lies to you and shows a linear history. Git history is not linear, branches and merges are literally that. git log --graph shows the true history. Your history has merges in it. That means your commit history looks something like this.

63c1e126 - B - C - I - G - H - K [github/1381_bak]
            \         /
             D - E - F

git rebase, by default, will drop merge commits and flatten out your history. Something like this.

63c1e126 - B - D1 - C1 - E1 - I1 - F1 - G1 - H1 - K1 [github/1381_bak]

Note how the commits of the branches now interleave. This can cause conflicts as E was not written on top of C.

If we look at the rebase ordering, we can see the interleaved commits just after Added monthly index-file and stations rtf to gitignore. Both Initial clean-up and Reformat using Eclipse formatting rules were originally written on top of Added monthly index-file and stations rtf to gitignore. But rebase is puts Reformat using Eclipse formatting rules on top of Initial clean-up. Similar problems with the second Initial clean-up.

$ git rebase 63c1e126
First, rewinding head to replay your work on top of it...
Applying: Cherrypicking python files to commit to master
Applying: (#1379) Included .nc files in ignore-list
Applying: Added monthly index-file and stations rtf to gitignore
Applying: Initial clean-up                                        (right)
Applying: Reformat using Eclipse formatting rules                 (left)
Applying: (#1386) Remove panelGrid warning on login page          (left)
...
Applying: (#1378) Apply replacement column headers on export
Applying: (#1378) Eclipse formatting
Applying: (#1381) facilitating new object_spec
Applying: Initial clean-up

Note that if you use the fairly new git rebase -r or --rebase-merges, Git will try to keep your branches and recreate the merges. Unless you explicitly want to flatten your history, use -r.

Upvotes: 2

Related Questions