Reverting an empty merge commit after it has been pushed

时间:2017-08-04 12:23:15

标签: git github git-merge

Steps I took:

  1. Merged master branch into my feature branch.
  2. Began resolving commits, accidentally hit resolve using theirs on one of the conflicts and wanted to redo it.
  3. Reset all changes.
  4. At this point I couldn't seem to do anything as I was in a merge state, I accidentally committed these changes and pushed to GitHub (I used SourceTree and left the option ticked!)

Now whenever I try to merge from master it assumes I already have the latest changes and nothing is added to my feature branch.

I tried running git revert -m 1 <commit hash of the empty commit> but I was getting:

On branch feature/profile_page
Your branch is up-to-date with 'origin/feature/profile_page'.
nothing to commit, working tree clean

Then I attempted to revert the change before it which did work but now the local is one commit behind the feature branch on GitHub.

Any ideas?

Here's my log:

* ff46aa6 (HEAD -> feature/profile_page, origin/feature/profile_page) Revert     "Added link to user profile page in MainMenu"
*   64e96b3 .
|\  
| * 9c023f5 (origin/master, origin/HEAD, master) Made the delete button invoke a pop-up which can delete the responders.
| * 87a028c Added a placeholder page that can be used to link to, or navigate from when you need a placeholder page.
| * 6ae954d Added the ResponderGroupPage and new delete icon.
| * 752fb83 Updated the layout to closer match the mock-up
| * 55e8c29 Added missing schedule icon
| * 6255338 Tweaks to make the page work/look correct on iOS
| * 178beb1 Update to the IncidentHistoryPage so that it displays a history of an event as a list under your selected item when you select one.
| * 5bfbbf1 Added titles to pages and button to link to IncidentHistoryPage.
| * 4570346 Added basic IncidentHistoryPage using mock data
* | 663a378 Added link to user profile page in MainMenu
* | 123da81 Added EditProfilePasswordPage and CloseAccountPage
* | 40a00ea Added change phone number page
* | b80f9af Added Change email page
* | 8a3710a Added MySubscriptions Page
* | 3c8ddee Added MyAccountPage
* | dd4fa9e ImageWithPopupMenu handles events
* | cbfae5f Added ImageWithPopupMenu
* | 304dd5c .
* | b730e7f EditProfilePage first pass
* | 0ac9603 Added UserProfile view model
* | af7f6ed .
* | 5f4e0c0 Profile Page first pass
| | * bbbbc4d (origin/feature/api_hooks) Setting up a wearer after activating a device will now associate the wearer with the device. Added WearerDataStore which will retrieve and manage the wearer list shown on the home screen.
| | * 45b3639 App will now check if a user is currently logged in when it launches.     - If there is currently an active session, which is not authenticated with the API key, then the app will navigate to the home screen instead of landing.
| | * 88250f5 Sign in page now using Bindings with view model for the entry text. Sign in page now using localisation. Added api calls to sign up process. Added validation to the sign up process for checking email address and phone numbers.
| |/  
| *   2590342 Merge branch 'master' of https://github.com/FirstAppLtd    /Watchie_Xamarin
| |\  
| | * 4e13537 Added the EditSafezonePage and placeholder pop-ups for CALL/RAISE SOS on the Homescreen and Wearer Profile screens.
| | *   ee1a2dc Merge branch 'master' into hockeyapp_integration
| | |\  
| | | * 7f1d961 New icon paths
| | * |   3d05a1f Merge branch 'master' into hockeyapp_integration
| | |\ \  
| | | |/  
| | | *   66d6303 Reworked the Homescreen so that it works on iOS as the list view didn’t work correctly. I moved the Icons on iOS into the root resources so that they can be indexed in the same way as on Android to avoid any needing to do #ifIOS look here.
| | | |\  
| | | | * d7e2d63 (origin/UpdatingIcons) Fix for the Homescreen so that it displays correctly on iOS. Moved where the iOS icons are stored so that they can be referenced exactly like the Android assets.
| | | | * 5d6846a New branch updating the icons
| | * | | a8d3ddc Set Android HockeyAppId
| | * | | df479a2 Set iOS HockeyAppId
| | * | | d0c820d Integrated HockeyAppId from info.plist. Disabled AuthenticateInstallation call for current config.
| | * | | d0702fe Added iOS HockeyApp to the Info.plist file
| | * | | 05f627a Refactored the HockeySDK App ID to the AssemblyInfo file for Android
| | * | | f99cf8e Added HockeySDK update to Android
| | * | | d0c94d0 Added ability to enable HockeySDK User metrics in Android
| | * | | 2b14729 Disabled HockeySDK for iOS
| | * | | 32fa935 Integrated HockeySDK for Android to detect crashes
| | * | | 58017a5 Added HockeySDK NuGet package to Android solution

3 个答案:

答案 0 :(得分:2)

According to your log, I think the cleanest solution is:

git checkout 663a3784ab82f019996a5091f3dfb2401c0403b5 -b feature_clean

This will checkout the commit before the merge you marked "valid" (before your edit) as a new branch "feature_clean". Then you can perform the merge (git merge master) and make sure it is clean. Eventually, you can replace feature by feature_clean, e.g. delete the former and rename the latter:

git branch -d feature # delete old branch
git branch -m feature_clean feature # rename clean branch
git push -f # force push feature to rewrite history on remote

The reason why I do not suggest git reset 663a37... --hard followed by a force-push is that this way you preserve the "broken" branch and can perform the git checkout 663... as often as you need it to resolve the conflicts.

I hope this will help.

答案 1 :(得分:1)

You reverted the commit before the merge, which will create an new commit undoing that commit. I think what you wanted to do was git reset which reset the branch reference to the commit.

If you want to reset to before you merged anything you can do:

git checkout feature/profile_page git reset --hard 663a378 which will set the feature branch locally to the commit before the merge commit. In remote you would then have to do a git push -f, which will rewrite the history in your remote. If you are the only one working on the branch, and given you have the correct permissions, that will be fine.

Or you could create a new feature branch on 663a378 git checkout -b 663a378, which you use instead, doing the merge you intended.

答案 2 :(得分:1)

Here is one way to replay your commit :

  1. restart from commit 663a378, using a "work in progress" branch :

    git branch wip 663a378
    git checkout wip
    
  2. re-run "merge master into this branch" :

    git merge master
    
  3. solve conflicts,
    and commit, possibly edit commit to put the branch name you expect in the message (e.g : "merge master into feature/profile_page" instead of "merge master into wip")

  4. if you are satisfied with this new merge : move the previous branches to these new commits :

    # push current commit to the remote "feature/profile_page" branch :
    git push -f origin wip:profile_page
    
    # set your local "profile_page" branch to this new commit :
    git branch -f profile_page wip
    
    # switch to other branch and delete wip :
    git checkout profile_page
    git branch -d wip