Switch to another branch without changing the workspace files

前端 未结 8 1413
深忆病人
深忆病人 2021-01-30 06:26

I cloned a git repository from GitHub, made some changes and some commits; I made quite a lot and all are quite dirty, so they\'re not suitable for a pull request. Now I created

相关标签:
8条回答
  • 2021-01-30 06:49

    The best bet is to stash the changes and switch branch. For switching branches, you need a clean state. So stash them, checkout a new branch and apply the changes on the new branch and commit it

    0 讨论(0)
  • 2021-01-30 06:50

    Simplest way to do is as follows:

    git fetch && git checkout <branch_name>
    
    0 讨论(0)
  • 2021-01-30 06:55

    Another way, if you want to create a new commit instead of performing a merge:

    git checkout cleanchanges
    git reset --hard master
    git reset cleanchanges
    
    git status
    git add .
    git commit
    

    The first (hard) reset will set your working tree to the same as the last commit in master.

    The second reset will put your HEAD back where it was, pointing to the tip of the cleanchanges branch, but without changing any files. So now you can add and commit them.


    Afterwards, if you want to remove the dirty commits you made from master (and assuming you have not already pushed them), you could:

    git checkout master
    git reset --hard origin/master
    

    This will discard all your new commits, returning your local master branch to the same commit as the one in the repository.

    0 讨论(0)
  • 2021-01-30 06:55

    git fetch && git checkout branch_name( "branch_name" here is the name of the branch )

    Then you will see message, Switched to a new branch 'branch_name' Branch 'branch_name' set up to track remote branch 'branch_name' from 'origin'.

    0 讨论(0)
  • 2021-01-30 07:06

    It sounds like you made changes, committing them to master along the way, and now you want to combine them into a single commit.

    If so, you want to rebase your commits, squashing them into a single commit.

    I'm not entirely sure of what exactly you want, so I'm not going to tempt you with a script. But I suggest you read up on git rebase and the options for "squash"ing, and try a few things out.

    0 讨论(0)
  • 2021-01-30 07:08

    Why not just git reset --soft <branch_name>?

    Demonstration:

    mkdir myrepo; cd myrepo; git init
    touch poem; git add poem; git commit -m 'add poem'  # first commit
    git branch original
    echo bananas > poem; git commit -am 'change poem'  # second commit
    echo are tasty >> poem  # unstaged change
    git reset --soft original
    

    Result:

    $ git diff --cached
    diff --git a/poem b/poem
    index e69de29..9baf85e 100644
    --- a/poem
    +++ b/poem
    @@ -0,0 +1 @@
    +bananas
    $ git diff
    diff --git a/poem b/poem
    index 9baf85e..ac01489 100644
    --- a/poem
    +++ b/poem
    @@ -1 +1,2 @@
     bananas
    +are tasty
    

    One thing to note though, is that the current branch changes to original. You’re still left in the previous branch after the process, but can easily git checkout original, because it’s the same state. If you do not want to lose the previous HEAD, you should note the commit reference and do git branch -f <previous_branch> <commit> after that.

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