Reset local repository branch to be just like remote repository HEAD

后端 未结 21 1476
挽巷
挽巷 2020-11-22 02:19

How do I reset my local branch to be just like the branch on the remote repository?

I did:

git reset --hard HEAD

But when I run a <

相关标签:
21条回答
  • 2020-11-22 03:10

    No amount of reset and cleaning seemed to have any effect on untracked and modified files in my local git repo (I tried all the options above). My only solution to this was to rm the local repo and re-clone it from the remote.

    Fortunately I didn't have any other branches I cared about.

    xkcd: Git

    0 讨论(0)
  • 2020-11-22 03:10

    Have you forgotten to create a feature-branch and have committed directly on master by mistake?

    You can create the feature branch now and set master back without affecting the worktree (local filesystem) to avoid triggering builds, tests and trouble with file-locks:

    git checkout -b feature-branch
    git branch -f master origin/master
    
    0 讨论(0)
  • 2020-11-22 03:11

    Previous answers assume that the branch to be reset is the current branch (checked out). In comments, OP hap497 clarified that the branch is indeed checked out, but this is not explicitly required by the original question. Since there is at least one "duplicate" question, Reset branch completely to repository state, which does not assume that the branch is checked out, here's an alternative:

    If branch "mybranch" is not currently checked out, to reset it to remote branch "myremote/mybranch"'s head, you can use this low-level command:

    git update-ref refs/heads/mybranch myremote/mybranch
    

    This method leaves the checked out branch as it is, and the working tree untouched. It simply moves mybranch's head to another commit, whatever is given as the second argument. This is especially helpful if multiple branches need to be updated to new remote heads.

    Use caution when doing this, though, and use gitk or a similar tool to double check source and destination. If you accidentally do this on the current branch (and git will not keep you from this), you may become confused, because the new branch content does not match the working tree, which did not change (to fix, update the branch again, to where it was before).

    0 讨论(0)
  • 2020-11-22 03:15

    Setting your branch to exactly match the remote branch can be done in two steps:

    git fetch origin
    git reset --hard origin/master
    

    If you want to save your current branch's state before doing this (just in case), you can do:

    git commit -a -m "Saving my work, just in case"
    git branch my-saved-work
    

    Now your work is saved on the branch "my-saved-work" in case you decide you want it back (or want to look at it later or diff it against your updated branch).

    Note that the first example assumes that the remote repo's name is "origin" and that the branch named "master" in the remote repo matches the currently checked-out branch in your local repo.

    BTW, this situation that you're in looks an awful lot like a common case where a push has been done into the currently checked out branch of a non-bare repository. Did you recently push into your local repo? If not, then no worries -- something else must have caused these files to unexpectedly end up modified. Otherwise, you should be aware that it's not recommended to push into a non-bare repository (and not into the currently checked-out branch, in particular).

    0 讨论(0)
  • 2020-11-22 03:17

    This is what I use often:

    git fetch upstream develop;
    git reset --hard upstream/develop;
    git clean -d --force;
    

    Note that it is good practice not to make changes to your local master/develop branch, but instead checkout to another branch for any change, with the branch name prepended by the type of change, e.g. feat/, chore/, fix/, etc. Thus you only need to pull changes, not push any changes from master. Same thing for other branches that others contribute to. So the above should only be used if you have happened to commit changes to a branch that others have committed to, and need to reset. Otherwise in future avoid pushing to a branch that others push to, instead checkout and push to the said branch via the checked out branch.

    If you want to reset your local branch to the latest commit in the upstream branch, what works for me so far is:

    Check your remotes, make sure your upstream and origin are what you expect, if not as expected then use git remote add upstream <insert URL>, e.g. of the original GitHub repo that you forked from, and/or git remote add origin <insert URL of the forked GitHub repo>.

    git remote --verbose
    
    git checkout develop;
    git commit -m "Saving work.";
    git branch saved-work;
    git fetch upstream develop;
    git reset --hard upstream/develop;
    git clean -d --force
    

    On GitHub, you can also checkout the branch with the same name as the local one, in order to save the work there, although this isn't necessary if origin develop has the same changes as the local saved-work branch. I'm using the develop branch as an example, but it can be any existing branch name.

    git add .
    git commit -m "Reset to upstream/develop"
    git push --force origin develop
    

    Then if you need to merge these changes with another branch while where there are any conflicts, preserving the changes in develop, use:

    git merge -s recursive -X theirs develop
    

    While use

    git merge -s recursive -X ours develop
    

    to preserve branch_name's conflicting changes. Otherwise use a mergetool with git mergetool.

    With all the changes together:

    git commit -m "Saving work.";
    git branch saved-work;
    git checkout develop;
    git fetch upstream develop;
    git reset --hard upstream/develop;
    git clean -d --force;
    git add .;
    git commit -m "Reset to upstream/develop";
    git push --force origin develop;
    git checkout branch_name;
    git merge develop;
    

    Note that instead of upstream/develop you could use a commit hash, other branch name, etc. Use a CLI tool such as Oh My Zsh to check that your branch is green indicating that there is nothing to commit and the working directory is clean (which is confirmed or also verifiable by git status). Note that this may actually add commits compared to upstream develop if there is anything automatically added by a commit, e.g. UML diagrams, license headers, etc., so in that case, you could then pull the changes on origin develop to upstream develop, if needed.

    0 讨论(0)
  • 2020-11-22 03:18

    Only 3 commands will make it work

    git fetch origin
    git reset --hard origin/HEAD
    git clean -f
    
    0 讨论(0)
提交回复
热议问题