如何丢弃临时创建的git分支

时间:2016-02-23 19:44:49

标签: git branch branching-and-merging

http://github.com/maximveksler/IKnowKungFu

的干净克隆开始
➜  IKnowKungFu git:(master) git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

我想创建一个临时分支

➜  IKnowKungFu git:(master) git checkout -b submodule_nightmare
Switched to a new branch 'submodule_nightmare'

做了一些改变

➜  IKnowKungFu git:(submodule_nightmare) ✗ git status
On branch submodule_nightmare
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   .gitmodules
    deleted:    Carthage/Checkouts/Nimble
    deleted:    Carthage/Checkouts/Quick

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   .gitignore
    modified:   bin/setup

他们我决定放弃整个分支(没有提交任何提交)。我该怎么做呢?

我试过

➜  IKnowKungFu git:(submodule_nightmare) ✗ git checkout master
M   .gitignore
M   .gitmodules
D   Carthage/Checkouts/Nimble
D   Carthage/Checkouts/Quick
M   bin/setup
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
➜  IKnowKungFu git:(master) ✗ git branch -D submodule_nightmare
Deleted branch submodule_nightmare (was 42e46fd).
➜  IKnowKungFu git:(master) ✗ git branch
* master
➜  IKnowKungFu git:(master) ✗ git branch --list
* master

这似乎完全删除了分支,但是当我尝试“从头重新创建它”时,git似乎仍然记得我所做的更改:

➜  IKnowKungFu git:(master) ✗ git checkout -b submodule_nightmare
M   .gitignore
M   .gitmodules
D   Carthage/Checkouts/Nimble
D   Carthage/Checkouts/Quick
M   bin/setup
Switched to a new branch 'submodule_nightmare'
➜  IKnowKungFu git:(submodule_nightmare) ✗ git diff
➜  IKnowKungFu git:(submodule_nightmare) ✗ git status
On branch submodule_nightmare
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   .gitmodules
    deleted:    Carthage/Checkouts/Nimble
    deleted:    Carthage/Checkouts/Quick

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   .gitignore
    modified:   bin/setup

为什么这样?

P.S。如果你想知道分支名称,git / Carthage最近给了我hard times ..

1 个答案:

答案 0 :(得分:1)

分支已正确删除,但未触及对工作目录的更改。在checkout回master时,submodule_nightmare分支中所做的更改实际上不会被还原/撤消,也不会再次重新创建submodule_nightmare分支。

这是因为您的两个分支是相同的提交,因此当您切换分支时,工作目录中没有要更改的文件。这是一个功能,允许您,例如,对master进行一些更改,决定应该在不同的分支上完成工作,然后使用git checkout -b newcode更改为该分支,而不必以任何方式保存您的更改

为了恢复对工作目录的跟踪文件所做的所有更改,需要运行像git reset --hard这样的破坏性命令(这会撤消你的工作,所以要小心)。可以使用git clean的一些参数清除未跟踪的文件(也是破坏性的,谨慎使用)。

如果您之间切换的两个分支在不同的提交上,并且对两个分支之间不同的文件进行了更改,那么如果您尝试切换分支而不告诉Git该做什么,则会导致错误。这是因为Git避免破坏你的工作,除非你告诉它,所以它会中止,直到你告诉它如何处理更改的文件。

作为一个例子,让我们说更新的Cartfile是在master中提交的,但现有的分支submodule_nightmare没有这个提交。然后对master中的Cartfile进行了一些更改但未提交。如果您尝试使用git checkout submodule_nightmare将分支切换到submodule_nightmare,则会出现以下错误:

error: Your local changes to the following files would be overwritten by checkout:
    Cartfile
Please, commit your changes or stash them before you can switch branches.
Aborting

Git清楚地告诉您,您需要以某种方式保存更改(提交或存储),或撤消它们(例如git checkout master Cartfile或手动编辑),然后才能切换。