Switching branches without touching the working tree?

前端 未结 5 515
無奈伤痛
無奈伤痛 2020-12-07 18:56

I am currently on a debug branch, and would like to switch to the master branch, without modifying the working tree (leave it the way it is in the debug branch), so I can co

相关标签:
5条回答
  • 2020-12-07 19:06

    As far as I know, you can't. Branch switching means checking out into the working copy a version of the code that sits in the HEAD of that branch.

    You want to merge your branches. Do

    git checkout master
    git merge devel
    

    The branches will now be synchronized. If you want to merge a subset of changes, you can specify a commit or a range of commits. Also take a look at cherry-pick For example:

    git checkout master
    git cherry-pick devel
    

    Will merge the last commit in devel back into master.

    If you need to merge two branches that sit on different hosts, have a look at git pull and git push.

    0 讨论(0)
  • 2020-12-07 19:14

    You can stash (git stash) your changes, switch branches, unstash (git stash pop) your changes, add and commit the changes.

    If you want the exact state of debug, then simply merge debug into master (or reset master to debug).

    0 讨论(0)
  • 2020-12-07 19:18

    This answer uses low-level "plumbing" commands. Be careful. If you prefer "porcelain" commands, go with this answer which produces the same results.

    You can reset your head to point at master without changing the index or working tree with:

    git symbolic-ref HEAD refs/heads/master
    

    You should probably reset the index so that you can selectively apply your working tree changes, otherwise you may end up committing all the differences between master and the debug branch, which is probably a bad thing.

    git reset
    

    Once you've made the commit that you want to make you can return to your debug branch with:

    git symbolic-ref HEAD refs/heads/debug-branch
    git reset
    
    0 讨论(0)
  • 2020-12-07 19:20

    You can do the following:

    git checkout --detach
    git reset --soft master
    git checkout master
    

    Explanation:

    If you are on the debug branch and would do git reset --soft master you would leave your working tree and index untouched and move to the commit master points to. The problem is, debug will be reset to this commit too. So your commits on debug are "lost" (well, not really, but they are not directly accessible anymore) and you are still on the debug branch.

    To prevent git reset from moving debug but still setting your HEAD to the master commit, you first do git checkout --detach to point HEAD directly to your current commit (see man git-checkout, section "DETACHED HEAD"). Then you can do the reset without touching the debugbranch.

    Now HEAD is pointing directly to the commit master points to, i.e. it is still detached. You can simply git checkout master to attach to master and are now ready to commit on the master branch.

    Note that git checkout (by default and when no path is passed) only updates files that have been changed between the "source" and "target" commit and local modifications to the files in the working tree are kept. As both commits are the same in this case, no files in the working directory are touched.

    0 讨论(0)
  • 2020-12-07 19:32

    Here is a raw workflow

     git stash
     git checkout otherbranch
     git stash apply
     git reset
     git add # interactively? just add the hunks/changes you want to commit
     git commit
    

    And to go back

     git reset --hard # watch it here! make sure you haven't added more changes that you wanted to keep
     git checkout debug
     git stash pop
    

    Alternatively, you might just commit the relevant changes 'here' and push / cherry-pick onto the master branch.

    0 讨论(0)
提交回复
热议问题