Switch Git branch without files checkout

前端 未结 11 1438
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-29 15:36

Is it possible in Git to switch to another branch without checking out all files?

After switching branch I need to delete all files, regenerate them, commit and swit

相关标签:
11条回答
  • 2020-11-29 16:06

    I think you're looking for the plumbing command git read-tree. This will update the index but will not update any files in your working directory. For example, assuming branch is the name of the branch to read:

    git read-tree branch

    If you want to then commit to the branch you just read, you will also need to:

    git symbolic-ref HEAD refs/heads/branch
    0 讨论(0)
  • 2020-11-29 16:08

    In v2.24 git switch is something like a safe git checkout.
    Hence I renamed the alias below to git hop for
    "hop on the branch without changing worktree"

    For the benefit of the reader:

    While I think that Charles Bailey's solution is a correct one, this solution needs a tweak when switching to something, which is not a local branch. Also there should be some way how to do it with regular commands which is easy to understand. Here is what I came up with:

    git checkout --detach
    git reset --soft commitish
    git checkout commitish
    

    Explained:

    • git checkout --detach is the same as git checkout HEAD^{} which leaves the current branch behind and goes into "detached head state". So the next modification of HEAD no more affects any branch. Detaching HEAD does not affect the worktree nor the index.
    • git reset --soft commitish then moves HEAD to the SHA of the given commitish. If you want to update the index, too, leave --soft away, but I do not recommend to do so. This, again, does not touch the worktree, and (--soft) not the index.
    • git checkout commitish then attaches HEAD to the given commitish (branch) again. (If commitish is a SHA nothing happens.) This, too, does not affect index nor worktree.

    This solution accepts everything which refers to a commit, so this is ideal for some git alias. The rev-parse below is just a test to make sure, nothing breaks in the chain, such that typos do not accidentally switch into detached head state (error recovery would be way more complex).

    This leads to following git hop treeish alias:

    git config --global alias.hop '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'
    

    FYI, you can find it in my list of git aliases.

    0 讨论(0)
  • 2020-11-29 16:12

    Using basic git commands only:

    This answer is a bit longer than that of Charles, but it consists solely of basic git commands that I can understand and thus remember, eliminating the need to keep looking it up.

    Mark your current location (commit first if needed):

    git checkout -b temp
    

    Reset (moves) the marker to the other branch without changing working dir:

    git reset <branch where you want to go>
    

    now temp and other branch point to the same commit, and your working dir is untouched.

    git checkout <branch where you want to go>
    

    since your HEAD is already pointing to the same commit, working dir is not touched

    git branch -d temp
    

    Note that these commands are also readily available from any graphical client.

    0 讨论(0)
  • 2020-11-29 16:12

    say you want to be in branch A, but with the files from branch B

    find the current commit ref of branch A with git log, e.g. "99ce9a2",

    git checkout A
    git reset --hard B
    git reset 99ce9a2
    

    you should now be on branch A, with a folder structure corresponding to B, which show up as unstaged changes (A history has not changed).

    0 讨论(0)
  • 2020-11-29 16:14

    With so many files, you may be best off just keeping two repos, one for each branch. You can pull changes back and forth as needed. This is going to be less surprising than trying to play scurvy tricks with git.

    0 讨论(0)
  • 2020-11-29 16:16

    Or just use a patch file to patch from your otherbranch to your master

    git diff otherbranch master > ~/tmp/otherbranch.diff
    git checkout master
    git apply ~/tmp/otherbranch.diff
    
    0 讨论(0)
提交回复
热议问题